]> code.delx.au - pymsnt/blobdiff - src/tlib/msn/msn.py
P2P file transfers should be more reliable.
[pymsnt] / src / tlib / msn / msn.py
index 23464de54a96137ac2326eac9fb865307fcae7c0..66e3af8097e18e59c21451053cda0ad1b57c36ad 100644 (file)
@@ -154,7 +154,7 @@ STATUS_LUNCH   = 'LUN'
 
 PINGSPEED = 50.0
 
-DEBUGALL = False
+DEBUGALL = True
 LINEDEBUG = False
 MESSAGEDEBUG = False
 MSNP2PDEBUG = False
@@ -2117,14 +2117,16 @@ class SwitchboardClient(MSNEventBase):
         if not message.getHeader("P2P-Dest") == self.userHandle: return
         packet = message.message
         binaryFields = BinaryFields(packet=packet)
-        if binaryFields[0] != 0:
+        if binaryFields[5] == BinaryFields.BYEGOT:
+            pass # Ignore the ACKs to SLP messages
+        elif binaryFields[0] != 0:
             slpLink = self.slpLinks.get(binaryFields[0])
             if not slpLink:
                 # Link has been killed. Ignore
                 return
             if slpLink.remoteUser == message.userHandle:
                 slpLink.handlePacket(packet)
-        if binaryFields[5] == BinaryFields.ACK or binaryFields[5] == BinaryFields.BYEGOT:
+        elif binaryFields[5] == BinaryFields.ACK:
             pass # Ignore the ACKs to SLP messages
         else:
             slpMessage = MSNSLPMessage(packet)
@@ -2719,7 +2721,9 @@ class SLPLink:
         self.seqID = SeqID()
 
     def killLink(self):
+        if MSNP2PDEBUG: log.msg("killLink")
         def kill():
+            if MSNP2PDEBUG: log.msg("killLink - kill()")
             if not self.switchboard: return
             del self.switchboard.slpLinks[self.sessionID]
             self.switchboard = None
@@ -2862,7 +2866,7 @@ class SLPLink_FileSend(SLPLink_Send):
         else:
             if slpMessage.status == "603":
                 self.acceptDeferred.callback((False,))
-            # SLPLink is over due to decline, error or BYE
+            if MSNP2PDEBUG: log.msg("SLPLink is over due to decline, error or BYE")
             self.killLink()
 
     def wait_data_ack(self, packet):
@@ -2891,7 +2895,8 @@ class SLPLink_AvatarSend(SLPLink_Send):
         self.handlePacket = lambda packet: None
 
     def handleSLPMessage(self, slpMessage):
-        self.killLink() # BYE or error
+        if MSNP2PDEBUG: log.msg("BYE or error")
+        self.killLink()
 
     def close(self):
         SLPLink_Send.close(self)
@@ -2980,6 +2985,7 @@ class SLPLink_FileReceive(SLPLink_Receive, FileReceive):
         FileReceive.accept(self, consumer)
         if not self.switchboard: return
         self.sendSLPMessage("200", "application/x-msnmsgr-sessionreqbody", {"SessionID":self.sessionID}, branch=self.initialBranch)
+        self.handlePacket = self.wait_data # Moved here because sometimes the second INVITE seems to be skipped
 
     def handleSLPMessage(self, slpMessage):
         if slpMessage.method == "INVITE": # The second invite
@@ -2987,9 +2993,10 @@ class SLPLink_FileReceive(SLPLink_Receive, FileReceive):
                     "Listening"   : "false",\
                     "Hashed-Nonce": "{00000000-0000-0000-0000-000000000000}"}
             self.sendSLPMessage("200", "application/x-msnmsgr-transrespbody", data, branch=slpMessage.branch)
-            self.handlePacket = self.wait_data
+#            self.handlePacket = self.wait_data # Moved up
         else:
-            self.killLink() # It's either a BYE or an error
+            if MSNP2PDEBUG: log.msg("It's either a BYE or an error")
+            self.killLink()
             # FIXME, do some error handling if it was an error
 
     def doFinished(self):
@@ -3012,7 +3019,7 @@ class SLPLink_AvatarReceive(SLPLink_Receive):
         if slpMessage.status == "200":
             self.handlePacket = self.wait_dataprep
         else:
-            # SLPLink is over due to error or BYE
+            if MSNP2PDEBUG: log.msg("SLPLink is over due to error or BYE")
             self.killLink()
 
     def doFinished(self):