Sorry, and a 'import urllib' is required!
On 12/25/06, Lei Wang <[EMAIL PROTECTED]> wrote:
I changed the 'class FileContext' in src/legacy/msn.py as follows:
class FileContext:
""" Represents the Context field for P2P file transfers """
def __init__(self, data=""):
if data:
self.parse(data)
else:
self.filename = ""
self.filesize = 0
def pack(self):
if MSNP2PDEBUG: log.msg("FileContext packing:", self.filename,
self.filesize)
data = struct.pack("<LLQL", 638, 0x03, self.filesize, 0x01)
data = data[:-1] # Uck, weird, but it works
data += utf16net(self.filename)
data = ljust(data, 570, '\0')
data += struct.pack("<L", 0xFFFFFFFFL)
data = ljust(data, 638, '\0')
return data
def parse(self, packet):
self.filesize = struct.unpack("<Q", packet[8:16])[0]
chunk = packet[20:540]
chunk = chunk[:chunk.find('\x00\x00')+1]
self.filename = unicode((codecs. BOM_UTF16_LE +
chunk).decode("utf-16"))
if MSNP2PDEBUG: log.msg("FileContext parsed:", self.filesize,
self.filename)
And Methods in 'class FTReceive' in src/ft.py:
def oobMode(self):
def cb(el):
if el.getAttribute("type") != "result":
self.legacyftp.reject()
del self.legacyftp
self.session.pytrans.ftOOBReceive.remFile
(filename)
def ecb(ignored=None):
self.legacyftp.reject()
del self.legacyftp
LogEvent(INFO, self.ident)
filename = self.session.pytrans.ftOOBReceive.putFile(self,
self.legacyftp.filename)
iq = Element((None, "iq"))
iq.attributes["to"] = self.toJID
iq.attributes["from"] = self.senderJID
query = m.addElement("query")
query.attributes ["xmlns"] = disco.IQOOB
query.addElement("url").addContent(config.ftOOBRoot + "/"
+ urllib.quote(filename.encode('utf-8')))
d = self.session.send (iq)
d.addCallbacks(cb, ecb)
def messageOobMode(self):
LogEvent(INFO, self.ident)
filename = self.session.pytrans.ftOOBReceive.putFile(self,
self.legacyftp.filename )
m = Element((None, "message"))
m.attributes["to"] = self.session.jabberID
m.attributes["from"] = self.senderJID
m.addElement ("body").addContent(config.ftOOBRoot + "/" +
urllib.quote(filename.encode('utf-8')))
x = m.addElement("x")
x.attributes["xmlns"] = disco.XOOB
x.addElement("url").addContent(config.ftOOBRoot + "/" +
urllib.quote(filename.encode('utf-8')))
self.session.pytrans.send(m)
And 'class FileTransferOOBReceive' in src/ft.py:
class FileTransferOOBReceive(resource.Resource):
def __init__(self, port):
LogEvent(INFO)
self.isLeaf = True
self.files = {}
self.oobSite = server.Site(self)
reactor.listenTCP(port, self.oobSite)
def putFile(self, file, filename):
path = str(random.randint(100000000, 999999999))
filename = (path + "/" + filename).replace("//", "/")
self.files[filename] = file
return filename
def remFile(self, filename):
if self.files.has_key(filename):
del self.files[filename]
def render_GET(self, request):
filename = request.path[1:] # Remove the leading /
if not self.files.has_key(filename):
filename =
unicode(urllib.unquote(filename).decode('utf-8'))
if self.files.has_key(filename):
file = self.files[filename]
low_lever_browser = False
try:
if request.getHeader('User-Agent').find('MSIE')
!= -1:
low_lever_browser = True
except:
pass
request.setHeader("Content-Length", str(
file.legacyftp.filesize))
if low_lever_browser:
request.setHeader("Content-Disposition",
"attachment; filename=\"%s\"" % urllib.quote(
file.legacyftp.filename.encode("utf-8")))
else:
request.setHeader("Content-Disposition",
"attachment; filename*=\"%s\"" % urllib.quote(
file.legacyftp.filename.encode("utf-8")))
OOBReceiveConnector(file, request)
del self.files[filename]
return server.NOT_DONE_YET
else:
page = error.NoResource(message="404 File Not
Found")
return page.render(request)
def render_HEAD(self, request):
filename = request.path[1:] # Remove the leading /
if not self.files.has_key(filename):
filename =
unicode(urllib.unquote(filename).decode('utf-8'))
if self.files.has_key(filename):
file = self.files[filename]
low_lever_browser = False
try:
if request.getHeader('User-Agent').find('MSIE')
!= -1:
low_lever_browser = True
except:
pass
request.setHeader("Content-Length", str(
file.legacyftp.filesize))
if low_lever_browser:
request.setHeader("Content-Disposition",
"attachment; filename=\"%s\"" % urllib.quote(
file.legacyftp.filename.encode("utf-8")))
else:
request.setHeader("Content-Disposition",
"attachment; filename*=\"%s\"" % urllib.quote(
file.legacyftp.filename.encode("utf-8")))
return ""
else:
page = error.NoResource(message="404 File Not
Found")
return page.render(request)
And it works now.
_______________________________________________
py-transports mailing list
[email protected]
http://www.modevia.com/cgi-bin/mailman/listinfo/py-transports