On 06/25/2009 11:31 AM, Iñaki Baz Castillo wrote:
El Jueves, 25 de Junio de 2009, Daniel-Constantin Mierla escribió:
Hello,
several days ago I committed support for accessing components of xml documents using pseudo-variables based on XPath syntax. The new $xml(...) PV is implemented in the presence_xml module as it works with xml docs and links libxml2.
Short description in the cookbook: https://sip-router.org/wiki/cookbooks/pseudo-variables/devel#presence_xml_p seudo-variables
As an example:
- publish has the body:
<?xml version='1.0' encoding='UTF-8'?>
<presence xmlns='urn:ietf:params:xml:ns:pidf' xmlns:dm='urn:ietf:params:xml:ns:pidf:data-model' xmlns:rpid='urn:ietf:params:xml:ns:pidf:rpid' xmlns:c='urn:ietf:params:xml:ns:pidf:cipid' entity='sip:daniel@asipto.com'>
<tuple id='t8b484917'> <status><basic>open</basic></status> </tuple> <dm:person id='p7562ef60'><rpid:activities><rpid:unknown/></rpid:activities></dm:perso n> </presence>
Getting the presence status:
# this is needed because libxml2 cannot work with default no-prefix ns, so we alias the "p" prefix. modparam("presence_xml", "xml_ns", "p=urn:ietf:params:xml:ns:pidf")
$xml(a=>doc) = $rb; $xml(a=>xpath:/p:presence/p:tuple/p:status/p:basic)
Next is to update the presence modules to be able to work with the documents that have been updated in the config.
Comments, opinions and improvements are welcome!
This is more than great!
It would make possible exotic routing decissions based on presence status...
... or based on other content of the xml doc -- you may have there geo positions and send it to the appropriate server.
or perhaps not yet? I understand that this makes possible to extract XML nodes when processing a request, but would it be possible to extract them from the "presentity" table?
Yes, if you load it you can do it. For example, next piece of config is valid as well:
$xml(a=>doc) = '<?xml version="1.0" encoding="UTF-8"?><presence entity="abc"><mynode>abc</mynode></presence>';
xlog("$xml(a=>xpath:/presence/mynode)\n");
Probably not very clear in my first email, but you can change the xml content:
$xml(a=>xpath:/presence/mynode) = "123";
Note that if you assigned the sip message body to $xml(name=>doc), body does not get changed, the operations are done on a replica.
Cheers, Daniel
A simpler approach for what I mean would be having a mini API to get presence basic status (some module that connects to DB with "presentity" table):
if ( is_presence_basic_status_open($ru) ) { ...route the MESSAGE... }
XD