[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