=head1 NAME DJabberd::Component - Abstract class representing a component in DJabberd =head1 SYNOPSIS package MyPackage::DJabberd::MyComponent; use base DJabberd::Component; sub initialize { my ($self, $opts) = @_; # ... perform initialization } sub handle_stanza { my ($self, $vhost, $stanza) = @_; # ... handle the given stanza } This class provides a parent class for all DJabberd components. Components that inherit from this class can then be used directly by the server via the DJabberd::Plugin::Component plugin, or used directly by other classes. See DJabberd::Component::Example for an example component implementation. TODO: Write more docs =cut package DJabberd::Component; use base 'DJabberd::Agent'; use strict; use DJabberd::Log; use DJabberd::Util qw(exml); our $logger = DJabberd::Log->get_logger(); sub register { my ($self, $vhost) = @_; $self->SUPER::register($vhost); $logger->debug("Component ".$self." will serve domain ".$self->domain); return; } sub handles_destination { my ($self, $to_jid, $vhost) = @_; return ($to_jid && $to_jid->domain eq $self->domain); } sub domain { return $_[0]->vhost->server_name; } sub handle_stanza { my ($self, $vhost, $stanza) = @_; if ($stanza->to_jid->node) { my $node = $self->get_node($stanza->to_jid->node); unless ($node) { my $error = $stanza->make_error_response('404', 'cancel', 'item-not-found'); $error->deliver($vhost); return; } return $node->handle_stanza($vhost, $stanza); } else { $self->SUPER::handle_stanza($vhost, $stanza); } } sub get_node { my ($self, $nodename) = @_; return undef; } sub name { my ($self) = @_; return $self->domain; } sub vcard { my ($self) = @_; return "".exml($self->name).""; } sub identities { my ($self) = @_; # Use a generic identity by default because some clients # get upset if a JID has no identities. # Subclasses really should specialize this. return [ [ 'heirarchy', 'branch', $self->name ], ]; } sub send_stanza { my ($self, $stanza) = @_; $stanza->deliver($self->vhost); } 1;