bin/rom.py
changeset 8 02a1dd166f2b
child 9 a03989fb355a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/rom.py	Tue Jul 06 14:53:09 2010 +0300
@@ -0,0 +1,217 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# ============================================================================
+#  Name        : rom.py
+#  Part of     : Hb
+#  Description : Hb themes script for generating IBY files
+#  Version     : %version: %
+#
+#  Copyright (c) 2008-2010 Nokia.  All rights reserved.
+#  This material, including documentation and any related computer
+#  programs, is protected by copyright controlled by Nokia.  All
+#  rights are reserved.  Copying, including reproducing, storing,
+#  adapting or translating, any or all of this material requires the
+#  prior written consent of Nokia.  This material also contains
+#  confidential information which may not be disclosed to others
+#  without the prior written consent of Nokia.
+# ============================================================================
+
+import os
+import sys
+import fnmatch
+import zipfile
+import optparse
+import posixpath
+
+# ============================================================================
+# Globals
+# ============================================================================
+VERBOSE = False
+INCLUDE = None
+EXCLUDE = None
+INPUT_DIR = os.getcwd()
+OUTPUT_DIR = os.getcwd()
+SOURCE_PREFIX = "ZRESOURCE/hb/themes"
+TARGET_PREFIX = "RESOURCE_FILES_DIR/hb/themes"
+EXIT_STATUS = 0
+
+# ============================================================================
+# OptionParser
+# ============================================================================
+class OptionParser(optparse.OptionParser):
+    def __init__(self):
+        optparse.OptionParser.__init__(self)
+        self.add_option("-v", "--verbose", action="store_true", dest="verbose",
+                        help="print verbose information about each step of the sync process")
+        self.add_option("-q", "--quiet", action="store_false", dest="verbose",
+                        help="do not print information about each step of the sync process")
+
+        group = optparse.OptionGroup(self, "Input/output options")
+        group.add_option("-i", "--input", dest="input", metavar="dir",
+                         help="specify the input <dir> (default %s)" % INPUT_DIR)
+        group.add_option("-o", "--output", dest="output", metavar="dir",
+                         help="specify the output <dir> (default %s)" % OUTPUT_DIR)
+        group.add_option("--include", dest="include", action="append", metavar="pattern",
+                         help="specify the include <pattern> (default %s)" % INCLUDE)
+        group.add_option("--exclude", dest="exclude", action="append", metavar="pattern",
+                         help="specify the exclude <pattern> (default %s)" % EXCLUDE)
+        self.add_option_group(group)
+
+        group = optparse.OptionGroup(self, "Prefix options")
+        group.add_option("--source-prefix", dest="sourceprefix", metavar="prefix",
+                         help="specify the source <prefix> (default %s)" % SOURCE_PREFIX)
+        group.add_option("--target-prefix", dest="targetprefix", metavar="prefix",
+                         help="specify the target <prefix> (default %s)" % TARGET_PREFIX)
+        self.add_option_group(group)
+
+# ============================================================================
+# Utils
+# ============================================================================
+if not hasattr(os.path, "relpath"):
+    def relpath(path, start=os.curdir):
+        abspath = os.path.abspath(path)
+        absstart = os.path.abspath(start)
+        if abspath == absstart:
+            return "."
+        i = len(absstart)
+        if not absstart.endswith(os.path.sep):
+            i += len(os.path.sep)
+        if not abspath.startswith(absstart):
+            i = 0
+        return abspath[i:]
+    os.path.relpath = relpath
+
+def zip_filelist(filepath):
+    files = list()
+    archive = zipfile.ZipFile(filepath)
+    for entry in archive.namelist():
+        if not entry.endswith("/"):
+            files.append(entry)
+    return files
+
+class Theme:
+    def __init__(self, name):
+        self.name = name
+        self.paths = []
+        self.files = {}
+        self.archives = {}
+
+    def initialize(self):
+        for path in self.paths:
+            for root, dirs, files in os.walk(path):
+                for file in files:
+                    filepath = posixpath.join(root, file).replace("\\", "/")
+                    if self._include(filepath):
+                        extension = os.path.splitext(filepath)[1]
+                        if extension == ".zip":
+                            if root not in self.archives:
+                                self.archives[root] = list()
+                            self.archives[root].append(filepath)
+                        else:
+                            if root not in self.files:
+                                self.files[root] = list()
+                            self.files[root].append(filepath)
+
+    def write_iby(self, ibypath):
+        global SOURCE_PREFIX, TARGET_PREFIX, EXIT_STATUS
+        outpath = os.path.dirname(ibypath)
+        if not os.path.exists(outpath):
+            os.makedirs(outpath)
+        out = open(ibypath, "w")
+        out.write("#ifndef __%s_IBY__\n" % self.name.upper())
+        out.write("#define __%s_IBY__\n" % self.name.upper())
+        out.write("\n")
+        out.write("#include <bldvariant.hrh>\n")
+        out.write("\n")
+        out.write("data=%s/%s.themeindex\t%s/%s.themeindex\n" % (SOURCE_PREFIX, self.name, TARGET_PREFIX, self.name))
+        written_entries = list()
+        for path, files in self.files.iteritems():
+            relpath = os.path.relpath(path, INPUT_DIR).replace("\\", "/")
+            for filepath in files:
+                filename = os.path.basename(filepath)
+                entry = posixpath.join(relpath, filename)
+                if entry not in written_entries:
+                    written_entries.append(filepath)
+                    out.write("data=%s/%s\t%s/%s\n" % (SOURCE_PREFIX, entry, TARGET_PREFIX, entry))
+                else:
+                    print "ERROR: %s duplicate entry %s" % (ibypath, entry)
+                    EXIT_STATUS = -1
+        for path, archives in self.archives.iteritems():
+            relpath = os.path.relpath(path, INPUT_DIR).replace("\\", "/")
+            for archive in archives:
+                files = zip_filelist(archive)
+                for filepath in files:
+                    entry = posixpath.join(relpath, filepath)
+                    if entry not in written_entries:
+                        written_entries.append(entry)
+                        out.write("data=%s/%s\t%s/%s\n" % (SOURCE_PREFIX, entry, TARGET_PREFIX, entry))
+                    else:
+                        print "ERROR: %s duplicate entry %s" % (ibypath, entry)
+                        EXIT_STATUS = -1
+        out.write("\n")
+        out.write("#endif __%s_IBY__\n" % self.name.upper())
+        out.close()
+
+    def _include(self, filepath):
+        result = True
+        if INCLUDE != None:
+            for pattern in INCLUDE:
+                if not fnmatch.fnmatch(filepath, pattern):
+                    result = False
+        if EXCLUDE != None:
+            for pattern in EXCLUDE:
+                if fnmatch.fnmatch(filepath, pattern):
+                    result = False
+        return result
+
+def lookup_themes(path):
+    themes = {}
+    if os.path.exists(path):
+        # base: effects, icons...
+        for base in os.listdir(path):
+            basepath = posixpath.join(path, base)
+            if os.path.isdir(basepath):
+                # theme: footheme, bartheme...
+                for theme in os.listdir(basepath):
+                    themepath = posixpath.join(basepath, theme)
+                    if os.path.isdir(themepath):
+                        if theme not in themes:
+                            themes[theme] = Theme(theme)
+                        themes[theme].paths.append(themepath)
+    return themes
+
+# ============================================================================
+# main()
+# ============================================================================
+def main():
+    global VERBOSE, INPUT_DIR, OUTPUT_DIR, INCLUDE, EXCLUDE, SOURCE_PREFIX, TARGET_PREFIX
+
+    parser = OptionParser()
+    (options, args) = parser.parse_args()
+
+    if options.verbose != None:
+        VERBOSE = options.verbose
+    if options.input != None:
+        INPUT_DIR = options.input
+    if options.output != None:
+        OUTPUT_DIR = options.output
+    if options.include != None:
+        INCLUDE = options.include
+    if options.exclude != None:
+        EXCLUDE = options.exclude
+    if options.sourceprefix != None:
+        SOURCE_PREFIX = options.sourceprefix
+    if options.targetprefix != None:
+        TARGET_PREFIX = options.targetprefix
+
+    themes = lookup_themes(INPUT_DIR)
+    for name, theme in themes.iteritems():
+        theme.initialize()
+        print "Generating: %s.iby" % name
+        theme.write_iby(posixpath.join(OUTPUT_DIR, "%s.iby" % name))
+
+    return EXIT_STATUS
+
+if __name__ == "__main__":
+    sys.exit(main())