def xpath_eval(self,expr,namespaces=None): """Evaluate XPath expression on the error element. The expression will be evaluated in context where the common namespace (the one used for stanza elements, mapped to 'jabber:client', 'jabber:server', etc.) is bound to prefix "ns" and other namespaces are bound accordingly to the `namespaces` list. :Parameters: - `expr`: the XPath expression. - `namespaces`: prefix to namespace mapping. :Types: - `expr`: `unicode` - `namespaces`: `dict` :return: the result of the expression evaluation. """ ctxt = common_doc.xpathNewContext() ctxt.setContextNode(self.xmlnode) ctxt.xpathRegisterNs("ns",to_utf8(self.ns)) if namespaces: for prefix,uri in namespaces.items(): ctxt.xpathRegisterNs(prefix,uri) ret=ctxt.xpathEval(expr) ctxt.xpathFreeContext() return ret
def xpath_eval(self, expr, namespaces=None): """Evaluate XPath expression on the error element. The expression will be evaluated in context where the common namespace (the one used for stanza elements, mapped to 'jabber:client', 'jabber:server', etc.) is bound to prefix "ns" and other namespaces are bound accordingly to the `namespaces` list. :Parameters: - `expr`: the XPath expression. - `namespaces`: prefix to namespace mapping. :Types: - `expr`: `unicode` - `namespaces`: `dict` :return: the result of the expression evaluation. """ ctxt = common_doc.xpathNewContext() ctxt.setContextNode(self.xmlnode) ctxt.xpathRegisterNs("ns", to_utf8(self.ns)) if namespaces: for prefix, uri in namespaces.items(): ctxt.xpathRegisterNs(prefix, uri) ret = ctxt.xpathEval(expr) ctxt.xpathFreeContext() return ret
def update(self,query): """ Apply an update request to the roster. `query` should be a query included in a "roster push" IQ received. """ ctxt=common_doc.xpathNewContext() ctxt.setContextNode(query) ctxt.xpathRegisterNs("r",ROSTER_NS) item=ctxt.xpathEval("r:item") ctxt.xpathFreeContext() if not item: raise ValueError,"No item to update" item=item[0] item=RosterItem(item) jid=item.jid subscription=item.subscription try: local_item=self.get_item_by_jid(jid) local_item.subscription=subscription except KeyError: if subscription=="remove": return RosterItem(jid,"remove") if self.server or subscription not in ("none","from","to","both"): subscription="none" local_item=RosterItem(jid,subscription) if subscription=="remove": del self.items_dict[local_item.jid] return RosterItem(jid,"remove") local_item.name=item.name local_item.groups=list(item.groups) if not self.server: local_item.ask=item.ask self.items_dict[local_item.jid]=local_item return local_item
def __init__(self,xmlnode_or_node=None): """Initialize an `DiscoItems` object. Wrap an existing disco#items XML element or create a new one. :Parameters: - `xmlnode_or_node`: XML node to be wrapped into `self` or an item node name. :Types: - `xmlnode_or_node`: `libxml2.xmlNode` or `unicode`""" self.xmlnode=None self.xpath_ctxt=None if isinstance(xmlnode_or_node,libxml2.xmlNode): ns=xmlnode_or_node.ns() if ns.getContent() != DISCO_ITEMS_NS: raise ValueError, "Bad disco-items namespace" self.xmlnode=xmlnode_or_node.docCopyNode(common_doc,1) common_root.addChild(self.xmlnode) self.ns=self.xmlnode.ns() else: self.xmlnode=common_root.newChild(None,"query",None) self.ns=self.xmlnode.newNs(DISCO_ITEMS_NS,None) self.xmlnode.setNs(self.ns) self.set_node(xmlnode_or_node) self.xpath_ctxt=common_doc.xpathNewContext() self.xpath_ctxt.setContextNode(self.xmlnode) self.xpath_ctxt.xpathRegisterNs("d",DISCO_ITEMS_NS)
def __init__(self, xmlnode_or_node=None): """Initialize an `DiscoItems` object. Wrap an existing disco#items XML element or create a new one. :Parameters: - `xmlnode_or_node`: XML node to be wrapped into `self` or an item node name. :Types: - `xmlnode_or_node`: `libxml2.xmlNode` or `unicode`""" self.xmlnode = None self.xpath_ctxt = None if isinstance(xmlnode_or_node, libxml2.xmlNode): ns = xmlnode_or_node.ns() if ns.getContent() != DISCO_ITEMS_NS: raise ValueError, "Bad disco-items namespace" self.xmlnode = xmlnode_or_node.docCopyNode(common_doc, 1) common_root.addChild(self.xmlnode) self.ns = self.xmlnode.ns() else: self.xmlnode = common_root.newChild(None, "query", None) self.ns = self.xmlnode.newNs(DISCO_ITEMS_NS, None) self.xmlnode.setNs(self.ns) self.set_node(xmlnode_or_node) self.xpath_ctxt = common_doc.xpathNewContext() self.xpath_ctxt.setContextNode(self.xmlnode) self.xpath_ctxt.xpathRegisterNs("d", DISCO_ITEMS_NS)
def xpath_eval(xmlnode,expr,namespaces=None): ctxt = common_doc.xpathNewContext() ctxt.setContextNode(xmlnode) if namespaces: for prefix,uri in namespaces.items(): ctxt.xpathRegisterNs(unicode(prefix),uri) ret=ctxt.xpathEval(unicode(expr)) ctxt.xpathFreeContext() return ret
def __init__(self, disco, xmlnode_or_name, item_category=None, item_type=None, replace=False): """Initialize an `DiscoIdentity` object. :Parameters: - `disco`: the disco#info reply `self` is a part of. - `xmlnode_or_name`: XML element describing the identity or the name of the item described. - `item_category`: category of the item described. - `item_type`: type of the item described. - `replace`: if `True` than all other <identity/> elements in `disco` will be removed. :Types: - `disco`: `DiscoItems` - `xmlnode_or_name`: `libxml2.xmlNode` or `unicode` - `item_category`: `unicode` - `item_type`: `unicode` - `replace`: `bool` """ self.disco = disco if disco and replace: old = disco.xpath_ctxt.xpathEval("d:identity") if old: for n in old: n.unlinkNode() n.freeNode() if isinstance(xmlnode_or_name, libxml2.xmlNode): if disco is None: self.xmlnode = xmlnode_or_name.copyNode(1) else: self.xmlnode = xmlnode_or_name elif not item_category: raise ValueError, "DiscoInfo requires category" elif not item_type: raise ValueError, "DiscoInfo requires type" else: if disco: self.xmlnode = disco.xmlnode.newChild(None, "identity", None) else: self.xmlnode = common_root.newChild(None, "identity", None) ns = self.xmlnode.newNs(DISCO_INFO_NS, None) self.xmlnode.setNs(ns) self.set_name(xmlnode_or_name) self.set_category(item_category) self.set_type(item_type) self.xpath_ctxt = common_doc.xpathNewContext() self.xpath_ctxt.setContextNode(self.xmlnode) self.xpath_ctxt.xpathRegisterNs("d", DISCO_INFO_NS)
def __init__(self, disco, xmlnode_or_jid, node=None, name=None, action=None): """Initialize an `DiscoItem` object. :Parameters: - `disco`: the disco#items reply `self` is a part of. - `xmlnode_or_jid`: XML element describing the item or the JID of the item. - `node`: disco node of the item. - `name`: name of the item. - `action`: 'action' attribute of the item. :Types: - `disco`: `DiscoItems` - `xmlnode_or_jid`: `libxml2.xmlNode` or `JID` - `node`: `unicode` - `name`: `unicode` - `action`: `unicode` """ self.disco = disco if isinstance(xmlnode_or_jid, JID): if disco: self.xmlnode = disco.xmlnode.newChild(None, "item", None) else: self.xmlnode = common_root.newChild(None, "item", None) ns = self.xmlnode.newNs(DISCO_ITEMS_NS, None) self.xmlnode.setNs(ns) self.set_jid(xmlnode_or_jid) self.set_name(name) self.set_node(node) self.set_action(action) else: if disco is None: self.xmlnode = xmlnode_or_jid.copyNode(1) else: self.xmlnode = xmlnode_or_jid if name: self.set_name(name) if node: self.set_node(node) if action: self.set_action(action) self.xpath_ctxt = common_doc.xpathNewContext() self.xpath_ctxt.setContextNode(self.xmlnode) self.xpath_ctxt.xpathRegisterNs("d", DISCO_ITEMS_NS)
def __init__(self, disco, xmlnode_or_name, item_category=None, item_type=None, replace=False): """Initialize an `DiscoIdentity` object. :Parameters: - `disco`: the disco#info reply `self` is a part of. - `xmlnode_or_name`: XML element describing the identity or the name of the item described. - `item_category`: category of the item described. - `item_type`: type of the item described. - `replace`: if `True` than all other <identity/> elements in `disco` will be removed. :Types: - `disco`: `DiscoItems` - `xmlnode_or_name`: `libxml2.xmlNode` or `unicode` - `item_category`: `unicode` - `item_type`: `unicode` - `replace`: `bool` """ self.disco=disco if disco and replace: old=disco.xpath_ctxt.xpathEval("d:identity") if old: for n in old: n.unlinkNode() n.freeNode() if isinstance(xmlnode_or_name,libxml2.xmlNode): if disco is None: self.xmlnode=xmlnode_or_name.copyNode(1) else: self.xmlnode=xmlnode_or_name elif not item_category: raise ValueError,"DiscoInfo requires category" elif not item_type: raise ValueError,"DiscoInfo requires type" else: if disco: self.xmlnode=disco.xmlnode.newChild(None,"identity",None) else: self.xmlnode=common_root.newChild(None,"identity",None) ns=self.xmlnode.newNs(DISCO_INFO_NS,None) self.xmlnode.setNs(ns) self.set_name(xmlnode_or_name) self.set_category(item_category) self.set_type(item_type) self.xpath_ctxt=common_doc.xpathNewContext() self.xpath_ctxt.setContextNode(self.xmlnode) self.xpath_ctxt.xpathRegisterNs("d",DISCO_INFO_NS)
def xpath_eval(self,expr): """ Evaluate XPath expression in context of `self.xmlnode`. :Parameters: - `expr`: the XPath expression :Types: - `expr`: `unicode` :return: the result of the expression evaluation. :returntype: list of `libxml2.xmlNode` """ ctxt = common_doc.xpathNewContext() ctxt.setContextNode(self.xmlnode) ctxt.xpathRegisterNs("muc",self.ns.getContent()) ret=ctxt.xpathEval(to_utf8(expr)) ctxt.xpathFreeContext() return ret
def xpath_eval(self, expr): """ Evaluate XPath expression in context of `self.xmlnode`. :Parameters: - `expr`: the XPath expression :Types: - `expr`: `unicode` :return: the result of the expression evaluation. :returntype: list of `libxml2.xmlNode` """ ctxt = common_doc.xpathNewContext() ctxt.setContextNode(self.xmlnode) ctxt.xpathRegisterNs("muc", self.ns.getContent()) ret = ctxt.xpathEval(to_utf8(expr)) ctxt.xpathFreeContext() return ret
def __init__(self,disco,xmlnode_or_jid,node=None,name=None,action=None): """Initialize an `DiscoItem` object. :Parameters: - `disco`: the disco#items reply `self` is a part of. - `xmlnode_or_jid`: XML element describing the item or the JID of the item. - `node`: disco node of the item. - `name`: name of the item. - `action`: 'action' attribute of the item. :Types: - `disco`: `DiscoItems` - `xmlnode_or_jid`: `libxml2.xmlNode` or `JID` - `node`: `unicode` - `name`: `unicode` - `action`: `unicode` """ self.disco=disco if isinstance(xmlnode_or_jid,JID): if disco: self.xmlnode=disco.xmlnode.newChild(None,"item",None) else: self.xmlnode=common_root.newChild(None,"item",None) ns=self.xmlnode.newNs(DISCO_ITEMS_NS,None) self.xmlnode.setNs(ns) self.set_jid(xmlnode_or_jid) self.set_name(name) self.set_node(node) self.set_action(action) else: if disco is None: self.xmlnode=xmlnode_or_jid.copyNode(1) else: self.xmlnode=xmlnode_or_jid if name: self.set_name(name) if node: self.set_node(node) if action: self.set_action(action) self.xpath_ctxt=common_doc.xpathNewContext() self.xpath_ctxt.setContextNode(self.xmlnode) self.xpath_ctxt.xpathRegisterNs("d",DISCO_ITEMS_NS)
def xpath_eval(self,expr,namespaces=None): """Evaluate an XPath expression on the stanza XML node. The expression will be evaluated in context where the common namespace (the one used for stanza elements, mapped to 'jabber:client', 'jabber:server', etc.) is bound to prefix "ns" and other namespaces are bound accordingly to the `namespaces` list. :Parameters: - `expr`: XPath expression. - `namespaces`: mapping from namespace prefixes to URIs. :Types: - `expr`: `unicode` - `namespaces`: `dict` or other mapping """ ctxt = common_doc.xpathNewContext() ctxt.setContextNode(self.xmlnode) ctxt.xpathRegisterNs("ns",COMMON_NS) if namespaces: for prefix,uri in namespaces.items(): ctxt.xpathRegisterNs(unicode(prefix),uri) ret=ctxt.xpathEval(unicode(expr)) ctxt.xpathFreeContext() return ret