srcanamdw/codescanner/pyinstaller/icon.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
# Copyright (C) 2005, Giovanni Bajo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
# This program is free software; you can redistribute it and/or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# modify it under the terms of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# as published by the Free Software Foundation; either version 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
# of the License, or (at your option) any later version.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
# This program is distributed in the hope that it will be useful,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
# GNU General Public License for more details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
# You should have received a copy of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
# along with this program; if not, write to the Free Software
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
# This code is courtesy of Thomas Heller, who
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
# has kindly donated it to this project.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
RT_ICON = 3
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
RT_GROUP_ICON = 14
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
LOAD_LIBRARY_AS_DATAFILE = 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
import struct
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
class Structure:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
    def __init__ (self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
        size = self._sizeInBytes = struct.calcsize (self._format_)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
        self._fields_ = list (struct.unpack (self._format_, '\000' * size))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
        indexes = self._indexes_ = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
        for i in range (len (self._names_)):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
            indexes[self._names_[i]] = i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
    def dump (self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
        print "I: DUMP of", self
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
        for name in self._names_:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
            if name[0] != '_':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
                print "I: %20s = %s" % (name, getattr (self, name))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
        print
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
    def __getattr__ (self, name):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
        if name in self._names_:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
            index = self._indexes_[name]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
            return self._fields_[index]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
            return self.__dict__[name]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
        except KeyError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
            raise AttributeError, name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
    def __setattr__ (self, name, value):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
        if name in self._names_:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
            index = self._indexes_[name]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
            self._fields_[index] = value
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
            self.__dict__[name] = value
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
    def tostring (self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
        return apply (struct.pack, [self._format_,] + self._fields_)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
    def fromfile (self, file):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
        data = file.read (self._sizeInBytes)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
        self._fields_ = list (struct.unpack (self._format_, data))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
class ICONDIRHEADER (Structure):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
    _names_ = "idReserved", "idType", "idCount"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
    _format_ = "hhh"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
class ICONDIRENTRY (Structure):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
    _names_ = "bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "dwImageOffset"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
    _format_ = "bbbbhhii"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
class GRPICONDIR (Structure):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
    _names_ = "idReserved", "idType", "idCount"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
    _format_ = "hhh"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
class GRPICONDIRENTRY (Structure):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
    _names_ = "bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "nID"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
    _format_ = "bbbbhhih"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
class IconFile:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
    def __init__ (self, path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
        self.path = path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
        file = open (path, "rb")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
        self.entries = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
        self.images = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
        header = self.header = ICONDIRHEADER()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
        header.fromfile (file)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
        for i in range (header.idCount):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
            entry = ICONDIRENTRY()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
            entry.fromfile (file)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
            self.entries.append (entry)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
        for e in self.entries:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
            file.seek (e.dwImageOffset, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
            self.images.append (file.read (e.dwBytesInRes))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
    def grp_icon_dir (self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
        return self.header.tostring()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
    def grp_icondir_entries (self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
        data = ""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
        i = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
        for entry in self.entries:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
            e = GRPICONDIRENTRY()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
            for n in e._names_[:-1]:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
                setattr(e, n, getattr (entry, n))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
            e.nID = i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
            i = i + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
            data = data + e.tostring()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
        return data
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
def CopyIcons_FromIco (dstpath, srcpath):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
    f = IconFile (srcpath)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
    print "I: Updating icons from", srcpath, "to", dstpath
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
    import win32api #, win32con
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
    hdst = win32api.BeginUpdateResource (dstpath, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
    data = f.grp_icon_dir()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
    data = data + f.grp_icondir_entries()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
    win32api.UpdateResource (hdst, RT_GROUP_ICON, 1, data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
    print "I: Writing RT_GROUP_ICON resource with %d bytes" % len (data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
    i = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
    for data in f.images:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
        win32api.UpdateResource (hdst, RT_ICON, i, data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
        print "I: Writing RT_ICON resource with %d bytes" % len (data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
        i = i + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
    win32api.EndUpdateResource (hdst, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
def CopyIcons (dstpath, srcpath):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
    import os.path, string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
    index = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
        srcpath, index = map (string.strip, string.split (srcpath, ','))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
        index = int (index)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
    except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
        pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
    print "I: PATH, INDEX", srcpath, index
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
    srcext = os.path.splitext (srcpath)[1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
    if string.lower (srcext) == '.ico':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
        return CopyIcons_FromIco (dstpath, srcpath)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
    if index is not None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
        print "I: Updating icons from", srcpath, ", %d to" % index, dstpath
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
        print "I: Updating icons from", srcpath, "to", dstpath
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
    import win32api #, win32con
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
    hdst = win32api.BeginUpdateResource (dstpath, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
    hsrc = win32api.LoadLibraryEx (srcpath, 0, LOAD_LIBRARY_AS_DATAFILE)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
    if index is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
        grpname = win32api.EnumResourceNames (hsrc, RT_GROUP_ICON)[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
    elif index >= 0:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
        grpname = win32api.EnumResourceNames (hsrc, RT_GROUP_ICON)[index]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
        grpname = -index
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
    data = win32api.LoadResource (hsrc, RT_GROUP_ICON, grpname)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
    win32api.UpdateResource (hdst, RT_GROUP_ICON, grpname, data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
    for iconname in win32api.EnumResourceNames (hsrc, RT_ICON):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
        data = win32api.LoadResource (hsrc, RT_ICON, iconname)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
        win32api.UpdateResource (hdst, RT_ICON, iconname, data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
    win32api.FreeLibrary (hsrc)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
    win32api.EndUpdateResource (hdst, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156