srcanamdw/codescanner/pyinstaller/ArchiveViewer.py
changeset 1 22878952f6e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanamdw/codescanner/pyinstaller/ArchiveViewer.py	Thu Feb 18 12:29:02 2010 +0530
@@ -0,0 +1,155 @@
+#! /usr/bin/env python
+# Viewer for archives packaged by archive.py
+# Copyright (C) 2005, Giovanni Bajo
+# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+import archive
+import carchive
+import sys, string, tempfile, os
+try:
+    import zlib
+except ImportError:
+    zlib = archive.DummyZlib()
+import pprint
+
+stack = []
+cleanup = []
+
+def main():
+    global stack
+    name = sys.argv[1]
+    arch = getArchive(name)
+    stack.append((name, arch))
+    show(name, arch)
+
+    while 1:
+        toks = string.split(raw_input('? '), ' ', 1)
+        if not toks:
+            usage()
+            continue
+        if len(toks) == 1:
+            cmd = toks[0]
+            arg = ''
+        else:
+            cmd, arg = toks
+        cmd = string.upper(cmd)
+        if cmd == 'U':
+            if len(stack) > 1:
+                arch = stack[-1][1]
+                arch.lib.close()
+                del stack[-1]
+            nm, arch = stack[-1]
+            show(nm, arch)
+        elif cmd == 'O':
+            if not arg:
+                arg = raw_input('open name? ')
+            arg = string.strip(arg)
+            arch = getArchive(arg)
+            if arch is None:
+                print arg, "not found"
+                continue
+            stack.append((arg, arch))
+            show(arg, arch)
+        elif cmd == 'X':
+            if not arg:
+                arg = raw_input('extract name? ')
+            arg = string.strip(arg)
+            data = getData(arg, arch)
+            if data is None:
+                print "Not found"
+                continue
+            fnm = raw_input('to filename? ')
+            if not fnm:
+                print `data`
+            else:
+                open(fnm, 'wb').write(data)
+        elif cmd == 'Q':
+            break
+        else:
+            usage()
+    for (nm, arch) in stack:
+        arch.lib.close()
+    stack = []
+    for fnm in cleanup:
+        try:
+            os.remove(fnm)
+        except Exception, e:
+            print "couldn't delete", fnm, e.args
+def usage():
+    print "U: go Up one level"
+    print "O <nm>: open embedded archive nm"
+    print "X <nm>: extract nm"
+    print "Q: quit"
+def getArchive(nm):
+    if not stack:
+        if string.lower(nm[-4:]) == '.pyz':
+            return ZlibArchive(nm)
+        return carchive.CArchive(nm)
+    parent = stack[-1][1]
+    try:
+        return parent.openEmbedded(nm)
+    except KeyError, e:
+        return None
+    except (ValueError, RuntimeError):
+        ndx = parent.toc.find(nm)
+        dpos, dlen, ulen, flag, typcd, nm = parent.toc[ndx]
+        x, data = parent.extract(ndx)
+        tfnm = tempfile.mktemp()
+        cleanup.append(tfnm)
+        open(tfnm, 'wb').write(data)
+        if typcd == 'z':
+            return ZlibArchive(tfnm)
+        else:
+            return carchive.CArchive(tfnm)
+
+def getData(nm, arch):
+    if type(arch.toc) is type({}):
+        (ispkg, pos, lngth) = arch.toc.get(nm, (0, None, 0))
+        if pos is None:
+            return None
+        arch.lib.seek(arch.start + pos)
+        return zlib.decompress(arch.lib.read(lngth))
+    ndx = arch.toc.find(nm)
+    dpos, dlen, ulen, flag, typcd, nm = arch.toc[ndx]
+    x, data = arch.extract(ndx)
+    return data
+
+def show(nm, arch):
+    if type(arch.toc) == type({}):
+        print " Name: (ispkg, pos, len)"
+        toc = arch.toc
+    else:
+        print " pos, length, uncompressed, iscompressed, type, name"
+        toc = arch.toc.data
+    pprint.pprint(toc)
+
+class ZlibArchive(archive.ZlibArchive):
+    def checkmagic(self):
+        """ Overridable.
+            Check to see if the file object self.lib actually has a file
+            we understand.
+        """
+        self.lib.seek(self.start)	#default - magic is at start of file
+        if self.lib.read(len(self.MAGIC)) != self.MAGIC:
+            raise RuntimeError, "%s is not a valid %s archive file" \
+              % (self.path, self.__class__.__name__)
+        if self.lib.read(len(self.pymagic)) != self.pymagic:
+            print "Warning: pyz is from a different Python version"
+        self.lib.read(4)
+
+if __name__ == '__main__':
+    main()
+