- Handle autosave on module unload/irssi exit
[xmlrtorrent.git] / xmlrtorrent / SocketTalker.pm
index 453b7f6..a28f141 100644 (file)
@@ -4,10 +4,11 @@
 # licensed under GNU GPL v2
 
 package xmlrtorrent::SocketTalker;
-use xmlrtorrent::TalkerBase;
-@ISA = qw(xmlrtorrent::TalkerBase);
+use xmlrtorrent::RTorrentTalkerBase;
+@ISA = qw(xmlrtorrent::RTorrentTalkerBase);
 
 use RPC::XML;
+use RPC::XML::Parser;
 use IO::Socket::UNIX;
 use strict;
 
@@ -18,8 +19,9 @@ sub new {
     $self->{'NAME'} = 'socket';
     $self->{'DESC'} = 'talker using SCGI over Unix Domain Socket';
     $self->{'_PARAMS'} = {
-       'SOCKET' => ['', 'filename of socket'],
+        'SOCKET' => ['', 'filename of socket'],
     };
+    $self->{'__RPCXMLPARSER'} = RPC::XML::Parser->new();
 
     bless($self, $class);
 
@@ -43,48 +45,50 @@ sub _create_scgi_header($$$) {
 
 sub send_request {
     my $self = shift;
-    my @params = @_;
+    my (@params) = (@_);
 
-    unless (exists($self->{'_PARAMS'}->{'SOCKET'}) and defined($self->{'_PARAMS'}->{'SOCKET'}) and ($self->{'_PARAMS'}->{'SOCKET'} ne '')) {
-       return 'socket talker: SOCKET not set';
+    my $socketfile = $self->_getval('SOCKET');
+
+    unless (defined $socketfile and $socketfile ne '') {
+        return 'socket talker: SOCKET not set';
     }
 
     # prepare socket
     my $socket = IO::Socket::UNIX->new(
-                                      'Type' => SOCK_STREAM,
-                                      'Local' => $self->{'_PARAMS'}->{'SOCKET'},
-                                      )
-       or return "socket: cannot connect to SOCKET: $!";
+                       'Type' => SOCK_STREAM,
+                        'Peer' => $socketfile,
+                        )
+        or return "socket talker: cannot connect to SOCKET: $!";
     $socket->autoflush(1);  # default since 1.18, but be sure
 
     # prepare XML RPC request
-    my $rpc_request = RPC::XML::request->new(@params);
+    my $rpc_request = RPC::XML::request->new(@params)->as_string();
 
     # prpepare SCGI request
     my $scgi_request = 
-       $self->_create_netstring(
-                                $self->_create_scgi_header('CONTENT_LENGTH', length $rpc_request)
-                                .
-                                $self->_create_scgi_header('SCGI', '1')
-                                )
-       .
-       $rpc_request;
+        $self->_create_netstring(
+                    $self->_create_scgi_header('CONTENT_LENGTH', length $rpc_request)
+                    .
+                    $self->_create_scgi_header('SCGI', '1')
+                    )
+        .
+        $rpc_request;
     
     # write to socket
     $socket->print($scgi_request);
     
     # read from socket
     while (my $line = <$socket>) {
-       last if ($line =~ /^$/);  # munch headers
+        last if ($line =~ /^\s*$/);  # munch headers
     }
     my $ret = '';
     while (my $line = <$socket>) {
-       $ret .= $line;
+        $ret .= $line;
     }
 
-    $socket->close();
+    $socket->close() or return "socket talker: cannot close SOCKET: $!";
 
-    return $ret;
+    return $self->{'__RPCXMLPARSER'}->parse($ret);
 }
 
 1;