]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/perl/lib/OpenSRF/Transport/SlimJabber/Client.pm
2db8be74a8425f9cdb53015a57f63b3513d52e7f
[OpenSRF.git] / src / perl / lib / OpenSRF / Transport / SlimJabber / Client.pm
1 package OpenSRF::Transport::SlimJabber::Client;
2
3 use strict;
4 use warnings;
5
6 use OpenSRF::EX;
7 use OpenSRF::Utils::Config;
8 use OpenSRF::Utils::Logger qw/$logger/;
9 use OpenSRF::Transport::SlimJabber::XMPPReader;
10 use OpenSRF::Transport::SlimJabber::XMPPMessage;
11 use IO::Socket::INET;
12
13 =head1 NAME
14
15 OpenSRF::Transport::SlimJabber::Client
16
17 =head1 SYNOPSIS
18
19
20
21 =head1 DESCRIPTION
22
23
24
25 =cut
26
27 =head1 METHODS
28
29 =head2 new
30
31 =cut
32
33 sub new {
34         my( $class, %params ) = @_;
35     my $self = bless({}, ref($class) || $class);
36     $self->params(\%params);
37         return $self;
38 }
39
40 =head2 reader
41
42 =cut
43
44 sub reader {
45     my($self, $reader) = @_;
46     $self->{reader} = $reader if $reader;
47     return $self->{reader};
48 }
49
50 =head2 params
51
52 =cut
53
54 sub params {
55     my($self, $params) = @_;
56     $self->{params} = $params if $params;
57     return $self->{params};
58 }
59
60 =head2 socket
61
62 =cut
63
64 sub socket {
65     my($self, $socket) = @_;
66     $self->{socket} = $socket if $socket;
67     return $self->{socket};
68 }
69
70 =head2 disconnect
71
72 =cut
73
74 sub disconnect {
75     my $self = shift;
76         $self->reader->disconnect if $self->reader;
77 }
78
79
80 =head2 gather
81
82 =cut
83
84 sub gather { 
85     my $self = shift; 
86     $self->process( 0 ); 
87 }
88
89 # -------------------------------------------------
90
91 =head2 tcp_connected
92
93 =cut
94
95 sub tcp_connected {
96         my $self = shift;
97     return $self->reader->tcp_connected if $self->reader;
98     return 0;
99 }
100
101
102
103 =head2 send
104
105 =cut
106
107 sub send {
108         my $self = shift;
109     my $msg = OpenSRF::Transport::SlimJabber::XMPPMessage->new(@_);
110     $msg->osrf_xid($logger->get_osrf_xid);
111     $msg->from($self->xmpp_id);
112     $self->reader->send($msg->to_xml);
113 }
114
115 =head2 initialize
116
117 =cut
118
119 sub initialize {
120
121         my $self = shift;
122
123         my $host        = $self->params->{host}; 
124         my $port        = $self->params->{port}; 
125         my $username    = $self->params->{username};
126         my $resource    = $self->params->{resource};
127         my $password    = $self->params->{password};
128
129         my $conf = OpenSRF::Utils::Config->current;
130
131         my $tail = "_$$";
132         $tail = "" if !$conf->bootstrap->router_name and $username eq "router";
133     $resource = "$resource$tail";
134
135     my $socket = IO::Socket::INET->new(
136         PeerHost => $host,
137         PeerPort => int($port),
138         Proto  => 'tcp' );
139
140     throw OpenSRF::EX::Jabber("Could not open TCP socket to Jabber server: $@")
141             unless ( $socket and $socket->connected );
142
143     $self->socket($socket);
144     $self->reader(OpenSRF::Transport::SlimJabber::XMPPReader->new($socket));
145     $self->reader->connect($host, $username, $password, $resource);
146
147     throw OpenSRF::EX::Jabber("Could not authenticate with Jabber server: $@")
148             unless ( $self->reader->connected );
149
150     $self->xmpp_id("$username\@$host/$resource");
151     $logger->debug("Created XMPP connection " . $self->xmpp_id);
152         return $self;
153 }
154
155
156 # Our full login:  username@host/resource
157 sub xmpp_id {
158     my($self, $xmpp_id) = @_;
159     $self->{xmpp_id} = $xmpp_id if $xmpp_id;
160     return $self->{xmpp_id};
161 }
162
163
164 =head2 construct
165
166 =cut
167
168 sub construct {
169         my( $class, $app ) = @_;
170         $class->peer_handle($class->new( $app )->initialize());
171 }
172
173
174 =head2 process
175
176 =cut
177
178 sub process {
179         my($self, $timeout) = @_;
180
181         $timeout ||= 0;
182     $timeout = int($timeout);
183
184         unless( $self->reader and $self->reader->connected ) {
185         throw OpenSRF::EX::JabberDisconnected 
186             ("This JabberClient instance is no longer connected to the server ");
187         }
188
189     return $self->reader->wait_msg($timeout);
190 }
191
192
193 =head2 flush_socket
194
195 Sets the socket to O_NONBLOCK, reads all of the data off of the
196 socket, the restores the sockets flags.  Returns 1 on success, 0 if
197 the socket isn't connected.
198
199 =cut
200
201 sub flush_socket {
202         my $self = shift;
203     return $self->reader->flush_socket;
204 }
205
206 1;
207
208