ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/Net-XMPP2/lib/Net/XMPP2/Connection.pm
Revision: 1.35
Committed: Tue Jul 24 12:31:15 2007 UTC (19 years, 3 months ago) by elmex
Branch: MAIN
Changes since 1.34: +1 -4 lines
Log Message:
documentation update

File Contents

# Content
1 package Net::XMPP2::Connection;
2 use strict;
3 use AnyEvent;
4 use IO::Socket::INET;
5 use Net::XMPP2::Parser;
6 use Net::XMPP2::Writer;
7 use Net::XMPP2::Util qw/split_jid/;
8 use Net::XMPP2::Event;
9 use Net::XMPP2::SimpleConnection;
10 use Net::XMPP2::Namespaces qw/xmpp_ns/;
11 use Net::XMPP2::Extendable;
12 use Net::XMPP2::Error;
13 use Net::DNS;
14
15 our @ISA = qw/Net::XMPP2::SimpleConnection Net::XMPP2::Event Net::XMPP2::Extendable/;
16
17 =head1 NAME
18
19 Net::XMPP2::Connection - XML stream that implements the XMPP RFC 3920.
20
21 =head1 SYNOPSIS
22
23 use Net::XMPP2::Connection;
24
25 my $con =
26 Net::XMPP2::Connection->new (
27 username => "abc",
28 domain => "jabber.org",
29 resource => "Net::XMPP2"
30 );
31
32 $con->connect or die "Couldn't connect to jabber.org: $!";
33 $con->init;
34 $con->reg_cb (stream_ready => sub { print "XMPP stream ready!\n" });
35
36 =head1 DESCRIPTION
37
38 This module represents a XMPP stream as described in RFC 3920. You can issue the basic
39 XMPP XML stanzas with methods like C<send_iq>, C<send_message> and C<send_presence>.
40
41 And receive events with the C<reg_cb> event framework from the connection.
42
43 If you need instant messaging stuff please take a look at C<Net::XMPP2::IM::Connection>.
44
45 =head1 METHODS
46
47 =over 4
48
49 =item B<new (%args)>
50
51 Following arguments can be passed in C<%args>:
52
53 =over 4
54
55 =item language => $tag
56
57 This should be the language of the human readable contents that
58 will be transmitted over the stream. The default will be 'en'.
59
60 Please look in RFC 3066 how C<$tag> should look like.
61
62 =item jid => $jid
63
64 This can be used to set the settings C<username>, C<domain>
65 (and optionally C<resource>) from a C<$jid>.
66
67 =item resource => $resource
68
69 If this argument is given C<$resource> will be passed as desired
70 resource on resource binding.
71
72 Note: You have to take care that the stringprep profile for
73 resources can be applied at: C<$resource>. Otherwise the server
74 might signal an error. See L<Net::XMPP2::Util> for utility functions
75 to check this.
76
77 =item domain => $domain
78
79 This is the destination host we are going to connect to.
80 As the connection won't be automatically connected use C<connect>
81 to initiate the connect.
82
83 Note: A SRV RR lookup will be performed to discover the real hostname
84 and port to connect to. See also C<connect>.
85
86 =item override_host => $host
87 =item override_port => $port
88
89 This will be used as override to connect to.
90
91 =item port => $port
92
93 This is optional, the default port is 5222.
94
95 Note: A SRV RR lookup will be performed to discover the real hostname
96 and port to connect to. See also C<connect>.
97
98 =item username => $username
99
100 This is your C<$username> (the userpart in the JID);
101
102 Note: You have to take care that the stringprep profile for
103 nodes can be applied at: C<$username>. Otherwise the server
104 might signal an error. See L<Net::XMPP2::Util> for utility functions
105 to check this.
106
107 =item password => $password
108
109 This is the password for the C<username> above.
110
111 =item disable_ssl => $bool
112
113 If C<$bool> is true no SSL will be used.
114
115 =back
116
117 =cut
118
119 sub new {
120 my $this = shift;
121 my $class = ref($this) || $this;
122 my $self =
123 $class->SUPER::new (
124 language => 'en',
125 stream_namespace => 'client',
126 @_
127 );
128
129 $self->{parser} = new Net::XMPP2::Parser;
130 $self->{writer} = Net::XMPP2::Writer->new (
131 write_cb => sub { $self->write_data ($_[0]) },
132 send_iq_cb => sub { $self->event (send_iq_hook => @_) },
133 send_msg_cb => sub { $self->event (send_message_hook => @_) },
134 send_pres_cb => sub { $self->event (send_presence_hook => @_) },
135 );
136
137 $self->{parser}->set_stanza_cb (sub {
138 $self->handle_stanza (@_);
139 });
140 $self->{parser}->set_error_cb (sub {
141 my ($ex, $data, $type) = @_;
142 if ($type eq 'xml') {
143 my $pe = Net::XMPP2::Error::Parser->new (exception => $_[0], data => $_[1]);
144 $self->event (xml_parser_error => $pe);
145 $self->disconnect ("xml error: $_[0], $_[1]");
146 } else {
147 my $pe = Net::XMPP2::Error->new (
148 text => "uncaught exception in stanza handling: $ex"
149 );
150 $self->event (uncaught_exception_error => $pe);
151 $self->disconnect ($pe->string);
152 }
153 });
154
155 $self->{iq_id} = 1;
156 $self->{default_iq_timeout} = 60;
157
158 $self->{disconnect_cb} = sub {
159 my ($host, $port, $message) = @_;
160 delete $self->{authenticated};
161 delete $self->{ssl_enabled};
162 $self->event (disconnect => $host, $port, $message);
163 };
164
165 if ($self->{jid}) {
166 my ($user, $host, $res) = split_jid ($self->{jid});
167 $self->{username} = $user;
168 $self->{domain} = $host;
169 $self->{resource} = $res if defined $res;
170 }
171
172 my $proxy_cb = sub {
173 my ($self, $er) = @_;
174 $self->event (error => $er);
175 };
176
177 $self->reg_cb (
178 xml_parser_error => $proxy_cb,
179 sasl_error => $proxy_cb,
180 stream_error => $proxy_cb,
181 bind_error => $proxy_cb,
182 iq_result_cb_exception => sub {
183 my ($self, $ex) = @_;
184 $self->event (error =>
185 Net::XMPP2::Error::Exception->new (
186 exception => $ex, context => 'iq result callback execution'
187 )
188 );
189 },
190 tls_error => sub {
191 my ($self) = @_;
192 $self->event (error =>
193 Net::XMPP2::Error->new (text => 'tls_error: tls negotiation failed')
194 );
195 },
196 );
197
198 return $self;
199 }
200
201 =item B<connect ($no_srv_rr)>
202
203 Try to connect to the domain and port passed in C<new>.
204
205 A SRV RR lookup will be performed on the domain to discover
206 the host and port to use. If you don't want this set C<$no_srv_rr>
207 to a true value. C<$no_srv_rr> is false by default.
208
209 As the SRV RR lookup might return multiple host and you fail to
210 connect to one you might just call this function again to try a
211 different host.
212
213 If C<connect> was successful and we connected a true value is returned.
214 If the connect was unsuccessful undef is returned and C<$!> will be set
215 to the error that occured while connecting.
216
217 If you want to know whether further connection attempts might be more
218 successful (as SRV RR lookup may return multiple hosts) call C<may_try_connect>
219 (see also C<may_try_connect>).
220
221 Note that an internal list will be kept of tried hosts. Use
222 C<reset_connect_tries> to reset the internal list of tried hosts.
223
224 =cut
225
226 sub connect {
227 my ($self, $no_srv_rr) = @_;
228
229 my ($host, $port) = ($self->{domain}, $self->{port} || 5222);
230 if ($self->{override_host}) {
231 $host = $self->{override_host};
232 $port = $self->{override_port} if defined $self->{override_port};
233
234 } else {
235 unless ($no_srv_rr) {
236 my $res = Net::DNS::Resolver->new;
237 my $p = $res->query ('_xmpp-client._tcp.'.$host, 'SRV');
238 if ($p) {
239 my @srvs = grep { $_->type eq 'SRV' } $p->answer;
240 if (@srvs) {
241 @srvs = sort { $a->priority <=> $b->priority } @srvs;
242 @srvs = sort { $b->weight <=> $a->weight } @srvs; # TODO
243 $port = $srvs[0]->port;
244 $host = $srvs[0]->target;
245 }
246 }
247 }
248 }
249
250 if ($self->SUPER::connect ($host, $port)) {
251 $self->event (connect => $host, $port);
252 return 1;
253 } else {
254 return undef;
255 }
256 }
257
258 =item B<may_try_connect>
259
260 Returns the number of left alternatives of hosts to connect to for the
261 domain passed to C<new>.
262
263 An internal list of tried hosts will be managed by C<connect> and those
264 hosts will be ignored by a SRV RR lookup (which will be done if you
265 call this function).
266
267 Use C<reset_connect_tries> to reset the internal list of tried hosts.
268
269 =cut
270
271 sub may_try_connect {
272 # TODO
273 }
274
275 =item B<reset_connect_tries>
276
277 This function resets the internal list of tried hosts for C<connect>.
278 See also C<connect>.
279
280 =cut
281
282 sub reset_connect_tries {
283 # TODO
284 }
285
286 sub handle_data {
287 my ($self, $buf) = @_;
288 $self->event (debug_recv => $$buf);
289 $self->{parser}->feed (substr $$buf, 0, (length $$buf), '');
290 }
291
292 sub debug_wrote_data {
293 my ($self, $data) = @_;
294 $self->event (debug_send => $data);
295 }
296
297 sub write_data {
298 my ($self, $data) = @_;
299 $self->SUPER::write_data ($data);
300 }
301
302 sub handle_stanza {
303 my ($self, $p, $node) = @_;
304
305 if (not defined $node) { # got stream end
306 $self->disconnect ("end of 'XML' stream encountered");
307 return;
308 }
309
310 $self->event (recv_stanza_xml => $node);
311
312 if ($node->eq (stream => 'features')) {
313 $self->event (stream_features => $node);
314 $self->{features} = $node;
315 $self->handle_stream_features ($node);
316
317 } elsif ($node->eq (tls => 'proceed')) {
318 $self->enable_ssl;
319 $self->{parser}->init;
320 $self->{writer}->init;
321 $self->{writer}->send_init_stream (
322 $self->{language}, $self->{domain}, $self->{stream_namespace}
323 );
324
325 } elsif ($node->eq (tls => 'failure')) {
326 $self->event ('tls_error');
327 $self->disconnect ('TLS failure on TLS negotiation.');
328
329 } elsif ($node->eq (sasl => 'challenge')) {
330 $self->handle_sasl_challenge ($node);
331
332 } elsif ($node->eq (sasl => 'success')) {
333 $self->handle_sasl_success ($node);
334
335 } elsif ($node->eq (sasl => 'failure')) {
336 my $error = Net::XMPP2::Error::SASL->new (node => $node);
337 $self->event (sasl_error => $error);
338 $self->disconnect ('SASL authentication failure: ' . $error->string);
339
340 } elsif ($node->eq (client => 'iq')) {
341 $self->event (iq_xml => $node);
342 $self->handle_iq ($node);
343
344 } elsif ($node->eq (client => 'message')) {
345 $self->event (message_xml => $node);
346
347 } elsif ($node->eq (client => 'presence')) {
348 $self->event (presence_xml => $node);
349
350 } elsif ($node->eq (stream => 'error')) {
351 $self->handle_error ($node);
352 }
353 }
354
355 =item B<init ()>
356
357 Initiate the XML stream.
358
359 =cut
360
361 sub init {
362 my ($self) = @_;
363 $self->{writer}->send_init_stream ($self->{language}, $self->{domain}, $self->{stream_namespace});
364 }
365
366 =item B<is_connected ()>
367
368 Returns true if the connection is still connected and stanzas can be
369 sent.
370
371 =cut
372
373 sub is_connected {
374 my ($self) = @_;
375 $self->{authenticated}
376 }
377
378 =item B<set_default_iq_timeout ($seconds)>
379
380 This sets the default timeout for IQ requests. If the timeout runs out
381 the request will be aborted and the callback called with a L<Net::XMPP2::Error::IQ> object
382 where the C<condition> method returns a special value (see also C<condition> method of L<Net::XMPP2::Error::IQ>).
383
384 The default timeout for IQ is 60 seconds.
385
386 =cut
387
388 sub set_default_iq_timeout {
389 my ($self, $sec) = @_;
390 $self->{default_iq_timeout} = $sec;
391 }
392
393 =item B<send_iq ($type, $create_cb, $result_cb, %attrs)>
394
395 This method sends an IQ XMPP request.
396
397 Please take a look at the documentation for C<send_iq> in Net::XMPP2::Writer
398 about the meaning of C<$type>, C<$create_cb> and C<%attrs> (with the exception
399 of the 'timeout' key of C<%attrs>, see below).
400
401 C<$result_cb> will be called when a result was received or the timeout reached.
402 The first argument to C<$result_cb> will be a Net::XMPP2::Node instance
403 containing the IQ result stanza contents.
404
405 If the IQ resulted in a stanza error the second argument to C<$result_cb> will
406 be C<undef> (if the error type was not 'continue') and the third argument will
407 be a L<Net::XMPP2::Error::IQ> object.
408
409 The timeout can be set by C<set_default_iq_timeout> or passed seperatly
410 in the C<%attrs> array as the value for the key C<timeout> (timeout in seconds btw.).
411
412 This method returns the newly generated id for this iq request.
413
414 =cut
415
416 sub send_iq {
417 my ($self, $type, $create_cb, $result_cb, %attrs) = @_;
418 my $id = $self->{iq_id}++;
419 $self->{iqs}->{$id} = $result_cb;
420
421 my $timeout = delete $attrs{timeout} || $self->{default_iq_timeout};
422 if ($timeout) {
423 $self->{iq_timers}->{$id} =
424 AnyEvent->timer (after => $timeout, cb => sub {
425 delete $self->{iq_timers}->{$id};
426 my $cb = delete $self->{iqs}->{$id};
427 $cb->(undef, Net::XMPP2::Error::IQ->new)
428 });
429 }
430
431 $self->{writer}->send_iq ($id, $type, $create_cb, %attrs);
432 $id
433 }
434
435 =item B<reply_iq_result ($req_iq_node, $create_cb, %attrs)>
436
437 This method will generate a result reply to the iq request C<Net::XMPP2::Node>
438 in C<$req_iq_node>.
439
440 Please take a look at the documentation for C<send_iq> in Net::XMPP2::Writer
441 about the meaning C<$create_cb> and C<%attrs>.
442
443 Use C<$create_cb> to create the XML for the result.
444
445 The type for this iq reply is 'result'.
446
447 =cut
448
449 sub reply_iq_result {
450 my ($self, $iqnode, $create_cb, %attrs) = @_;
451 $self->{writer}->send_iq ($iqnode->attr ('id'), 'result', $create_cb, %attrs);
452 }
453
454 =item B<reply_iq_error ($req_iq_node, $error_type, $error, %attrs)>
455
456 This method will generate an error reply to the iq request C<Net::XMPP2::Node>
457 in C<$req_iq_node>.
458
459 C<$error_type> is one of 'cancel', 'continue', 'modify', 'auth' and 'wait'.
460 C<$error> is one of the defined error conditions described in
461 C<write_error_tag> method of L<Net::XMPP2::Writer>.
462
463 Please take a look at the documentation for C<send_iq> in Net::XMPP2::Writer
464 about the meaning of C<%attrs>.
465
466 The type for this iq reply is 'error'.
467
468 =cut
469
470 sub reply_iq_error {
471 my ($self, $iqnode, $errtype, $error, %attrs) = @_;
472
473 $self->{writer}->send_iq (
474 $iqnode->attr ('id'), 'error',
475 sub { $self->{writer}->write_error_tag ($iqnode, $errtype, $error) },
476 %attrs
477 );
478 }
479
480 sub handle_iq {
481 my ($self, $node) = @_;
482
483 my $type = $node->attr ('type');
484
485 my $id = $node->attr ('id');
486 delete $self->{iq_timers}->{$id} if defined $id;
487
488 if ($type eq 'result') {
489 if (my $cb = delete $self->{iqs}->{$id}) {
490 eval {
491 $cb->($node);
492 };
493 if ($@) { $self->event (iq_result_cb_exception => $@) }
494 }
495
496 } elsif ($type eq 'error') {
497 if (my $cb = delete $self->{iqs}->{$id}) {
498
499 my $error = Net::XMPP2::Error::IQ->new (node => $node);
500 $cb->(($error->type eq 'continue' ? $node : undef), $error);
501 }
502
503 } else {
504 my $handled = 0;
505 $self->event ("iq_${type}_request_xml" => $node, \$handled);
506
507 my @from;
508 push @from, (to => $node->attr ('from')) if $node->attr ('from');
509
510 unless ($handled) {
511 $self->reply_iq_error ($node, undef, 'service-unavailable', @from);
512 }
513 }
514 }
515
516 sub send_sasl_auth {
517 my ($self, @mechs) = @_;
518
519 for (qw/username password domain/) {
520 die "No '$_' argument given to new, but '$_' is required\n"
521 unless $self->{$_};
522 }
523
524 $self->{writer}->send_sasl_auth (
525 (join ' ', map { $_->text } @mechs),
526 $self->{username}, $self->{domain}, $self->{password}
527 );
528 }
529
530 sub handle_stream_features {
531 my ($self, $node) = @_;
532 my @bind = $node->find_all ([qw/bind bind/]);
533 my @tls = $node->find_all ([qw/tls starttls/]);
534
535 # and yet another weird thingie: in XEP-0077 it's said that
536 # the register feature MAY be advertised by the server. That means:
537 # it MAY not be advertised even if it is available... so we don't
538 # care about it...
539 # my @reg = $node->find_all ([qw/register register/]);
540
541 if (not ($self->{disable_ssl}) && not ($self->{ssl_enabled}) && @tls) {
542 $self->{writer}->send_starttls;
543
544 } elsif (not $self->{authenticated}) {
545 my $continue = 1;
546 $self->event (stream_pre_authentication => \$continue);
547 if ($continue) {
548 $self->authenticate;
549 }
550
551 } elsif (@bind) {
552 $self->do_rebind ($self->{resource});
553 }
554 }
555
556 =item B<authenticate>
557
558 This method should be called after the C<stream_pre_authentication> event
559 was emitted to continue authentication of the stream.
560
561 Usually this method only has to be called when you want to register before
562 you authenticate. See also the documentation of the C<stream_pre_authentication>
563 event below.
564
565 =cut
566
567 sub authenticate {
568 my ($self) = @_;
569 my $node = $self->{features};
570 my @mechs = $node->find_all ([qw/sasl mechanisms/], [qw/sasl mechanism/]);
571 my @iqa = $node->find_all ([qw/iqauth auth/]);
572
573 if (@mechs) {
574 $self->send_sasl_auth (@mechs)
575 } elsif (@iqa) {
576 $self->do_iq_auth;
577 }
578 }
579
580 sub handle_sasl_challenge {
581 my ($self, $node) = @_;
582 $self->{writer}->send_sasl_response ($node->text);
583 }
584
585 sub handle_sasl_success {
586 my ($self, $node) = @_;
587 $self->{authenticated} = 1;
588 $self->{parser}->init;
589 $self->{writer}->init;
590 $self->{writer}->send_init_stream ($self->{language}, $self->{domain}, $self->{stream_namespace});
591 }
592
593 sub handle_error {
594 my ($self, $node) = @_;
595 my $error = Net::XMPP2::Error::Stream->new (node => $node);
596
597 $self->event (stream_error => $error);
598 $self->{writer}->send_end_of_stream;
599 }
600
601 sub do_iq_auth {
602 my ($self) = @_;
603 # TODO
604 }
605
606 =item B<send_presence ($type, $create_cb, %attrs)>
607
608 This method sends a presence stanza, for the meanings
609 of C<$type>, C<$create_cb> and C<%attrs> please take a look
610 at the documentation for C<send_presence> method of L<Net::XMPP2::Writer>.
611
612 This methods does attach an id attribute to the message stanza and
613 will return the id that was used (so you can react on possible replies).
614
615 =cut
616
617 sub send_presence {
618 my ($self, $type, $create_cb, %attrs) = @_;
619 my $id = $self->{iq_id}++;
620 $self->{writer}->send_presence ($id, $type, $create_cb, %attrs);
621 $id
622 }
623
624 =item B<send_message ($to, $type, $create_cb, %attrs)>
625
626 This method sends a presence stanza, for the meanings
627 of C<$to>, C<$type>, C<$create_cb> and C<%attrs> please take a look
628 at the documentation for C<send_message> method of L<Net::XMPP2::Writer>.
629
630 This methods does attach an id attribute to the message stanza and
631 will return the id that was used (so you can react on possible replies).
632
633 =cut
634
635 sub send_message {
636 my ($self, $to, $type, $create_cb, %attrs) = @_;
637 my $id = $self->{iq_id}++;
638 $self->{writer}->send_message ($id, $to, $type, $create_cb, %attrs);
639 $id
640 }
641
642 =item B<do_rebind ($resource)>
643
644 In case you got a C<bind_error> event and want to retry
645 binding you can call this function to set a new C<$resource>
646 and retry binding.
647
648 If it fails again you can call this again. Becareful not to
649 end up in a loop!
650
651 If binding was successful the C<stream_ready> event will be generated.
652
653 =cut
654
655 sub do_rebind {
656 my ($self, $resource) = @_;
657 $self->{resource} = $resource;
658 $self->send_iq (
659 set =>
660 sub {
661 my ($w) = @_;
662 if ($self->{resource}) {
663 $w->startTag ([xmpp_ns ('bind'), 'bind']);
664 $w->startTag ([xmpp_ns ('bind'), 'resource']);
665 $w->characters ($self->{resource});
666 $w->endTag;
667 $w->endTag;
668 } else {
669 $w->emptyTag ([xmpp_ns ('bind'), 'bind'])
670 }
671 },
672 sub {
673 my ($ret_iq, $error) = @_;
674
675 if ($error) {
676 # TODO: make bind error into a seperate error class?
677 if ($error->xml_node ()) {
678 my ($res) = $error->xml_node ()->find_all ([qw/bind bind/], [qw/bind resource/]);
679 $self->event (bind_error => $error, ($res ? $res : $self->{resource}));
680 } else {
681 $self->event (bind_error => $error);
682 }
683
684 } else {
685 my @jid = $ret_iq->find_all ([qw/bind bind/], [qw/bind jid/]);
686 my $jid = $jid[0]->text;
687 unless ($jid) { die "Got empty JID tag from server!\n" }
688 $self->{jid} = $jid;
689
690 $self->event (stream_ready => $jid);
691 }
692 }
693 );
694 }
695
696 =item B<jid>
697
698 After the stream has been bound to a resource the JID can be retrieved via this
699 method.
700
701 =cut
702
703 sub jid { $_[0]->{jid} }
704
705 =item B<features>
706
707 Returns the last received <features> tag in form of an L<Net::XMPP2::Node> object.
708
709 =cut
710
711 sub features { $_[0]->{features} }
712
713 =back
714
715 =head1 EVENTS
716
717 These events can be registered on with C<reg_cb>:
718
719 =over 4
720
721 =item stream_features => $node
722
723 This event is sent when a stream feature (<features>) tag is received. C<$node> is the
724 L<Net::XMPP2::Node> object that represents the <features> tag.
725
726 =item stream_pre_authentication => $rcontinue
727
728 This event is emitted after TLS/SSL was initiated (if enabled) and before any
729 authentication happened. C<$rcontinue> is a reference to a scalar that per default
730 holds a true value. If that scalar is true the authentication will continue
731 after handling this event. If you set C<$$rcontinue> to a false value
732 the authentication will stop and you have to call the C<authenticate>
733 method later.
734
735 This event is usually used when you want to do in-band registration,
736 see also L<Net::XMPP2::Ext::Registration>.
737
738 =item stream_ready => $jid
739
740 This event is sent if the XML stream has been established (and
741 resources have been bound) and is ready for transmitting regular stanzas.
742
743 C<$jid> is the bound jabber id.
744
745 =item error => $error
746
747 This event is generated whenever some error occured.
748 C<$error> is an instance of L<Net::XMPP2::Error>.
749 Trivial error reporting may look like this:
750
751 $con->reg_cb (error => sub { warn "xmpp error: " . $_[1]->string . "\n" });
752
753 Basically this event is a collect event for all other error events.
754
755 =item stream_error => $error
756
757 This event is sent if a XML stream error occured. C<$error>
758 is a L<Net::XMPP2::Error::Stream> object.
759
760 =item xml_parser_error => $error
761
762 This event is generated whenever the parser trips over XML that it can't
763 read. C<$error> is a L<Net::XMPP2::Error::Parser> object.
764
765 =item tls_error
766
767 This event is emitted when a TLS error occured on TLS negotiation.
768 After this the connection will be disconnected.
769
770 =item sasl_error => $error
771
772 This event is emitted on SASL authentication error.
773
774 =item bind_error => $error, $resource
775
776 This event is generated when the stream was unable to bind to
777 any or the in C<new> specified resource. C<$error> is a L<Net::XMPP2::Error::IQ>
778 object. C<$resource> is the errornous resource string or undef if none
779 was received.
780
781 The C<condition> of the C<$error> might be one of: 'bad-request',
782 'not-allowed' or 'conflict'.
783
784 Node: this is untested, I couldn't get the server to send a bind error
785 to test this.
786
787 =item connect => $host, $port
788
789 This event is generated when a successful connect was performed to
790 the domain passed to C<new>.
791
792 Note: C<$host> and C<$port> might be different from the domain you passed to
793 C<new> if C<connect> performed a SRV RR lookup.
794
795 If this connection is lost a C<disconnect> will be generated with the same
796 C<$host> and C<$port>.
797
798 =item disconnect => $host, $port, $message
799
800 This event is generated when the connection was lost or another error
801 occured while writing or reading from it.
802
803 C<$message> is a humand readable error message for the failure.
804 C<$host> and C<$port> were the host and port we were connected to.
805
806 Note: C<$host> and C<$port> might be different from the domain you passed to
807 C<new> if C<connect> performed a SRV RR lookup.
808
809 =item recv_stanza_xml => $node
810
811 This event is generated before any processing of a "XML" stanza happens.
812 C<$node> is the node of the stanza that is being processed, it's of
813 type L<Net::XMPP2::Node>.
814
815 This method might not be as handy for debuggin purposes as C<debug_recv>.
816
817 =item send_stanza_data => $data
818
819 This event is generated shortly before data is sent to the socket.
820 C<$data> contains a complete "XML" stanza or the end of stream closing
821 tag. This method is useful for debugging purposes and I recommend
822 using XML::Twig or something like that to display it nicely.
823
824 See also the event C<debug_send>.
825
826 =item debug_send => $data
827
828 This method is invoked whenever data is written out. This event
829 is mostly the same as C<send_stanza_data>.
830
831 =item debug_recv => $data
832
833 This method is incoked whenever a chunk of data was received.
834
835 It works to filter C<$data> through L<XML::Twig> for debugging
836 display purposes sometimes, but as C<$data> is some arbitrary chunk
837 of bytes you might get a XML parse error (did I already mention that XMPP's
838 application of "XML" sucks?).
839
840 So you might want to use C<recv_stanza_xml> to detect
841 complete stanzas. Unfortunately C<recv_stanza_xml> doesn't have the
842 bytes anymore and just a datastructure (L<Net::XMPP2::Node>).
843
844 =item presence_xml => $node
845
846 This event is sent when a presence stanza is received. C<$node> is the
847 L<Net::XMPP2::Node> object that represents the <presence> tag.
848
849 =item message_xml => $node
850
851 This event is sent when a message stanza is received. C<$node> is the
852 L<Net::XMPP2::Node> object that represents the <message> tag.
853
854 =item iq_xml => $node
855
856 This event is emitted when a iq stanza arrives. C<$node> is the
857 L<Net::XMPP2::Node> object that represents the <iq> tag.
858
859 =item iq_set_request_xml => $node, $handled_ref
860
861 =item iq_get_request_xml => $node, $handled_ref
862
863 These events are sent when an iq request stanza of type 'get' or 'set' is received.
864 C<$type> will either be 'get' or 'set' and C<$node> will be the L<Net::XMPP2::Node>
865 object of the iq tag.
866
867 If C<$$handled_ref> is true an event handler should not handle this message anymore.
868
869 If one of the event handlers handled this message the scalar pointed at by
870 the reference in C<$handled_ref> should be set to 1 true value. If C<$$handled_ref>
871 is still false after all event handlers were executed an error iq will be generated.
872
873 =item iq_result_cb_exception => $exception
874
875 If the C<$result_cb> of a C<send_iq> operation somehow threw a exception
876 or failed this event will be generated.
877
878 =item send_iq_hook => $id, $type, $attrs, $rcreate_cbs
879
880 This event lets you add any desired number of additional create callbacks
881 to a IQ stanza that is about to be sent.
882
883 C<$id>, C<$type> are described in the documentation of C<send_iq> of L<Net::XMPP2::Writer>.
884 C<$attrs> is the hashref to the C<%attrs> hash that can be passed to C<send_iq> and also has
885 the exact same semantics as described in the documentation of C<send_iq>.
886
887 C<$rcreate_cbs> is a array reference where you should push further callbacks on
888 that have the same semantic as C<$create_cb> in the documentation of C<send_iq>.
889
890 =item send_message_hook => $id, $to, $type, $attrs, $rcreate_cbs
891
892 This event lets you add any desired number of additional create callbacks
893 to a message stanza that is about to be sent.
894
895 C<$id>, C<$to>, C<$type> and the hashref C<$attrs> are described in the documentation
896 for C<send_message> of L<Net::XMPP2::Writer> (C<$attrs> is C<%attrs> there).
897
898 For semantics of C<$rcreate_cbs> see also the documentation of the C<send_iq_hook> event above.
899
900 =item send_presence_hook => $id, $type, $attrs, $rcreate_cbs
901
902 This event lets you add any desired number of additional create callbacks
903 to a presence stanza that is about to be sent.
904
905 C<$id>, C<$type> and the hashref C<$attrs> are described in the documentation
906 for C<send_presence> of L<Net::XMPP2::Writer> (C<$attrs> is C<%attrs> there).
907
908 For semantics of C<$rcreate_cbs> see also the documentation of the C<send_iq_hook> event above.
909
910 =back
911
912 =head1 AUTHOR
913
914 Robin Redeker, C<< <elmex at ta-sa.org> >>, JID: C<< <elmex at jabber.org> >>
915
916 =head1 COPYRIGHT & LICENSE
917
918 Copyright 2007 Robin Redeker, all rights reserved.
919
920 This program is free software; you can redistribute it and/or modify it
921 under the same terms as Perl itself.
922
923 =cut
924
925 1; # End of Net::XMPP2