Jabber-mod_perl

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

       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 )