From: Christian Garbs Date: Fri, 26 Dec 2008 22:52:53 +0000 (+0100) Subject: move RPC over HTTP calls to HTTPTalker.pm X-Git-Url: https://git.camperquake.de/gitweb.cgi?p=xmlrtorrent.git;a=commitdiff_plain;h=8d2a3eb8a869670b3b80896a687dbf733c671170 move RPC over HTTP calls to HTTPTalker.pm --- diff --git a/xmlrtorrent.pl b/xmlrtorrent.pl index 9d5a77d..12367cb 100644 --- a/xmlrtorrent.pl +++ b/xmlrtorrent.pl @@ -209,7 +209,7 @@ sub cmd_queue { $u = $torrentlist{$id}->{'URL'}; write_debug('Sending %s to rtorrent', $u); - unless(defined($rtorrent->load_start($u))) { + unless(defined($rtorrent->load_start($talker, $u))) { write_irssi('%%RError sending URL %s: %s', $u, $rtorrent->errstr()); } else { write_irssi('%s enqueued', $u); @@ -244,7 +244,7 @@ sub cmd_remote { my $rqueue; if (('list' eq $subcmd) or !defined($subcmd)) { - unless(defined($rqueue = $rtorrent->download_list())) { + unless(defined($rqueue = $rtorrent->download_list($talker))) { write_irssi('Error getting list of downloads: %s', $rtorrent->errstr()); return; } @@ -293,26 +293,17 @@ sub cmd_set { my $target = shift; my $key = shift; my $val = shift; + my $p; - if ('global' eq $target) { - if(exists($PARAMS->{$key})) { - $conf->{'xmlrtorrent'}->{$key} = $val; - if ('XMLURL' eq $key) { - unless(defined($rtorrent = xmlrtorrent->new( - 'XMLURL' => $conf->{'xmlrtorrent'}->{'XMLURL'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'USERNAME'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'PASSWORD'}))) { - write_irssi('Could not initialize XMLRPC instance'); - return; - } - } - } else { - write_irssi('Key %s does not exist', $key); + foreach $p (@talkers) { + if ($p->{'NAME'} eq $target) { + $p->setval($key, $val); + return; } } + write_irssi(undef, 'No such module'); } - sub cmd_show { my $target = shift; my $p; @@ -468,10 +459,7 @@ sub init_xmlrtorrent { %torrentlist = map { my $a = substr($_, 1); ("$a" => $torrentlist{$_}) } keys(%torrentlist); $torrentindex = max(keys(%torrentlist)) + 1; - unless(defined($rtorrent = xmlrtorrent->new( - 'XMLURL' => $conf->{'xmlrtorrent'}->{'XMLURL'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'USERNAME'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'PASSWORD'}))) { + unless(defined($rtorrent = xmlrtorrent->new())) { write_irssi('Could not initialize XMLRPC instance'); return; } diff --git a/xmlrtorrent.pm b/xmlrtorrent.pm index b1c41b9..d50d5ac 100644 --- a/xmlrtorrent.pm +++ b/xmlrtorrent.pm @@ -1,33 +1,22 @@ package xmlrtorrent; use strict; -use RPC::XML; -use RPC::XML::Client; use Data::Dumper; sub new { my $class = shift; my $self = {@_}; - unless(exists($self->{'XMLURL'}) and defined($self->{'XMLURL'})) { - return undef; - } - - $self->{'__RPCClient'} = RPC::XML::Client->new($self->{'XMLURL'}); - if ((exists($self->{'USERNAME'}) and exists($self->{'PASSWORD'})) and - ($self->{'USERNAME'} ne '')) { - $self->{'__RPCClient'}->credentials('', $self->{'USERNAME'}, $self->{'PASSWORD'}); - } - return bless($self, $class); } -sub load_start{ +sub load_start { my $self = shift; + my $talker = shift; my $URL = shift; my $res; - $res = $self->{'__RPCClient'}->send_request('load_start', $URL); + $res = $talker->send_request('load_start', $URL); unless(ref($res)) { $self->{'__ERROR'} = $res; return undef @@ -43,9 +32,10 @@ sub load_start{ sub download_list { my $self = shift; + my $talker = shift; my $res; - $res = $self->{'__RPCClient'}->send_request('d.multicall', '', + $res = $talker->send_request('d.multicall', '', 'd.get_name=', 'd.get_size_bytes=', 'd.get_bytes_done=', diff --git a/xmlrtorrent/Base.pm b/xmlrtorrent/Base.pm index 9ee8222..e85b517 100644 --- a/xmlrtorrent/Base.pm +++ b/xmlrtorrent/Base.pm @@ -54,8 +54,6 @@ sub _prepare_parameters { my $self = shift; my $p; - $self->{'_CONFIG'} = {'option' => {'enabled' => {'content' => '1'}}}; - foreach $p (keys(%{$self->{'_PARAMS'}})) { $self->{'_CONFIG'}->{'option'}->{$p}->{'content'} = $self->{'_PARAMS'}->{$p}->[0]; } diff --git a/xmlrtorrent/HTTPTalker.pm b/xmlrtorrent/HTTPTalker.pm index bab2209..4eb6a8d 100644 --- a/xmlrtorrent/HTTPTalker.pm +++ b/xmlrtorrent/HTTPTalker.pm @@ -8,7 +8,7 @@ use xmlrtorrent::TalkerBase; @ISA = qw(xmlrtorrent::TalkerBase); use Data::Dumper; - +use RPC::XML::Client; use strict; sub new { @@ -17,6 +17,12 @@ sub new { $self->{'NAME'} = 'http'; $self->{'DESC'} = 'talker using RPC over HTTP'; + $self->{'_PARAMS'} = { + 'XMLURL' => ['', 'URL of SCGI script'], + 'USERNAME' => ['', 'username for RPC credentials (optional)'], + 'PASSWORD' => ['', 'password for RPC credentials (optional)'], + }; + $self->{'_LASTXMLURL'} = undef; bless($self, $class); @@ -25,4 +31,26 @@ sub new { return $self; } +sub send_request { + my $self = shift; + my @params = @_; + + unless (exists($self->{'XMLURL'}) and defined($self->{'XMLURL'})) { + return 'http talker: XMLURL not set'; + } + + if ($self->{'XMLURL'} ne $self->{'_LASTXMLURL'}) { + $self->{'_LASTXMLURL'} = $self->{'XMLURL'}; + $self->{'__RPCClient'} = RPC::XML::Client->new($self->{'XMLURL'}); + } + + if ((exists($self->{'USERNAME'}) and exists($self->{'PASSWORD'})) and + ($self->{'USERNAME'} ne '')) { + # mitch: let me guess, the realm must be configurable, too! + $self->{'__RPCClient'}->credentials('', $self->{'USERNAME'}, $self->{'PASSWORD'}); + } + + return $self->{'__RPCClient'}->send_request(@params); +} + 1;