]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/perl/lib/OpenSRF/Transport/SlimJabber/Client.pm
a3f92330c2d05db408f6f0e7b5571f94d9c0f8eb
[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     my $xml = $msg->to_xml;
113     { 
114         use bytes; 
115         my $len = length($xml);
116         if ($len >= $self->{msg_size_warn}) {
117             $logger->warn("Sending large message of $len bytes to " . $msg->to)
118         }
119     }
120     $self->reader->send($xml);
121 }
122
123 =head2 initialize
124
125 =cut
126
127 sub initialize {
128
129         my $self = shift;
130
131         my $host        = $self->params->{host}; 
132         my $port        = $self->params->{port}; 
133         my $username    = $self->params->{username};
134         my $resource    = $self->params->{resource};
135         my $password    = $self->params->{password};
136
137         my $conf = OpenSRF::Utils::Config->current;
138
139     $self->{msg_size_warn} = $conf->bootstrap->msg_size_warn || 1800000;
140
141         my $tail = "_$$";
142         $tail = "" if !$conf->bootstrap->router_name and $username eq "router";
143     $resource = "$resource$tail";
144
145     my $socket = IO::Socket::INET->new(
146         PeerHost => $host,
147         PeerPort => int($port),
148         Proto  => 'tcp' );
149
150     throw OpenSRF::EX::Jabber("Could not open TCP socket to Jabber server: $@")
151             unless ( $socket and $socket->connected );
152
153     $self->socket($socket);
154     $self->reader(OpenSRF::Transport::SlimJabber::XMPPReader->new($socket));
155     $self->reader->connect($host, $username, $password, $resource);
156
157     throw OpenSRF::EX::Jabber("Could not authenticate with Jabber server: $@")
158             unless ( $self->reader->connected );
159
160     $self->xmpp_id("$username\@$host/$resource");
161     $logger->debug("Created XMPP connection " . $self->xmpp_id);
162         return $self;
163 }
164
165
166 # Our full login:  username@host/resource
167 sub xmpp_id {
168     my($self, $xmpp_id) = @_;
169     $self->{xmpp_id} = $xmpp_id if $xmpp_id;
170     return $self->{xmpp_id};
171 }
172
173
174 =head2 construct
175
176 =cut
177
178 sub construct {
179         my( $class, $app ) = @_;
180         $class->peer_handle($class->new( $app )->initialize());
181 }
182
183
184 =head2 process
185
186 =cut
187
188 sub process {
189         my($self, $timeout) = @_;
190
191         $timeout ||= 0;
192     $timeout = int($timeout);
193
194         unless( $self->reader and $self->reader->connected ) {
195         throw OpenSRF::EX::JabberDisconnected 
196             ("This JabberClient instance is no longer connected to the server ");
197         }
198
199     return $self->reader->wait_msg($timeout);
200 }
201
202
203 =head2 flush_socket
204
205 Sets the socket to O_NONBLOCK, reads all of the data off of the
206 socket, the restores the sockets flags.  Returns 1 on success, 0 if
207 the socket isn't connected.
208
209 =cut
210
211 sub flush_socket {
212         my $self = shift;
213     return $self->reader->flush_socket;
214 }
215
216 1;
217
218