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
py-transports@blathersource.org
http://www.modevia.com/cgi-bin/mailman/listinfo/py-transports

Reply via email to