def timeout():
self.timeout = None
if not d.called:
- d.errback()
+ d.errback(Exception("Timeout"))
self.logOut() # Clean up everything
self.timeout = reactor.callLater(30, timeout)
dispatchFactory = msn.DispatchFactory()
def _sendSavedEvents(self):
self.savedEvents.send(self)
- self.savedEvents = None
def _notificationClientReady(self, notificationClient):
self.notificationClient = notificationClient
if self.notificationClient:
LogEvent(INFO, self.ident)
self.notificationClient.changeAvatar(imageData, push=True)
- else:
- self.savedEvents.avatarImageData = imageData
+ # Save the avatar for reuse on disconnection
+ self.savedEvents.avatarImageData = imageData
def changeStatus(self, statusCode, screenName, personal):
"""
self.notificationClient.changeStatus(statusCode.encode("utf-8")).addCallback(cb)
self.notificationClient.changeScreenName(screenName.encode("utf-8")).addCallback(cb)
self.notificationClient.changePersonalMessage(personal.encode("utf-8")).addCallback(cb)
- else:
- self.savedEvents.statusCode = statusCode
- self.savedEvents.screenName = screenName
- self.savedEvents.personal = personal
+ # Remember the saved status
+ self.savedEvents.statusCode = statusCode
+ self.savedEvents.screenName = screenName
+ self.savedEvents.personal = personal
def addContact(self, listType, userHandle):
""" See msn.NotificationClient.addContact """
class NotificationClient(msn.NotificationClient):
+ def doDisconnect(self, *args):
+ if hasattr(self, "transport") and self.transport:
+ self.transport.loseConnection()
+
def loginFailure(self, message):
self.factory.msncon.loginFailed(message)
def logOut(self):
msn.NotificationClient.logOut(self)
+ # If we explicitly log out, then all of these events
+ # are now redundant
+ self.loginFailure = self.doDisconnect
+ self.loggedIn = self.doDisconnect
+ self.connectionLost = self.doDisconnect
def connectionLost(self, reason):
- if not self.factory.msncon: return # If we called logOut
def wait():
LogEvent(INFO, self.factory.msncon.ident)
msn.NotificationClient.connectionLost(self, reason)
- self.factory.msncon.connectionLost(reason)
+ if self.factory.maxRetries >= self.factory.retries:
+ self.factory.msncon.connectionLost(reason)
# Make sure this event is handled after any others
reactor.callLater(0, wait)
self.ready = False
def __del__(self):
+ self.ready = False
LogEvent(INFO, self.ident)
del self.msncon
self.transport.disconnect()
+
+ def connectionLost(self, reason):
+ self.ready = False
+ self.msncon = None
+ self.msnobj = None
+ self.ident = (self.ident[0], self.ident[1] + " Disconnected!")
def loggedIn(self):
LogEvent(INFO, self.ident)