srcanamdw/codescanner/pyinstaller/ArchiveViewer.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
#! /usr/bin/env python
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
# Viewer for archives packaged by archive.py
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
# Copyright (C) 2005, Giovanni Bajo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# This program is free software; you can redistribute it and/or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# modify it under the terms of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
# as published by the Free Software Foundation; either version 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
# of the License, or (at your option) any later version.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
# This program is distributed in the hope that it will be useful,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
# GNU General Public License for more details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
# You should have received a copy of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
# along with this program; if not, write to the Free Software
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
import archive
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
import carchive
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
import sys, string, tempfile, os
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
    import zlib
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
except ImportError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
    zlib = archive.DummyZlib()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
import pprint
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
stack = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
cleanup = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
def main():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
    global stack
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
    name = sys.argv[1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
    arch = getArchive(name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
    stack.append((name, arch))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
    show(name, arch)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
    while 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
        toks = string.split(raw_input('? '), ' ', 1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
        if not toks:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
            usage()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
            continue
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
        if len(toks) == 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
            cmd = toks[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
            arg = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
            cmd, arg = toks
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
        cmd = string.upper(cmd)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
        if cmd == 'U':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
            if len(stack) > 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
                arch = stack[-1][1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
                arch.lib.close()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
                del stack[-1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
            nm, arch = stack[-1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
            show(nm, arch)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
        elif cmd == 'O':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
            if not arg:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
                arg = raw_input('open name? ')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
            arg = string.strip(arg)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
            arch = getArchive(arg)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
            if arch is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
                print arg, "not found"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
                continue
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
            stack.append((arg, arch))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
            show(arg, arch)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
        elif cmd == 'X':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
            if not arg:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
                arg = raw_input('extract name? ')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
            arg = string.strip(arg)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
            data = getData(arg, arch)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
            if data is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
                print "Not found"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
                continue
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
            fnm = raw_input('to filename? ')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
            if not fnm:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
                print `data`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
                open(fnm, 'wb').write(data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
        elif cmd == 'Q':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
            break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
            usage()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
    for (nm, arch) in stack:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
        arch.lib.close()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
    stack = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
    for fnm in cleanup:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
            os.remove(fnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
        except Exception, e:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
            print "couldn't delete", fnm, e.args
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
def usage():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
    print "U: go Up one level"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
    print "O <nm>: open embedded archive nm"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
    print "X <nm>: extract nm"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
    print "Q: quit"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
def getArchive(nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
    if not stack:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
        if string.lower(nm[-4:]) == '.pyz':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
            return ZlibArchive(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
        return carchive.CArchive(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
    parent = stack[-1][1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
        return parent.openEmbedded(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
    except KeyError, e:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
    except (ValueError, RuntimeError):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
        ndx = parent.toc.find(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
        dpos, dlen, ulen, flag, typcd, nm = parent.toc[ndx]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
        x, data = parent.extract(ndx)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
        tfnm = tempfile.mktemp()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
        cleanup.append(tfnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
        open(tfnm, 'wb').write(data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
        if typcd == 'z':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
            return ZlibArchive(tfnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
            return carchive.CArchive(tfnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
def getData(nm, arch):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
    if type(arch.toc) is type({}):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
        (ispkg, pos, lngth) = arch.toc.get(nm, (0, None, 0))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
        if pos is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
            return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
        arch.lib.seek(arch.start + pos)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
        return zlib.decompress(arch.lib.read(lngth))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
    ndx = arch.toc.find(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
    dpos, dlen, ulen, flag, typcd, nm = arch.toc[ndx]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
    x, data = arch.extract(ndx)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
    return data
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
def show(nm, arch):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
    if type(arch.toc) == type({}):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
        print " Name: (ispkg, pos, len)"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
        toc = arch.toc
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
        print " pos, length, uncompressed, iscompressed, type, name"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
        toc = arch.toc.data
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
    pprint.pprint(toc)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
class ZlibArchive(archive.ZlibArchive):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
    def checkmagic(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
        """ Overridable.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
            Check to see if the file object self.lib actually has a file
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
            we understand.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
        self.lib.seek(self.start)	#default - magic is at start of file
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
        if self.lib.read(len(self.MAGIC)) != self.MAGIC:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
            raise RuntimeError, "%s is not a valid %s archive file" \
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
              % (self.path, self.__class__.__name__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
        if self.lib.read(len(self.pymagic)) != self.pymagic:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
            print "Warning: pyz is from a different Python version"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
        self.lib.read(4)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
if __name__ == '__main__':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
    main()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155