+class SLPLink_FileSend(SLPLink_Send):
+ def __init__(self, remoteUser, switchboard, filename, filesize):
+ SLPLink_Send.__init__(self, remoteUser=remoteUser, switchboard=switchboard, filesize=filesize)
+ self.dataFlag = BinaryFields.DATAFT
+ # Send invite & wait for 200OK before sending dataprep
+ context = FileContext()
+ context.filename = filename
+ context.filesize = filesize
+ data = {"EUF-GUID" : MSN_MSNFTP_GUID,\
+ "SessionID": self.sessionID,\
+ "AppID" : 2,\
+ "Context" : context.pack() }
+ self.sendSLPMessage("INVITE", "application/x-msnmsgr-sessionreqbody", data)
+ self.acceptDeferred = Deferred()
+
+ def handleSLPMessage(self, slpMessage):
+ if slpMessage.status == "200":
+ if slpMessage.ctype == "application/x-msnmsgr-sessionreqbody":
+ data = {"Bridges" : "TRUDPv1 TCPv1",\
+ "NetID" : "0",\
+ "Conn-Type" : "Firewall",\
+ "UPnPNat" : "false",\
+ "ICF" : "true",}
+ #"Hashed-Nonce": random_guid()}
+ self.sendSLPMessage("INVITE", "application/x-msnmsgr-transreqbody", data)
+ elif slpMessage.ctype == "application/x-msnmsgr-transrespbody":
+ self.acceptDeferred.callback((True,))
+ self.handlePacket = self.wait_data_ack
+ else:
+ if slpMessage.status == "603":
+ self.acceptDeferred.callback((False,))
+ if MSNP2PDEBUG: log.msg("SLPLink is over due to decline, error or BYE")
+ self.data = ""
+ self.killLink()
+
+ def wait_data_ack(self, packet):
+ if MSNP2PDEBUG: log.msg("wait_data_ack")
+ binaryFields = BinaryFields()
+ binaryFields.unpackFields(packet)
+
+ if binaryFields[5] != BinaryFields.ACK:
+ self.warn("field5," + str(binaryFields[5]))
+ return
+
+ self.sendSLPMessage("BYE", "application/x-msnmsgr-sessionclosebody", {})
+ self.handlePacket = None
+
+ def close(self):
+ self.handlePacket = self.wait_data_ack
+ SLPLink_Send.close(self)
+
+
+class SLPLink_AvatarSend(SLPLink_Send):
+ def __init__(self, remoteUser, switchboard, filesize, sessionID=None, sessionGuid=None):
+ SLPLink_Send.__init__(self, remoteUser=remoteUser, switchboard=switchboard, filesize=filesize, sessionID=sessionID, sessionGuid=sessionGuid)
+ self.dataFlag = BinaryFields.DATA
+ self.sendSLPMessage("200", "application/x-msnmsgr-sessionreqbody", {"SessionID":self.sessionID})
+ self.send_dataprep()
+ self.handlePacket = lambda packet: None
+
+ def handleSLPMessage(self, slpMessage):
+ if MSNP2PDEBUG: log.msg("BYE or error")
+ self.killLink()
+
+ def close(self):
+ SLPLink_Send.close(self)
+ # Keep the link open to wait for a BYE