package AnyEvent::XMPP::Component;
use strict;
use AnyEvent::XMPP::Connection;
use AnyEvent::XMPP::Namespaces qw/xmpp_ns/;
our @ISA = qw/AnyEvent::XMPP::Connection/;
=head1 NAME
AnyEvent::XMPP::Component - "XML" stream that implements the XEP-0114
=head1 SYNOPSIS
use AnyEvent::XMPP::Component;
my $con = AnyEvent::XMPP::Component->new (
domain => 'chat.jabber.org'
host => 'jabber.org',
port => 5347,
secret => 'insecurepasswordforthehackers'
);
$con->reg_cb (session_ready => sub { ... });
$con->connect;
=head1 DESCRIPTION
This module represents a XMPP connection to a server that authenticates as
component.
This module is a subclass of C and inherits all methods.
For example C and the stanza sending routines.
For additional events that can be registered to look below in the EVENTS section.
Please note that for component several functionality in L
might have no effect or not the desired effect. Basically you should
use the L as component and only handle events
the handle with incoming data. And only use functions that send stanzas.
No effect has the event C and the C
method of L, because those handle the usual SASL or iq-auth
authentication. "Jabber" components have a completly different authentication
mechanism.
Also note that the support for some XEPs in L is just thought
for client side usage, if you miss any functionaly don't hesitate to ask the
author or send him a patch! (See L for contact information).
=head1 METHODS
=over 4
=item B
This is the constructor. It takes the same arguments as
the constructor of L along with a
few others:
B: Please note that some arguments that L
usually takes have no effect when using this class. (That would be
the 'username', 'password', 'resource' and 'jid' arguments for example.)
=over 4
=item secret => $secret
C is the secret that will be used for authentication with the server.
=back
=cut
sub new {
my $this = shift;
my $class = ref($this) || $this;
my %args = @_;
unless (exists $args{initial_presence}) {
$args{stream_namespace} = 'component';
}
$args{host} ||= delete $args{server};
$args{host}
or die "Required 'host' argument missing to new for this component!";
unless (defined $args{port}) {
$args{port} = 5347;
}
my $self = $class->SUPER::new (%args);
$self->{parser}->set_stream_cb (sub {
my $secret = $self->{parser}->{parser}->xml_escape ($self->{secret});
my $id = $self->{stream_id} = $_[0]->attr ('id');
$self->{writer}->send_handshake ($id, $secret);
});
$self->reg_cb (recv_stanza_xml => sub {
my ($self, $node) = @_;
if ($node->eq (component => 'handshake')) {
$self->{authenticated} = 1;
$self->event ('session_ready');
}
},
stream_pre_authentication => sub {
my ($self, $rcon) = @_;
$$rcon = 0;
});
$self
}
sub default_namespace {
return 'component';
}
sub authenticate {
warn "authenticate called! Please read the documentation of "
."AnyEvent::XMPP::Component why this is an error!"
}
=back
=head1 EVENTS
These additional events can be registered on with C:
NOTE: The event C should _not_ be handled
and just ignored. Don't attach callbacks to it!
=over 4
=item session_ready
This event indicates that the component has connected successfully
and can now be used to transmit stanzas.
=back
=head1 AUTHOR
Robin Redeker, C<< >>, JID: C<< >>
=head1 COPYRIGHT & LICENSE
Copyright 2007, 2008 Robin Redeker, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1; # End of AnyEvent::XMPP::Component