| 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 | |||||||