]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/perlmods/OpenSRF/Transport/SlimJabber/Client.pm
This patch replaces the regex-based XML stream parsing mechanism with an XML::Parser...
[OpenSRF.git] / src / perlmods / OpenSRF / Transport / SlimJabber / Client.pm
1 package OpenSRF::Transport::SlimJabber::Client;
2 use strict; use warnings;
3 use OpenSRF::EX;
4 use OpenSRF::Utils::Config;
5 use OpenSRF::Utils::Logger qw/$logger/;
6 use OpenSRF::Transport::SlimJabber::XMPPReader;
7 use OpenSRF::Transport::SlimJabber::XMPPMessage;
8 use IO::Socket::UNIX;
9 use FreezeThaw qw/freeze/;
10
11 sub DESTROY{
12     shift()->disconnect;
13 }
14
15 sub new {
16         my( $class, %params ) = @_;
17     my $self = bless({}, ref($class) || $class);
18     $self->params(\%params);
19         return $self;
20 }
21
22
23 sub reader {
24     my($self, $reader) = @_;
25     $self->{reader} = $reader if $reader;
26     return $self->{reader};
27 }
28
29 sub params {
30     my($self, $params) = @_;
31     $self->{params} = $params if $params;
32     return $self->{params};
33 }
34
35 sub socket {
36     my($self, $socket) = @_;
37     $self->{socket} = $socket if $socket;
38     return $self->{socket};
39 }
40
41 sub disconnect {
42     my $self = shift;
43         $self->reader->disconnect if $self->reader;
44 }
45
46
47 sub gather { 
48     my $self = shift; 
49     $self->process( 0 ); 
50 }
51
52 # -------------------------------------------------
53
54 sub tcp_connected {
55         my $self = shift;
56     return $self->reader->tcp_connected if $self->reader;
57     return 0;
58 }
59
60
61
62 sub send {
63         my $self = shift;
64     my $msg = OpenSRF::Transport::SlimJabber::XMPPMessage->new(@_);
65     $self->reader->send($msg->to_xml);
66 }
67
68 sub initialize {
69
70         my $self = shift;
71
72         my $host        = $self->params->{host}; 
73         my $port        = $self->params->{port}; 
74         my $username    = $self->params->{username};
75         my $resource    = $self->params->{resource};
76         my $password    = $self->params->{password};
77
78     my $jid = "$username\@$host/$resource";
79
80         my $conf = OpenSRF::Utils::Config->current;
81
82         my $tail = "_$$";
83         $tail = "" if !$conf->bootstrap->router_name and $username eq "router";
84     $resource = "$resource$tail";
85
86     my $socket = IO::Socket::INET->new(
87         PeerHost => $host,
88         PeerPort => $port,
89         Peer => $port,
90         Proto  => 'tcp' );
91
92     throw OpenSRF::EX::Jabber("Could not open TCP socket to Jabber server: $!")
93             unless ( $socket and $socket->connected );
94
95     $self->socket($socket);
96     $self->reader(OpenSRF::Transport::SlimJabber::XMPPReader->new($socket));
97     $self->reader->connect($host, $username, $password, $resource);
98
99     throw OpenSRF::EX::Jabber("Could not authenticate with Jabber server: $!")
100             unless ( $self->reader->connected );
101
102         return $self;
103 }
104
105
106 sub construct {
107         my( $class, $app ) = @_;
108         $class->peer_handle($class->new( $app )->initialize());
109 }
110
111
112 sub process {
113         my($self, $timeout) = @_;
114
115         $timeout ||= 0;
116     $timeout = int($timeout);
117
118         unless( $self->reader and $self->reader->connected ) {
119         throw OpenSRF::EX::JabberDisconnected 
120             ("This JabberClient instance is no longer connected to the server ");
121         }
122
123     return $self->reader->wait_msg($timeout);
124 }
125
126
127 # --------------------------------------------------------------
128 # Sets the socket to O_NONBLOCK, reads all of the data off of
129 # the socket, the restores the sockets flags
130 # Returns 1 on success, 0 if the socket isn't connected
131 # --------------------------------------------------------------
132 sub flush_socket {
133         my $self = shift;
134     return $self->reader->flush_socket;
135 }
136
137 1;
138
139