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

source_changes at macosforge.org source_changes at macosforge.org
Thu Jul 3 15:23:20 PDT 2008


Revision: 2657
          http://trac.macosforge.org/projects/calendarserver/changeset/2657
Author:   sagen at apple.com
Date:     2008-07-03 15:23:19 -0700 (Thu, 03 Jul 2008)
Log Message:
-----------
Checkpoint of XMPP work -- now sending notifications in the form of an XMPP <message>.  Next stop: pubsub.

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

Modified: CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py
===================================================================
--- CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py	2008-07-03 02:09:14 UTC (rev 2656)
+++ CalendarServer/branches/users/sagen/xmpp/twistedcaldav/notify.py	2008-07-03 22:23:19 UTC (rev 2657)
@@ -415,49 +415,80 @@
 
 
 
-class XMPPNotifier(object):
+class XMPPNotifier(LoggingMixIn):
     implements(INotifier)
 
-    def __init__(self):
-        self.observers = set()
+    def __init__(self, reactor=None):
+        self.xmlStream = None
+        if reactor is None:
+            from twisted.internet import reactor
+        self.reactor = reactor
 
     def enqueue(self, uri):
-        pass
+        self.log_info("ENQUEUE %s" % (uri,))
+        if self.xmlStream is not None:
+            message = domish.Element(('jabber:client', 'message'))
+            message['to'] = 'some_jid'
+            message.addElement('body', None, uri)
+            self.xmlStream.send(message)
 
 
+    def streamOpened(self, xmlStream):
+        self.xmlStream = xmlStream
+
+    def streamClosed(self):
+        self.xmlStream = None
+
+
 class XMPPNotificationFactory(xmlstream.XmlStreamFactory, LoggingMixIn):
 
     def __init__(self, notifier, jid, password):
         self.notifier = notifier
         self.jid = jid
+        self.xmlStream = None
 
         xmlstream.XmlStreamFactory.__init__(self,
             BasicAuthenticator(JID(jid), password))
 
-        self.addBootstrap('//event/stream/authd', self.handleAuthSuccess)
-        self.addBootstrap('//event/stream/authe', self.handleAuthFailure)
-        self.addBootstrap('//event/client/basicauth/invaliduser',
-            self.handleAuthFailure)
-        self.addBootstrap('//event/client/basicauth/authfailed',
-            self.handleAuthFailure)
+        self.addBootstrap(xmlstream.STREAM_CONNECTED_EVENT, self.connected)
+        self.addBootstrap(xmlstream.STREAM_END_EVENT, self.disconnected)
+        self.addBootstrap(xmlstream.INIT_FAILED_EVENT, self.initFailed)
 
+        self.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, self.authenticated)
+        self.addBootstrap(BasicAuthenticator.INVALID_USER_EVENT,
+            self.authFailed)
+        self.addBootstrap(BasicAuthenticator.AUTH_FAILED_EVENT,
+            self.authFailed)
 
-    def handleAuthSuccess(self, xmlstream):
+    def connected(self, xmlStream):
+        self.xmlStream = xmlStream
+        self.log_info("XMPP connection successful")
+        # Log all traffic
+        xmlStream.rawDataInFn = self.rawDataIn
+        xmlStream.rawDataOutFn = self.rawDataOut
+
+    def disconnected(self, xmlStream):
+        self.notifier.streamClosed()
+        self.xmlStream = None
+        self.log_info("XMPP disconnected")
+
+    def initFailed(self, failure):
+        self.xmlStream = None
+        self.log_info("XMPP Initialization failed: %s" % (failure,))
+
+    def authenticated(self, xmlStream):
         self.log_info("XMPP authentication successful: %s" % (self.jid,))
-        self.xmlstream = xmlstream
-        presence = domish.Element(('jabber:client', 'presence'))
-        xmlstream.send(presence)
+        xmlStream.addObserver('/message', self.handleMessage)
+        xmlStream.addObserver('/presence', self.trafficLog)
+        xmlStream.addObserver('/iq', self.trafficLog)
+        self.sendPresence()
+        self.notifier.streamOpened(xmlStream)
 
-        xmlstream.addObserver('/message', self.handleMessage)
-        xmlstream.addObserver('/presence', self.trafficLog)
-        xmlstream.addObserver('/iq', self.trafficLog)
+    def authFailed(self, e):
+        self.log_error("Failed to log in XMPP (%s); check JID and password" %
+            (self.jid,))
 
-    def handleAuthFailure(self, e):
-        self.log_error("Failed to authenticate with XMPP: %s" % (e,))
-
     def handleMessage(self, elem):
-        self.log_info("GOT THIS")
-        self.trafficLog(elem)
         sender = JID(elem['from']).full()
         body = getattr(elem, 'body', None)
         if body:
@@ -466,17 +497,31 @@
             message.addChild(body)
             self.log_info("SENDING THIS")
             self.trafficLog(message)
-            self.xmlstream.send(message)
+            self.xmlStream.send(message)
 
+    def sendPresence(self):
+        if self.xmlStream is not None:
+            presence = domish.Element(('jabber:client', 'presence'))
+            self.xmlStream.send(presence)
+
     def trafficLog(self, elem):
         self.log_info(elem.toXml().encode('utf-8'))
 
 
+    def rawDataIn(self, buf):
+        self.log_info("RECV: %s" % unicode(buf, 'utf-8').encode('ascii', 'replace'))
 
 
+    def rawDataOut(self, buf):
+        self.log_info("SEND: %s" % unicode(buf, 'utf-8').encode('ascii', 'replace'))
 
 
 
+
+
+
+
+
 #
 # Notification Server service config
 #
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080703/8c5fe816/attachment.html 


More information about the calendarserver-changes mailing list