# HG changeset patch # User paulb # Date 1185640822 0 # Node ID 1b85754086d12463901adb29a06322c346e4dc67 # Parent e0d6321db79ce939d40358fbcc7fdb892d0ed19b [project @ 2007-07-28 16:40:22 by paulb] Improved XMPP/XEP-0022 (events) support, adding better message and presence handling. Updated release information. diff -r e0d6321db79c -r 1b85754086d1 libxml2dom/__init__.py --- a/libxml2dom/__init__.py Sat Jul 28 16:39:56 2007 +0000 +++ b/libxml2dom/__init__.py Sat Jul 28 16:40:22 2007 +0000 @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ -__version__ = "0.4.3" +__version__ = "0.4.4" from libxml2dom.macrolib import * from libxml2dom.macrolib import \ diff -r e0d6321db79c -r 1b85754086d1 libxml2dom/xmpp.py --- a/libxml2dom/xmpp.py Sat Jul 28 16:39:56 2007 +0000 +++ b/libxml2dom/xmpp.py Sat Jul 28 16:40:22 2007 +0000 @@ -57,6 +57,7 @@ XMPP_BIND_NAMESPACE = "urn:ietf:params:xml:ns:xmpp-bind" XMPP_CLIENT_NAMESPACE = "jabber:client" +XEP_0022_EVENT_NAMESPACE = "jabber:x:event" XMPP_REGISTER_NAMESPACE = "jabber:iq:register" XMPP_SASL_NAMESPACE = "urn:ietf:params:xml:ns:xmpp-sasl" XMPP_SESSION_NAMESPACE = "urn:ietf:params:xml:ns:xmpp-session" @@ -93,9 +94,18 @@ elif Node_namespaceURI(_node) == XMPP_CLIENT_NAMESPACE: if Node_localName(_node) == "iq": return XMPPIqElement(_node, self, context_node.ownerDocument) + elif Node_localName(_node) == "message": + return XMPPMessageElement(_node, self, context_node.ownerDocument) + elif Node_localName(_node) == "presence": + return XMPPPresenceElement(_node, self, context_node.ownerDocument) else: return XMPPClientElement(_node, self, context_node.ownerDocument) + # Make special event elements. + + elif Node_namespaceURI(_node) == XEP_0022_EVENT_NAMESPACE: + return XEP0022EventElement(_node, self, context_node.ownerDocument) + # Make special registration elements. elif Node_namespaceURI(_node) == XMPP_REGISTER_NAMESPACE: @@ -145,6 +155,7 @@ ns = { "bind" : XMPP_BIND_NAMESPACE, "client" : XMPP_CLIENT_NAMESPACE, + "event": XEP_0022_EVENT_NAMESPACE, "register" : XMPP_REGISTER_NAMESPACE, "sasl" : XMPP_SASL_NAMESPACE, "session" : XMPP_SESSION_NAMESPACE, @@ -180,7 +191,6 @@ b64value = base64.encodestring("%s\x00%s\x00%s" % (jid, username, password)) text = self.ownerDocument.createTextNode(b64value) self.appendChild(text) - mechanism = property(_mechanism, _setMechanism) value = property(_value) @@ -248,6 +258,63 @@ to = property(_to, _setTo, _delTo) type = property(_type, _setType, _delType) +class XMPPMessageElement(XMPPClientElement): + + "An XMPP message element." + + def _event(self): + return self.xpath(".//event:*")[0] + + def _body(self): + return self.xpath("./client:body")[0] + + def _setBody(self, body): + self.appendChild(body) + + def _delBody(self): + self.removeChild(self.body) + + def createBody(self): + return self.ownerDocument.createElementNS(XMPP_CLIENT_NAMESPACE, "body") + + body = property(_body, _setBody, _delBody) + event = property(_event) + +class XEP0022EventElement(XMPPNode): + + "An XEP-0022 event element." + + def _offline(self): + return bool(self.xpath("./event:offline")) + + def _delivered(self): + return bool(self.xpath("./event:delivered")) + + def _displayed(self): + return bool(self.xpath("./event:displayed")) + + def _composing(self): + return bool(self.xpath("./event:composing")) + + def _id(self): + ids = self.xpath("./event:id") + if ids: + return ids[0].textContent + else: + return None + + offline = property(_offline) + delivered = property(_delivered) + displayed = property(_displayed) + composing = property(_composing) + id = property(_id) + +class XMPPPresenceElement(XMPPClientElement): + + "An XMPP presence element." + + pass + class XMPPIqElement(XMPPClientElement): """ @@ -421,12 +488,12 @@ else: return doc.documentElement - def receive(self, timeout): + def receive(self, timeout=None): """ Wait for an incoming stanza, or as long as 'timeout' (in milliseconds), - returning either a stanza document (fragment) or None if nothing was - received. + or forever if 'timeout' is omitted or set to None, returning either a + stanza document (fragment) or None if nothing was received. """ if self._ready(timeout): @@ -445,6 +512,9 @@ def createMessage(self): return self.createStanza(XMPP_CLIENT_NAMESPACE, "message") + def createPresence(self): + return self.createStanza(XMPP_CLIENT_NAMESPACE, "presence") + def createStanza(self, namespaceURI, localName): return createXMPPStanza(namespaceURI, localName)