diff -r 000000000000 -r ca70ae20a155 src/tools/py2sis/ensymble/cmd_altere32.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tools/py2sis/ensymble/cmd_altere32.py Tue Feb 16 10:07:05 2010 +0530 @@ -0,0 +1,309 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +############################################################################## +# cmd_signsis.py - Ensymble command line tool, altere32 command +# Copyright 2006, 2007, 2008 Jussi Ylänen +# +# This file is part of Ensymble developer utilities for Symbian OS(TM). +# +# Ensymble 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. +# +# Ensymble 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 Ensymble; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +############################################################################## + +import sys +import os +import getopt +import locale +import struct + +import symbianutil + + +############################################################################## +# Help texts +############################################################################## + +shorthelp = 'Alter the IDs and capabilities of e32image files (EXEs, DLLs)' +longhelp = '''altere32 + [--uid=0x01234567] [--secureid=0x01234567] [--vendorid=0x01234567] + [--caps=Cap1+Cap2+...] [--heapsize=min,max] [--inplace] + [--encoding=terminal,filesystem] [--verbose] + [outfile] + +Alter the IDs, capabilities and heap sizes of e32image files (Symbian OS +EXEs and DLLs). + +Options: + infile - Path of the original e32image file (or many, if --inplace set) + outfile - Path of the modified e32image file (not used with --inplace) + uid - Symbian OS UID for the e32image + secureid - Secure ID for the e32image (should normally be same as UID) + vendorid - Vendor ID for the e32image + caps - Capability names, separated by "+" + heapsize - Heap size, minimum and/or maximum (not altered by default) + inplace - Allow more than one input file, modify input files in-place + encoding - Local character encodings for terminal and filesystem + verbose - Print extra statistics + +When modifying the UID, the secure ID should be modified accordingly. +Modifying UIDs of application EXEs is generally not possible, because +applications usually include the UID in program code as well. +''' + + +############################################################################## +# Parameters +############################################################################## + +MAXE32FILESIZE = 1024 * 1024 * 8 # Eight megabytes + + +############################################################################## +# Global variables +############################################################################## + +debug = False + + +############################################################################## +# Public module-level functions +############################################################################## + +def run(pgmname, argv): + global debug + + # Determine system character encodings. + try: + # getdefaultlocale() may sometimes return None. + # Fall back to ASCII encoding in that case. + terminalenc = locale.getdefaultlocale()[1] + "" + except TypeError: + # Invalid locale, fall back to ASCII terminal encoding. + terminalenc = "ascii" + + try: + # sys.getfilesystemencoding() was introduced in Python v2.3 and + # it can sometimes return None. Fall back to ASCII if something + # goes wrong. + filesystemenc = sys.getfilesystemencoding() + "" + except (AttributeError, TypeError): + filesystemenc = "ascii" + + try: + gopt = getopt.gnu_getopt + except: + # Python heapsizemax: + print ("%s: warning: minimum heap size larger than " + "maximum heap size" % pgmname) + else: + heapsizemin = None + heapsizemax = None + + # Determine parameter format. Modifying files in-place or not. + inplace = False + if "--inplace" in opts.keys() or "-i" in opts.keys(): + inplace = True + + # Determine e32image input / output file names. + files = [name.decode(terminalenc).encode(filesystemenc) for name in pargs] + if not inplace: + if len(files) == 2: + if os.path.isdir(files[1]): + # Output to directory, use input file name. + files[1] = os.path.join(files[1], os.path.basename(files[0])) + else: + raise ValueError("wrong number of arguments") + + # Determine verbosity. + verbose = False + if "--verbose" in opts.keys() or "-v" in opts.keys(): + verbose = True + + # Determine if debug output is requested. + if "--debug" in opts.keys(): + debug = True + + # Ingredients for successful e32image file alteration: + # + # terminalenc Terminal character encoding (autodetected) + # filesystemenc File system name encoding (autodetected) + # files File names of e32image files, filesystemenc encoded + # uid3 Application UID3, long integer or None + # secureid Secure ID, long integer or None + # vendorid Vendor ID, long integer or None + # caps, capmask Capability names and bitmask or None + # heapsizemin Heap that must be available for the app. to start or None + # heapsizemax Maximum amount of heap the app. can allocate or None + # inplace Multiple input files or single input / output pair + # verbose Boolean indicating verbose terminal output + + if verbose: + print + if not inplace: + print "Input e32image file %s" % ( + files[0].decode(filesystemenc).encode(terminalenc)) + print "Output e32image file %s" % ( + files[1].decode(filesystemenc).encode(terminalenc)) + else: + print "Input e32image file(s) %s" % " ".join( + [f.decode(filesystemenc).encode(terminalenc) for f in files]) + if uid3 != None: + print "UID 0x%08x" % uid3 + else: + print "UID " + if secureid != None: + print "Secure ID 0x%08x" % secureid + else: + print "Secure ID " + if vendorid != None: + print "Vendor ID 0x%08x" % vendorid + else: + print "Vendor ID " + if caps != None: + print "Capabilities 0x%x (%s)" % (capmask, caps) + else: + print "Capabilities " + if heapsizemin != None: + print "Heap size in bytes %d, %d" % (heapsizemin, heapsizemax) + else: + print "Heap size in bytes " + print + + if ((uid3, secureid, vendorid, caps, heapsizemin) == + (None, None, None, None, None)): + print "%s: no options set, doing nothing" % pgmname + return + + for infile in files: + # Read input e32image file. + f = file(infile, "rb") + instring = f.read(MAXE32FILESIZE + 1) + f.close() + + if len(instring) > MAXE32FILESIZE: + raise ValueError("input e32image file too large") + + # Modify the e32image header. + try: + outstring = symbianutil.e32imagecrc(instring, uid3, + secureid, vendorid, heapsizemin, + heapsizemax, capmask) + except ValueError: + raise ValueError("%s: not a valid e32image file" % infile) + + if not inplace: + outfile = files[1] + else: + outfile = infile + + # Write output e32image file. + f = file(outfile, "wb") + f.write(outstring) + f.close() + + if not inplace: + # While --inplace is not in effect, files[1] is the output + # file name, so must stop after one iteration. + break + + +############################################################################## +# Module-level functions which are normally only used by this module +############################################################################## + +def parseuid(pgmname, uid): + if uid.lower().startswith("0x"): + # Prefer hex UIDs with leading "0x". + uid = long(uid, 16) + else: + try: + if len(uid) == 8: + # Assuming hex UID even without leading "0x". + print ('%s: warning: assuming hex UID even ' + 'without leading "0x"' % pgmname) + uid = long(uid, 16) + else: + # Decimal UID. + uid = long(uid) + print ('%s: warning: decimal UID converted to 0x%08x' % + (pgmname, uid)) + except ValueError: + raise ValueError("invalid UID string '%s'" % uid) + return uid