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
--
Daniel-Constantin Mierla
http://www.asipto.com/