Jabber-mod_perl
view release on metacpan or search on metacpan
of jabberd2s
- for the moment - I have removed jadperl from the build, and concentrated on
mod_perl for sm - my thinking is that there are so many Perl implementations
for building components and clients that I should focus on the core
Wed Jul 27 08:39:21 BST 2005
0.07 - applied patches supplied by Christopher Zorn for problem wih dup() in pkt
where it doesnt handle blank from and tos
Tue Dec 13 07:06:39 GMT 2005
0.08 - add two new methods for adding to CDATA of a given element - append_cdata_head(),
and append_cdata_tail() on Jabber::NAD.
Wed Dec 21 10:16:35 GMT 2005
0.10 - Added nad_replace_cdata_head(), and nad_replace_cdata_tail(). These complement the nad_append_cdata* methods.
- added support for nearly all the module chain events - support list is now:
* sess-start
* sess-end
* in-sess
* out-sess
* in-router
* out-router
* pkt-sm
* pkt-user
* pkt-router
examples/MyStamp.pm view on Meta::CPAN
xwarn "The from address is: ".$from;
xwarn "The type is: ".$type;
my $nad = $pkt->nad();
my @attrs = ();
foreach my $attr ( $nad->attrs(1) ){
push(@attrs, [$nad->nad_attr_name($attr), $nad->nad_attr_val($attr)]);
}
xwarn "ELEMENT 1 (".$nad->nad_elem_name(1).") ATTRS: ".Dumper(\@attrs);
return PASS unless $type eq "message";;
my $el = $nad->find_elem(1,-1,"body",1);
my $data = $nad->nad_cdata( $el );
xwarn "Body element is: $el - $data";
my $ns = $nad->find_scoped_namespace("http://jabber.org/protocol/xhtml-im","");
xwarn "namespace is: $ns";
xwarn "NAMESPACES: ".Dumper($nad->list_namespaces());
my $elhtml = $nad->find_elem(1,$ns,"html",1) if $ns;
xwarn "XHTML HTML element is: $elhtml";
my $elx = $nad->find_elem($elhtml,-1,"body",1) if $elhtml;
xwarn "BODY HTML element (no namespace) is: $elx";
my $datax = $nad->nad_cdata( $elx ) if $elx;
xwarn "Body xhtml element is: $elhtml/$elx - $datax" if $elx;
#$nad->append_cdata_head($el, "some data or other");
$nad->replace_cdata_head($el, "beginning... ($data/$el) ...some data or other") if $el > 0;
$nad->replace_cdata_head($elx, "beginning... ($datax) ...some data or other") if $elx;
# accumulate stats
$cnt++;
unless ($cnt%20) {
# message the stats every 20 times
xwarn "CREATING STATS MESSAGE";
my $stats = $pkt->create("message", "", "piers\@badger.local.net", "piers\@badger.local.net");
my $mn = $stats->nad;
$mn->insert_elem(1, "", "subject", "Stats Message");
$mn->insert_elem(1, "", "body", "We have processed ($cnt) messages.");
lib/Jabber/NADs.pod view on Meta::CPAN
=head2 append_elem()
A method to append an element to a NAD
$n->nad_append_element( $ns, $name, $depth );
=head2 insert_elem()
A method to insert an element into a NAD
$n->insert_elem( $startelem, $ns, $name, $cdata );
=head2 find_elem()
A method to find an element in a NAD
$n->find_elem( $startelem, $ns, $name, $depth );
=head2 append_cdata()
A method to append CDATA to a NAD.
$n->append_cdata( $cdata, $len, $depth );
=head2 append_cdata_head()
A method to append CDATA to the cdata before the first child element.
$n->append_cdata_head( $elem, $cdata );
=head2 append_cdata_tail()
A method to append CDATA to the cdata after the child elements of THIS element.
$n->append_cdata_head( $elem, $cdata );
=head2 replace_cdata_head()
A method to replace the CDATA before the first child element of the nominated element.
$n->replace_cdata_head( $elem, $cdata );
=head2 replace_cdata_tail()
A method to replace the CDATA after the child elements of THIS element.
$n->replace_cdata_head( $elem, $cdata );
=head2 add_namespace()
A method to add a namespace to a NAD
returns an integer representing the namespace.
$n->add_namespace( $name );
=head2 find_namespace()
lib/Jabber/NADs.pod view on Meta::CPAN
Get the value of a given attribute
$n->nad_attr_val( $attr_number );
=head2 nad_elem_name()
Get the name of a given element
$n->nad_elem_name( $elem_number );
=head2 nad_cdata()
Get the cdata of a given element
$n->nad_cdata( $elem_number );
=head2 nad_uri()
Get the name of a given uri (namespace)
$n->nad_uri( $uri_number );
=head2 nad_uri_prefix()
Get the name of a given uri (namespace) prefix
patches/NADs.xs view on Meta::CPAN
return;
nad_wrap_elem(((nad_t) SvIV(SvRV(sv_n))),
SvIV(sv_startelem),
SvIV(sv_ns),
SvPV(sv_name, SvCUR(sv_name)));
}
SV* my_nad_insert_elem(SV* sv_n, SV* sv_startelem, SV* sv_ns, SV* sv_name, SV* sv_cdata){
if (SvIV(sv_startelem) < 0 )
return newSVsv(&PL_sv_undef);
return newSViv(
nad_insert_elem(
((nad_t) SvIV(SvRV(sv_n))),
SvIV(sv_startelem),
SvIV(sv_ns),
SvPV(sv_name, SvCUR(sv_name)),
SvPV(sv_cdata, SvCUR(sv_cdata))
)
);
}
SV* my_nad_append_elem(SV* sv_n, SV* sv_ns, SV* sv_name, SV* sv_depth){
char *str;
int len;
patches/NADs.xs view on Meta::CPAN
name = SvPV(sv_name, SvCUR(sv_name));
//fprintf(stderr, "NAME: %s \n", name);
//fprintf(stderr, "found at: %d \n", nad_find_elem(((nad_t) SvIV(SvRV(sv_n))),
// 2, 1, "unsubscribe", 1) );
return newSViv( nad_find_elem(((nad_t) SvIV(SvRV(sv_n))),
SvIV(sv_startelem),SvIV(sv_ns), name, SvIV(sv_depth)) );
}
void my_nad_append_cdata(SV* sv_n, SV* sv_cdata, SV* sv_len, SV* sv_depth){
nad_append_cdata(((nad_t) SvIV(SvRV(sv_n))),
SvPV(sv_cdata, SvCUR(sv_cdata)),
SvIV(sv_len),
SvIV(sv_depth));
}
/** this is the safety check used to make sure there's always enough mem */
#define NAD_SAFE(blocks, size, len) if((size) > len) len = _nad_realloc((void**)&(blocks),(size));
void my_nad_append_cdata_head(SV* sv_n, SV* sv_elem, SV* sv_cdata){
if (SvIV(sv_elem) < 0 )
return;
nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
int elem = SvIV(sv_elem);
int len = SvCUR(sv_cdata);
/* nad, current tot len + strlen to add, current block len */
NAD_SAFE(nad->cdata, nad->ccur + len, nad->clen);
// move other data down
// tgt, src, len
int toset = nad->elems[elem].icdata + nad->elems[elem].lcdata + len;
int soset = nad->elems[elem].icdata + nad->elems[elem].lcdata;
int copy_len = nad->ccur - (nad->elems[elem].icdata + nad->elems[elem].lcdata);
SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);
// increment overall length
nad->ccur += len;
// copy in new data
memcpy(nad->cdata+(nad->elems[elem].icdata + nad->elems[elem].lcdata), SvPV(sv_cdata, SvCUR(sv_cdata)), len);
// adjust pointers for all others after this one
// attrs, ns, elem
// attributes
int iattr, ins, ielem;
for(iattr=0;iattr < nad->acur;iattr++)
{
if (nad->attrs[iattr].iname > nad->elems[elem].icdata)
nad->attrs[iattr].iname += len;
if (nad->attrs[iattr].ival > nad->elems[elem].icdata)
nad->attrs[iattr].ival += len;
}
// namespaces
for(ins=0;ins < nad->ncur;ins++)
{
// namespaces
if (nad->nss[ins].iuri > nad->elems[elem].icdata)
nad->nss[ins].iuri += len;
// namespace prefixes
if (nad->nss[ins].iprefix > nad->elems[elem].icdata)
nad->nss[ins].iprefix += len;
}
// Elements
for(ielem=0;ielem < nad->ecur;ielem++)
{
if (nad->elems[ielem].iname > nad->elems[elem].icdata)
nad->elems[ielem].iname += len;
if (nad->elems[ielem].icdata > nad->elems[elem].icdata)
nad->elems[ielem].icdata += len;
if (nad->elems[ielem].itail > nad->elems[elem].icdata)
nad->elems[ielem].itail += len;
}
// adjust pointer + len for modified elem offender
nad->elems[elem].lcdata += len;
// reprint the nad so that the xml serialisation is inline
char *xml;
int xlen;
nad_print(nad, 0, &xml, &xlen);
}
void my_nad_replace_cdata_head(SV* sv_n, SV* sv_elem, SV* sv_cdata){
if (SvIV(sv_elem) < 0 )
return;
nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
int elem = SvIV(sv_elem);
int len = SvCUR(sv_cdata);
// if len_diff < 0 then we have to reduce the overall length of cdata
// if not - then increase cdata by len_diff
int len_diff = len - nad->elems[elem].lcdata;
if (len_diff > 0) {
/* nad, current tot len + strlen to add, current block len */
NAD_SAFE(nad->cdata, nad->ccur + len_diff, nad->clen);
}
// move other data down
// tgt, src, len
int toset = nad->elems[elem].icdata + nad->elems[elem].lcdata + len_diff;
int soset = nad->elems[elem].icdata + nad->elems[elem].lcdata;
int copy_len = nad->ccur - (nad->elems[elem].icdata + nad->elems[elem].lcdata);
SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);
// increment overall length
nad->ccur += len_diff;
// copy in new data
memcpy(nad->cdata+nad->elems[elem].icdata, SvPV(sv_cdata, SvCUR(sv_cdata)), len);
// adjust pointers for all others after this one
// attrs, ns, elem
// attributes
int iattr, ins, ielem;
for(iattr=0;iattr < nad->acur;iattr++)
{
if (nad->attrs[iattr].iname > nad->elems[elem].icdata)
nad->attrs[iattr].iname += len_diff;
if (nad->attrs[iattr].ival > nad->elems[elem].icdata)
nad->attrs[iattr].ival += len_diff;
}
// namespaces
for(ins=0;ins < nad->ncur;ins++)
{
// namespaces
if (nad->nss[ins].iuri > nad->elems[elem].icdata)
nad->nss[ins].iuri += len_diff;
// namespace prefixes
if (nad->nss[ins].iprefix > nad->elems[elem].icdata)
nad->nss[ins].iprefix += len_diff;
}
// Elements
for(ielem=0;ielem < nad->ecur;ielem++)
{
if (nad->elems[ielem].iname > nad->elems[elem].icdata)
nad->elems[ielem].iname += len_diff;
if (nad->elems[ielem].icdata > nad->elems[elem].icdata)
nad->elems[ielem].icdata += len_diff;
if (nad->elems[ielem].itail > nad->elems[elem].icdata)
nad->elems[ielem].itail += len_diff;
}
// adjust pointer + len for modified elem offender
nad->elems[elem].lcdata += len_diff;
// reprint the nad so that the xml serialisation is inline
char *xml;
int xlen;
nad_print(nad, 0, &xml, &xlen);
}
void my_nad_append_cdata_tail(SV* sv_n, SV* sv_elem, SV* sv_cdata){
if (SvIV(sv_elem) < 0 )
return;
nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
int elem = SvIV(sv_elem);
int len = SvCUR(sv_cdata);
/* nad, current tot len + strlen to add, current block len */
NAD_SAFE(nad->cdata, nad->ccur + len, nad->clen);
// move other data down
// tgt, src, len
int toset = nad->elems[elem].itail + nad->elems[elem].ltail + len;
int soset = nad->elems[elem].itail + nad->elems[elem].ltail;
int copy_len = nad->ccur - (nad->elems[elem].itail + nad->elems[elem].ltail);
SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);
// increment overall length
nad->ccur += len;
// copy in new data
memcpy(nad->cdata+(nad->elems[elem].itail + nad->elems[elem].ltail), SvPV(sv_cdata, SvCUR(sv_cdata)), len);
// adjust pointers for all others after this one
// attrs, ns, elem
// attributes
int iattr, ins, ielem;
for(iattr=0;iattr < nad->acur;iattr++)
{
if (nad->attrs[iattr].iname > nad->elems[elem].itail)
nad->attrs[iattr].iname += len;
patches/NADs.xs view on Meta::CPAN
nad->nss[ins].iuri += len;
// namespace prefixes
if (nad->nss[ins].iprefix > nad->elems[elem].itail)
nad->nss[ins].iprefix += len;
}
// Elements
for(ielem=0;ielem < nad->ecur;ielem++)
{
if (nad->elems[ielem].iname > nad->elems[elem].itail)
nad->elems[ielem].iname += len;
if (nad->elems[ielem].icdata > nad->elems[elem].itail)
nad->elems[ielem].icdata += len;
if (nad->elems[ielem].itail > nad->elems[elem].itail)
nad->elems[ielem].itail += len;
}
// adjust pointer + len for modified elem offender
nad->elems[elem].ltail += len;
// reprint the nad so that the xml serialisation is inline
char *xml;
int xlen;
nad_print(nad, 0, &xml, &xlen);
}
void my_nad_replace_cdata_tail(SV* sv_n, SV* sv_elem, SV* sv_cdata){
if (SvIV(sv_elem) < 0 )
return;
nad_t nad = ((nad_t) SvIV(SvRV(sv_n)));
int elem = SvIV(sv_elem);
int len = SvCUR(sv_cdata);
// if len_diff < 0 then we have to reduce the overall length of cdata
// if not - then increase cdata by len_diff
int len_diff = len - nad->elems[elem].lcdata;
if (len_diff > 0) {
/* nad, current tot len + strlen to add, current block len */
NAD_SAFE(nad->cdata, nad->ccur + len_diff, nad->clen);
}
// move other data down
// tgt, src, len
int toset = nad->elems[elem].itail + nad->elems[elem].ltail + len_diff;
int soset = nad->elems[elem].itail + nad->elems[elem].ltail;
int copy_len = nad->ccur - (nad->elems[elem].itail + nad->elems[elem].ltail);
SV* sv_temp = newSVpv(nad->cdata+soset, copy_len);
memcpy(nad->cdata+toset, SvPV(sv_temp, SvCUR(sv_temp)), copy_len);
// increment overall length
nad->ccur += len_diff;
// copy in new data
memcpy(nad->cdata+nad->elems[elem].itail, SvPV(sv_cdata, SvCUR(sv_cdata)), len);
// adjust pointers for all others after this one
// attrs, ns, elem
// attributes
int iattr, ins, ielem;
for(iattr=0;iattr < nad->acur;iattr++)
{
if (nad->attrs[iattr].iname > nad->elems[elem].itail)
nad->attrs[iattr].iname += len_diff;
patches/NADs.xs view on Meta::CPAN
nad->nss[ins].iuri += len_diff;
// namespace prefixes
if (nad->nss[ins].iprefix > nad->elems[elem].itail)
nad->nss[ins].iprefix += len_diff;
}
// Elements
for(ielem=0;ielem < nad->ecur;ielem++)
{
if (nad->elems[ielem].iname > nad->elems[elem].itail)
nad->elems[ielem].iname += len_diff;
if (nad->elems[ielem].icdata > nad->elems[elem].itail)
nad->elems[ielem].icdata += len_diff;
if (nad->elems[ielem].itail > nad->elems[elem].itail)
nad->elems[ielem].itail += len_diff;
}
// adjust pointer + len for modified elem offender
nad->elems[elem].ltail += len_diff;
// reprint the nad so that the xml serialisation is inline
char *xml;
int xlen;
patches/NADs.xs view on Meta::CPAN
return newSVsv(&PL_sv_undef);
return newSVpvn(
NAD_ENAME( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) ),
NAD_ENAME_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) )
);
}
SV* my_nad_nad_cdata(SV* sv_n, SV* sv_elem){
if (SvIV(sv_elem) < 0 )
return newSVsv(&PL_sv_undef);
return newSVpvn(
NAD_CDATA( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) ),
NAD_CDATA_L( ((nad_t) SvIV(SvRV(sv_n))), SvIV(sv_elem) )
);
}
patches/NADs.xs view on Meta::CPAN
SV *
my_nad_nad_new (sv_nc)
SV * sv_nc
SV *
my_nad_copy (sv_n)
SV * sv_n
SV *
my_nad_insert_elem (sv_n, sv_startelem, sv_ns, sv_name, sv_cdata)
SV * sv_n
SV * sv_startelem
SV * sv_ns
SV * sv_name
SV * sv_cdata
void
my_nad_wrap_elem (sv_n, sv_startelem, sv_ns, sv_name)
SV * sv_n
SV * sv_startelem
SV * sv_ns
SV * sv_name
SV *
my_nad_append_elem (sv_n, sv_ns, sv_name, sv_depth)
patches/NADs.xs view on Meta::CPAN
SV *
my_nad_find_elem (sv_n, sv_startelem, sv_ns, sv_name, sv_depth)
SV * sv_n
SV * sv_startelem
SV * sv_ns
SV * sv_name
SV * sv_depth
void
my_nad_append_cdata (sv_n, sv_cdata, sv_len, sv_depth)
SV * sv_n
SV * sv_cdata
SV * sv_len
SV * sv_depth
void
my_nad_append_cdata_head (sv_n, sv_elem, sv_cdata)
SV * sv_n
SV * sv_elem
SV * sv_cdata
void
my_nad_replace_cdata_head (sv_n, sv_elem, sv_cdata)
SV * sv_n
SV * sv_elem
SV * sv_cdata
void
my_nad_append_cdata_tail (sv_n, sv_elem, sv_cdata)
SV * sv_n
SV * sv_elem
SV * sv_cdata
void
my_nad_replace_cdata_tail (sv_n, sv_elem, sv_cdata)
SV * sv_n
SV * sv_elem
SV * sv_cdata
SV *
my_nad_find_attr (sv_n, sv_startelem, sv_ns, sv_name, sv_val)
SV * sv_n
SV * sv_startelem
SV * sv_ns
SV * sv_name
SV * sv_val
SV *
patches/NADs.xs view on Meta::CPAN
my_nad_nad_attr_val (sv_n, sv_attr)
SV * sv_n
SV * sv_attr
SV *
my_nad_nad_elem_name (sv_n, sv_elem)
SV * sv_n
SV * sv_elem
SV *
my_nad_nad_cdata (sv_n, sv_elem)
SV * sv_n
SV * sv_elem
SV *
my_nad_nad_uri (sv_n, sv_ns)
SV * sv_n
SV * sv_ns
SV *
my_nad_nad_uri_prefix (sv_n, sv_ns)
( run in 0.337 second using v1.01-cache-2.11-cpan-454fe037f31 )