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