[CalendarServer-changes] [2766] CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify. py

source_changes at macosforge.org source_changes at macosforge.org
Thu Jul 31 19:34:25 PDT 2008


Revision: 2766
          http://trac.macosforge.org/projects/calendarserver/changeset/2766
Author:   sagen at apple.com
Date:     2008-07-31 19:34:24 -0700 (Thu, 31 Jul 2008)
Log Message:
-----------
Auto-subscription working

No need to set TestJID anymore, nor manually subscribe both JIDs to eachother.
Multiple XMPP clients can be monitoring the debug activity as well.

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py

Modified: CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py
===================================================================
--- CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py	2008-07-31 23:36:25 UTC (rev 2765)
+++ CalendarServer/branches/users/sagen/xmpp-2764/twistedcaldav/notify.py	2008-08-01 02:34:24 UTC (rev 2766)
@@ -479,7 +479,7 @@
         self.reactor = reactor
         self.config = configOverride or config
 
-        self.sendDebugMessages = False
+        self.roster = {}
 
     def enqueue(self, uri):
         if self.xmlStream is not None:
@@ -496,6 +496,11 @@
             pubsubElement = iq.addElement('pubsub', defaultUri=self.pubsubNS)
             publishElement = pubsubElement.addElement('publish')
             publishElement['node'] = nodeName
+            # itemElement = publishElement.addElement('item')
+            # payloadElement = itemElement.addElement('item')
+            # payloadElement['id'] = '0'
+            # payloadElement.addContent('xyzzy')
+            self.sendDebug("Publishing (%s)" % (nodeName,), iq)
             iq.addCallback(self.responseFromPublish, nodeName)
             iq.send(to=self.settings['ServiceAddress'])
 
@@ -588,7 +593,7 @@
                                         filledField['type'] = field['type']
                                         valueElement = filledField.addElement('value')
                                         valueElement.addContent(value)
-                                        filledForm.addChild(field)
+                                        # filledForm.addChild(field)
                         filledIq.addCallback(self.responseFromConfiguration,
                             nodeName)
                         self.sendDebug("Sending configuration form (%s)"
@@ -612,27 +617,89 @@
             self.sendError("Failed to configure node (%s)" % (nodeName,), iq)
 
 
+    def requestRoster(self):
+        self.roster = {}
+        rosterIq = IQ(self.xmlStream, type='get')
+        rosterIq.addElement("query", "jabber:iq:roster")
+        rosterIq.addCallback(self.handleRoster)
+        rosterIq.send()
+
+    def handleRoster(self, iq):
+        for child in iq.children[0].children:
+            jid = child['jid']
+            self.log_info("In roster: %s" % (jid,))
+            if not self.roster.has_key(jid):
+                self.roster[jid] = { 'debug' : False, 'available' : False }
+
+    def handlePresence(self, iq):
+        self.log_info("Presence IQ: %s" %
+            (iq.toXml().encode('ascii', 'replace')),)
+        presenceType = iq.getAttribute('type')
+
+        if presenceType == 'subscribe':
+            frm = JID(iq['from']).userhost()
+            self.roster[frm] = { 'debug' : False, 'available' : True }
+            response = domish.Element(('jabber:client', 'presence'))
+            response['to'] = iq['from']
+            response['type'] = 'subscribed'
+            self.xmlStream.send(response)
+
+            # request subscription as well
+            subscribe = domish.Element(('jabber:client', 'presence'))
+            subscribe['to'] = iq['from']
+            subscribe['type'] = 'subscribe'
+            self.xmlStream.send(subscribe)
+
+        elif presenceType == 'unsubscribe':
+            frm = JID(iq['from']).userhost()
+            if self.roster.has_key(frm):
+                del self.roster[frm]
+            response = domish.Element(('jabber:client', 'presence'))
+            response['to'] = iq['from']
+            response['type'] = 'unsubscribed'
+            self.xmlStream.send(response)
+
+            # remove from roster as well
+            removal = IQ(self.xmlStream, type='set')
+            query = removal.addElement("query", "jabber:iq:roster")
+            query.addElement("item")
+            query.item["jid"] = iq["from"]
+            query.item["subscription"] = "remove"
+            removal.send()
+
+        elif presenceType == 'unavailable':
+            frm = JID(iq['from']).userhost()
+            if self.roster.has_key(frm):
+                self.roster[frm]['available'] = False
+
+        else:
+            frm = JID(iq['from']).userhost()
+            if self.roster.has_key(frm):
+                self.roster[frm]['available'] = True
+            else:
+                self.roster[frm] = { 'debug' : False, 'available' : True }
+
     def streamOpened(self, xmlStream):
         self.xmlStream = xmlStream
         xmlStream.addObserver('/message', self.handleMessage)
+        xmlStream.addObserver('/presence', self.handlePresence)
+        self.requestRoster()
 
+
     def streamClosed(self):
         self.xmlStream = None
 
     def sendDebug(self, txt, element):
-        if self.sendDebugMessages:
-            testJid = self.settings.get("TestJID", "")
-            if testJid:
-                txt = "DEBUG: %s %s" % (txt, element.toXml().encode('ascii',
-                    'replace'))
-                self.sendAlert(testJid, txt)
+        txt = "DEBUG: %s %s" % (txt, element.toXml().encode('ascii', 'replace'))
+        for jid, info in self.roster.iteritems():
+            if info['available'] and info['debug']:
+                self.sendAlert(jid, txt)
 
     def sendError(self, txt, element):
-        testJid = self.settings.get("TestJID", "")
-        if testJid:
-            txt = "ERROR: %s %s" % (txt, element.toXml().encode('ascii',
-                'replace'))
-            self.sendAlert(testJid, txt)
+        txt = "ERROR: %s %s" % (txt, element.toXml().encode('ascii', 'replace'))
+        for jid, info in self.roster.iteritems():
+            if info['available']:
+                self.sendAlert(jid, txt)
 
     def sendAlert(self, jid, txt):
         if self.xmlStream is not None:
@@ -645,14 +712,17 @@
         body = getattr(iq, 'body', None)
         if body:
             response = None
+            frm = JID(iq['from']).userhost()
             txt = str(body).lower()
             if txt == "help":
                 response = "debug on, debug off"
+            elif txt == "roster":
+                response = "Roster: %s" % (str(self.roster),)
             elif txt == "debug on":
-                self.sendDebugMessages = True
+                self.roster[frm]['debug'] = True
                 response = "Debugging on"
             elif txt == "debug off":
-                self.sendDebugMessages = False
+                self.roster[frm]['debug'] = False
                 response = "Debugging off"
             else:
                 response = "I don't understand.  Try 'help'."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080731/d4c95d79/attachment.html 


More information about the calendarserver-changes mailing list