]> code.delx.au - pymsnt/blobdiff - src/tlib/msn/msn.py
Moved presence probe to session.py
[pymsnt] / src / tlib / msn / msn.py
index a644fc78bb6528d31a8e8009c0e4143afba63d09..0e82e6f65cd126f4a5e659b7b749bbb4ecec185e 100644 (file)
@@ -108,7 +108,7 @@ from twisted.xish.domish import unescapeFromXml
 from tlib import xmlw
 
 # System imports
-import types, operator, os, sys, base64, random, struct, random, sha, base64, StringIO, array, codecs
+import types, operator, os, sys, base64, random, struct, random, sha, base64, StringIO, array, codecs, binascii
 from urllib import quote, unquote
 
 
@@ -164,10 +164,10 @@ if DEBUGALL:
 
 P2PSEQ = [-3, -2, 0, -1, 1, 2, 3, 4, 5, 6, 7, 8]
 def p2pseq(n):
-       if n > 5:
-               return n - 3
-       else:
-               return P2PSEQ[n]
+    if n > 5:
+        return n - 3
+    else:
+        return P2PSEQ[n]
 
 
 def getVal(inp):
@@ -834,7 +834,12 @@ class MSNEventBase(LineReceiver):
         m = self.currentMessage
         self.currentMessage = None
         if MESSAGEDEBUG: log.msg(m.message)
-        if not self.checkMessage(m):
+        try:
+            if not self.checkMessage(m):
+                self.setLineMode(extra)
+                return
+        except Exception, e:
+            log.msg("Traceback - ERROR in checkMessage: " + str(e))
             self.setLineMode(extra)
             return
         self.gotMessage(m)
@@ -1040,16 +1045,17 @@ class NotificationClient(MSNEventBase):
         self.gotMSNAlert(bodytext, actionurl, subscrurl)
 
     def _gotUBX(self, message):
+        msnContact = self.factory.contacts.getContact(message.userHandle)
+        if not msnContact: return
         lm = message.message.lower()
         p1 = lm.find("<psm>") + 5
         p2 = lm.find("</psm>")
         if p1 >= 0 and p2 >= 0:
             personal = unescapeFromXml(message.message[p1:p2])
-            msnContact = self.factory.contacts.getContact(message.userHandle)
-            if not msnContact: return
             msnContact.personal = personal
             self.contactPersonalChanged(message.userHandle, personal)
         else:
+            msnContact.personal = ''
             self.contactPersonalChanged(message.userHandle, '')
 
     def checkMessage(self, message):
@@ -1143,7 +1149,7 @@ class NotificationClient(MSNEventBase):
             if MSNP2PDEBUG: log.msg("Updated MSNObject received!" + msnobjStr)
             msnContact.msnobj = msnobj
             msnContact.msnobjGot = False
-            self.contactAvatarChanged(msnContact.userHandle, msnContact.msnobj.sha1d)
+            self.contactAvatarChanged(msnContact.userHandle, binascii.hexlify(b64dec(msnContact.msnobj.sha1d)))
 
     def handle_CHL(self, params):
         checkParamLen(len(params), 2, 'CHL')
@@ -1363,7 +1369,7 @@ class NotificationClient(MSNEventBase):
             self.currentMessage = MSNMessage(length=messageLen, userHandle=params[0], screenName="UBX", specialMessage=True)
             self.setRawMode()
         else:
-            self.contactPersonalChanged(params[0], '')
+            self._gotUBX(MSNMessage(userHandle=params[0]))
 
     def handle_UUX(self, params):
         checkParamLen(len(params), 2, 'UUX')
@@ -1445,7 +1451,7 @@ class NotificationClient(MSNEventBase):
         contact.
 
         @param userHandle: contact who's msnobj has been changed
-        @param hash: sha1 hash of their avatar
+        @param hash: sha1 hash of their avatar as hex string
         """
 
     def statusChanged(self, statusCode):
@@ -2090,7 +2096,7 @@ class SwitchboardClient(MSNEventBase):
             cookie = info['Invitation-Cookie']
             filename = info['Application-File']
             filesize = int(info['Application-FileSize'])
-            connectivity = (info.get('Connectivity').lower() == 'y')
+            connectivity = (info.get('Connectivity', 'n').lower() == 'y')
         except KeyError:
             log.msg('Received munged file transfer request ... ignoring.')
             return 0
@@ -2712,8 +2718,7 @@ class SLPLink:
         reactor.callLater(0, kill)
 
     def warn(self, text):
-        if MSNP2PDEBUG:
-            log.msg("Warning in transfer: %s %s" % (self, text))
+        log.msg("Warning in transfer: %s %s" % (self, text))
 
     def sendP2PACK(self, ackHeaders):
         binaryFields = BinaryFields()
@@ -2779,21 +2784,19 @@ class SLPLink_Send(SLPLink):
     def write(self, data):
         if MSNP2PDEBUG: log.msg("write")
         i = 0
+        data = self.data + data
+        self.data = ""
         length = len(data)
         while i < length:
             if i + 1202 < length:
                 self._writeChunk(data[i:i+1202])
                 i += 1202
             else:
-                self.data += data[i:]
-                if len(self.data) >= 1202:
-                    data = self.data
-                    self.data = ""
-                    self.write(data)
+                self.data = data[i:]
                 return
 
     def _writeChunk(self, chunk):
-        log.msg("writing chunk")
+        if MSNP2PDEBUG: log.msg("writing chunk")
         binaryFields = BinaryFields()
         binaryFields[0] = self.sessionID
         if self.offset == 0:
@@ -2902,8 +2905,9 @@ class SLPLink_Receive(SLPLink):
         if binaryFields[4] != 4:
             self.warn("field4," + str(binaryFields[4]))
             return
-        if binaryFields[9] != 1:
-            self.warn("field9," + str(binaryFields[9]))
+        # Just ignore the footer
+        #if binaryFields[9] != 1:
+        #    self.warn("field9," + str(binaryFields[9]))
         #   return
 
         self.sendP2PACK(binaryFields)
@@ -2917,8 +2921,9 @@ class SLPLink_Receive(SLPLink):
         if binaryFields[5] != self.dataFlag:
             self.warn("field5," + str(binaryFields[5]))
             return
-        if binaryFields[9] != 1:
-            self.warn("field9," + str(binaryFields[9]))
+        # Just ignore the footer
+        #if binaryFields[9] != 1:
+        #    self.warn("field9," + str(binaryFields[9]))
         #   return
         offset = binaryFields[2]
         total = binaryFields[3]