AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/Writer.pm view on Meta::CPAN
my @add;
push @add, (id => $id) if defined $id;
$type ||= 'chat';
my %fattrs =
map { $_ => $attrs{$_} }
grep { my $k = $_; not grep { $k eq $_ } qw/subject body thread/ }
keys %attrs;
if (defined $create_cb) {
$w->startTag ([xmpp_ns ('client'), 'message'], @add, to => $to, type => $type, %fattrs);
_generate_key_xmls ($w, subject => $attrs{subject}) if defined $attrs{subject};
_generate_key_xmls ($w, body => $attrs{body}) if defined $attrs{body};
_generate_key_xml ($w, thread => $attrs{thread}) if defined $attrs{thread};
$create_cb->($w);
$w->endTag;
} else {
if (exists $attrs{subject} or $attrs{body} or $attrs{thread}) {
$w->startTag ([xmpp_ns ('client'), 'message'], @add, to => $to, type => $type, %fattrs);
_generate_key_xmls ($w, subject => $attrs{subject}) if defined $attrs{subject};
_generate_key_xmls ($w, body => $attrs{body}) if defined $attrs{body};
_generate_key_xml ($w, thread => $attrs{thread}) if defined $attrs{thread};
$w->endTag;
} else {
$w->emptyTag ([xmpp_ns ('client'), 'message'], @add, to => $to, type => $type, %fattrs);
}
}
$self->flush;
}
=item B<write_error_tag ($error_stanza_node, $error_type, $error)>
C<$error_type> is one of 'cancel', 'continue', 'modify', 'auth' and 'wait'.
C<$error> is the name of the error tag child element. If C<$error> is one of
the following:
'bad-request', 'conflict', 'feature-not-implemented', 'forbidden', 'gone',
'internal-server-error', 'item-not-found', 'jid-malformed', 'not-acceptable',
'not-allowed', 'not-authorized', 'payment-required', 'recipient-unavailable',
'redirect', 'registration-required', 'remote-server-not-found',
'remote-server-timeout', 'resource-constraint', 'service-unavailable',
'subscription-required', 'undefined-condition', 'unexpected-request'
then a default can be select for C<$error_type>, and the argument can be undefined.
Note: This method is currently a bit limited in the generation of the xml
for the errors, if you need more please contact me.
=cut
our %STANZA_ERRORS = (
'bad-request' => ['modify', 400],
'conflict' => ['cancel', 409],
'feature-not-implemented' => ['cancel', 501],
'forbidden' => ['auth', 403],
'gone' => ['modify', 302],
'internal-server-error' => ['wait', 500],
'item-not-found' => ['cancel', 404],
'jid-malformed' => ['modify', 400],
'not-acceptable' => ['modify', 406],
'not-allowed' => ['cancel', 405],
'not-authorized' => ['auth', 401],
'payment-required' => ['auth', 402],
'recipient-unavailable' => ['wait', 404],
'redirect' => ['modify', 302],
'registration-required' => ['auth', 407],
'remote-server-not-found' => ['cancel', 404],
'remote-server-timeout' => ['wait', 504],
'resource-constraint' => ['wait', 500],
'service-unavailable' => ['cancel', 503],
'subscription-required' => ['auth', 407],
'undefined-condition' => ['cancel', 500],
'unexpected-request' => ['wait', 400],
);
sub write_error_tag {
my ($self, $errstanza, $type, $error) = @_;
my $w = $self->{writer};
$_->write_on ($w) for $errstanza->nodes;
my @add;
unless (defined $type and defined $STANZA_ERRORS{$error}) {
$type = $STANZA_ERRORS{$error}->[0];
}
push @add, (code => $STANZA_ERRORS{$error}->[1]);
my %add = @add;
filter_xml_attr_hash_chars \%add;
$w->addPrefix (xmpp_ns ('client'), '');
$w->startTag ([xmpp_ns ('client') => 'error'], type => $type, %add);
$w->addPrefix (xmpp_ns ('stanzas'), '');
$w->emptyTag ([xmpp_ns ('stanzas') => filter_xml_chars $error]);
$w->endTag;
}
=back
=head1 AUTHOR
Robin Redeker, C<< <elmex at ta-sa.org> >>, JID: C<< <elmex at jabber.org> >>
=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
( run in 0.628 second using v1.01-cache-2.11-cpan-39bf76dae61 )