PageRenderTime 55ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/src/perl/lib/OpenSRF/Transport/SlimJabber/Client.pm

https://gitlab.com/evergreen-bjwebb/opensrf-debian
Perl | 208 lines | 138 code | 68 blank | 2 comment | 8 complexity | 54050573b9338248a96be52137d813fa MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. package OpenSRF::Transport::SlimJabber::Client;
  2. use strict;
  3. use warnings;
  4. use OpenSRF::EX;
  5. use OpenSRF::Utils::Config;
  6. use OpenSRF::Utils::Logger qw/$logger/;
  7. use OpenSRF::Transport::SlimJabber::XMPPReader;
  8. use OpenSRF::Transport::SlimJabber::XMPPMessage;
  9. use IO::Socket::INET;
  10. =head1 NAME
  11. OpenSRF::Transport::SlimJabber::Client
  12. =head1 SYNOPSIS
  13. =head1 DESCRIPTION
  14. =cut
  15. =head1 METHODS
  16. =head2 new
  17. =cut
  18. sub new {
  19. my( $class, %params ) = @_;
  20. my $self = bless({}, ref($class) || $class);
  21. $self->params(\%params);
  22. return $self;
  23. }
  24. =head2 reader
  25. =cut
  26. sub reader {
  27. my($self, $reader) = @_;
  28. $self->{reader} = $reader if $reader;
  29. return $self->{reader};
  30. }
  31. =head2 params
  32. =cut
  33. sub params {
  34. my($self, $params) = @_;
  35. $self->{params} = $params if $params;
  36. return $self->{params};
  37. }
  38. =head2 socket
  39. =cut
  40. sub socket {
  41. my($self, $socket) = @_;
  42. $self->{socket} = $socket if $socket;
  43. return $self->{socket};
  44. }
  45. =head2 disconnect
  46. =cut
  47. sub disconnect {
  48. my $self = shift;
  49. $self->reader->disconnect if $self->reader;
  50. }
  51. =head2 gather
  52. =cut
  53. sub gather {
  54. my $self = shift;
  55. $self->process( 0 );
  56. }
  57. # -------------------------------------------------
  58. =head2 tcp_connected
  59. =cut
  60. sub tcp_connected {
  61. my $self = shift;
  62. return $self->reader->tcp_connected if $self->reader;
  63. return 0;
  64. }
  65. =head2 send
  66. =cut
  67. sub send {
  68. my $self = shift;
  69. my $msg = OpenSRF::Transport::SlimJabber::XMPPMessage->new(@_);
  70. $msg->osrf_xid($logger->get_osrf_xid);
  71. $msg->from($self->xmpp_id);
  72. $self->reader->send($msg->to_xml);
  73. }
  74. =head2 initialize
  75. =cut
  76. sub initialize {
  77. my $self = shift;
  78. my $host = $self->params->{host};
  79. my $port = $self->params->{port};
  80. my $username = $self->params->{username};
  81. my $resource = $self->params->{resource};
  82. my $password = $self->params->{password};
  83. my $conf = OpenSRF::Utils::Config->current;
  84. my $tail = "_$$";
  85. $tail = "" if !$conf->bootstrap->router_name and $username eq "router";
  86. $resource = "$resource$tail";
  87. my $socket = IO::Socket::INET->new(
  88. PeerHost => $host,
  89. PeerPort => int($port),
  90. Proto => 'tcp' );
  91. throw OpenSRF::EX::Jabber("Could not open TCP socket to Jabber server: $@")
  92. unless ( $socket and $socket->connected );
  93. $self->socket($socket);
  94. $self->reader(OpenSRF::Transport::SlimJabber::XMPPReader->new($socket));
  95. $self->reader->connect($host, $username, $password, $resource);
  96. throw OpenSRF::EX::Jabber("Could not authenticate with Jabber server: $@")
  97. unless ( $self->reader->connected );
  98. $self->xmpp_id("$username\@$host/$resource");
  99. $logger->debug("Created XMPP connection " . $self->xmpp_id);
  100. return $self;
  101. }
  102. # Our full login: username@host/resource
  103. sub xmpp_id {
  104. my($self, $xmpp_id) = @_;
  105. $self->{xmpp_id} = $xmpp_id if $xmpp_id;
  106. return $self->{xmpp_id};
  107. }
  108. =head2 construct
  109. =cut
  110. sub construct {
  111. my( $class, $app ) = @_;
  112. $class->peer_handle($class->new( $app )->initialize());
  113. }
  114. =head2 process
  115. =cut
  116. sub process {
  117. my($self, $timeout) = @_;
  118. $timeout ||= 0;
  119. $timeout = int($timeout);
  120. unless( $self->reader and $self->reader->connected ) {
  121. throw OpenSRF::EX::JabberDisconnected
  122. ("This JabberClient instance is no longer connected to the server ");
  123. }
  124. return $self->reader->wait_msg($timeout);
  125. }
  126. =head2 flush_socket
  127. Sets the socket to O_NONBLOCK, reads all of the data off of the
  128. socket, the restores the sockets flags. Returns 1 on success, 0 if
  129. the socket isn't connected.
  130. =cut
  131. sub flush_socket {
  132. my $self = shift;
  133. return $self->reader->flush_socket;
  134. }
  135. 1;