src/hbservers/themeindexer/main.cpp
changeset 2 06ff229162e9
parent 1 f7ac710697a9
child 3 11d3954df52a
child 4 ae1717029441
--- a/src/hbservers/themeindexer/main.cpp	Mon May 03 12:48:33 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,415 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (developer.feedback@nokia.com)
-**
-** This file is part of the HbServers module of the UI Extensions for Mobile.
-**
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at developer.feedback@nokia.com.
-**
-****************************************************************************/
-
-#include <hbiconsource_p.h>
-#include <hbthemeindex_p.h>
-#include <assert.h>
-#include <iostream>
-#include <QApplication>
-#include <QStringList>
-#include <QTextStream>
-#include <QFileInfo>
-#include <QLibrary>
-#include <QString>
-#include <QFile>
-#include <QMap>
-#include <QDir>
-
-#define RESOURCE_LIB_NAME "HbCore"
-#define WIN32_DEBUG_SUFFIX "d"
-#define MAC_DEBUG_SUFFIX "_debug"
-
-// For being able to sort the index items based on the iconname
-class IndexItemInfo
-{
-public:
-    QString iconname;
-    HbThemeIndexItem item;
-};
-
-bool operator<(const IndexItemInfo &left, const IndexItemInfo &right)
-{
-    return left.iconname < right.iconname;
-}
-
-// Global variables
-
-static int counter = 0;
-static bool verboseOn = false;
-
-static int version = 1; // Current theme index format version
-
-QList<IndexItemInfo> IndexItems;
-
-QMap<QString, int> Strings;
-QByteArray StringBuffer;
-
-// ------
-
-QSize getDefaultSize(const QString &filename)
-{
-    HbIconSource source(filename);
-    return source.defaultSize().toSize();
-}
-
-int getStringOffset(const QString &string)
-{
-    int offset = Strings.value(string, -1);
-    if (offset < 0) {
-        // Allocate new string in the string buffer
-        offset = StringBuffer.size();
-        StringBuffer.append(string.toLatin1());
-        StringBuffer.append('\0');
-        // Add offset to the target paths list
-        Strings.insert(string, offset);
-    }
-    return offset;
-}
-
-void processFile(const QFileInfo &info, const QString &themename)
-{    
-    QString fullFilename = info.absoluteFilePath();
-    QString filename = info.fileName();
-
-    if (filename.endsWith(".svg") ||
-        filename.endsWith(".png") ||
-        filename.endsWith(".mng") ||
-        filename.endsWith(".gif") ||
-        filename.endsWith(".xpm") ||
-        filename.endsWith(".jpg") ||
-        filename.endsWith(".nvg") ||
-        filename.endsWith(".svgz") ||
-        filename.endsWith(".qpic")) {
-
-        IndexItemInfo itemInfo;
-
-        QString targetPath;
-
-        // If not "hbdefault", which is in resource file, resolve target path for the icon
-        if (!fullFilename.startsWith(':') && 
-            !fullFilename.contains("icons/hbdefault") &&
-            !fullFilename.contains("icons\\hbdefault")) {
-
-            if (fullFilename.contains("scalable")) {
-                targetPath = "/resource/hb/themes/icons/" + themename + "/scalable/";
-            } else {
-                targetPath = "/resource/hb/themes/icons/" + themename + "/pixmap/";
-            }
-        } else {
-            // Resource file target path, used with "hbdefault" theme
-            if (fullFilename.contains("scalable")) {
-                targetPath = ":/themes/icons/hbdefault/scalable/";
-            } else {
-                targetPath = ":/themes/icons/hbdefault/pixmap/";
-            }
-        }
-
-        itemInfo.item.folderOffset = getStringOffset(targetPath);
-        itemInfo.item.extOffset = getStringOffset(filename.mid(filename.lastIndexOf('.')));
-
-        // Define iconname (remove file extension)
-        QString iconname;
-
-        int extIndex = filename.lastIndexOf('.');
-        if (extIndex > 0) {
-            iconname = filename.left(extIndex);
-        } else {
-            iconname = filename;
-        }
-
-        itemInfo.item.iconnameOffset = getStringOffset(iconname);
-        itemInfo.iconname = iconname;
-
-        // Define default size
-        itemInfo.item.defaultSize = getDefaultSize(fullFilename);
-
-        QString mirroredFilepath = fullFilename;
-        
-        // Define mirrored filename if there is a separate mirrored version of the
-        // icon in 'mirrored' folder and in that case get also its default size
-
-        int index1 = mirroredFilepath.lastIndexOf('/');
-        int index2 = mirroredFilepath.lastIndexOf('\\');
-
-        int index = index1 < index2 ? index2 : index1;
-
-        if (index>0) {
-            mirroredFilepath = mirroredFilepath.left(index);
-            mirroredFilepath.append(QString("/mirrored/"));
-
-            QStringList extList;
-            extList << ".svg" << ".png" << ".mng" << ".gif" << ".xpm" << ".jpg" << ".nvg" << ".svgz" << ".qpic";
-
-            foreach(QString ext, extList) {
-                QString mirroredFilenameCandidate = mirroredFilepath + iconname + ext;
-
-                if (QFile::exists(mirroredFilenameCandidate)) {
-                    itemInfo.item.mirroredExtOffset = getStringOffset(ext);
-                    itemInfo.item.mirroredDefaultSize = getDefaultSize(mirroredFilenameCandidate);
-                    break;
-                }
-            }
-        }
-
-        bool alreadyExists = false;
-
-        // Check if there is already an item with the same iconname in the index
-        foreach(const IndexItemInfo &info, IndexItems) {
-            if (info.iconname == itemInfo.iconname) {
-                alreadyExists = true;
-                break;
-            }
-        }
-
-        if (!alreadyExists) {
-            IndexItems.append(itemInfo);
-
-            if (verboseOn) {
-            std::cout << "----------------------------------------------------------------\n";
-            std::cout << "Added item" << counter << "\n";
-            std::cout << "Iconname:" << &StringBuffer.data()[itemInfo.item.iconnameOffset] << "\n";
-            std::cout << "Folder:" << &StringBuffer.data()[itemInfo.item.folderOffset] << "\n";
-            std::cout << "Extension:" << &StringBuffer.data()[itemInfo.item.extOffset] << "\n";
-            std::cout << "Default size: width: " << itemInfo.item.defaultSize.width() << " height: " << itemInfo.item.defaultSize.height() << "\n";
-                if (itemInfo.item.mirroredExtOffset >= 0) {
-                std::cout << "Mirrored extension:" << &StringBuffer.data()[itemInfo.item.mirroredExtOffset] << "\n";
-                } else {
-                std::cout << "Mirrored extension: <empty>\n";
-                }
-            std::cout << "Mirrored default size: width:" << itemInfo.item.mirroredDefaultSize.width() << " height: " << itemInfo.item.mirroredDefaultSize.height() << "\n";
-            }
-            counter++;
-        } else { // Icon already added in index with some other extension, do not add duplicates
-            if (verboseOn) {
-                std::cout << "----------------------------------------------------------------\n";
-                std::cout << "WARNING! Skipped already existing icon:" << fullFilename.toStdString() << "\n";
-            }
-        }
-    }
-}
-
-void adjustOffsets() {
-    int adjustment = sizeof(HbThemeIndexHeaderV1) + IndexItems.count() * sizeof(HbThemeIndexItem);
-
-    for (int i = 0; i<IndexItems.count(); ++i) {
-        IndexItems[i].item.iconnameOffset += adjustment;
-        IndexItems[i].item.folderOffset += adjustment;        
-        IndexItems[i].item.extOffset += adjustment;
-
-        if (IndexItems[i].item.mirroredExtOffset >= 0) {
-            IndexItems[i].item.mirroredExtOffset += adjustment;
-        }
-    }
-}
-
-void processDir(const QDir &dir, const QString &themename, const QString targetName, bool subDir = false)
-{
-    if (!subDir) {
-        IndexItems.clear();
-        Strings.clear();
-        StringBuffer.clear();
-    }
-
-    QFileInfoList entries = dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
-    for (int i=0; i<entries.count(); i++) {
-        QFileInfo info = entries.at(i);
-        QString file = info.absoluteFilePath();
-        if (info.isDir()) {
-            // Process subdirs recursively
-            QDir subDir(file);
-            processDir(subDir, themename, targetName, true);
-        }
-        // Process file
-        processFile(info, themename);
-    }
-
-    if (!subDir) {
-        QDir targetDir(targetName);
-        if (!targetDir.exists()) {
-            targetDir.mkpath(targetName);
-        }
-        QString filename = targetName + themename + ".themeindex";
-
-        QFile::remove(filename);
-        QFile indexFile(filename);
-        if (!indexFile.open(QIODevice::ReadWrite)) {
-            std::cout << "ERROR: could not open index file!\n";
-            return;
-        }
-        
-        // Write the header in the beginning of the file
-        HbThemeIndexHeaderV1 header;
-        header.version = version;
-        header.count = IndexItems.count();
-        
-        qint64 ret = indexFile.write(reinterpret_cast<const char *>(&header), sizeof(HbThemeIndexHeaderV1));
-        assert(ret == sizeof(HbThemeIndexHeaderV1));
-
-        // Sort the list
-        qSort(IndexItems);
-
-        // Fix offsets in the items to be based on the beginning of the theme index instead of
-        // the beginning of the string buffer area.
-        adjustOffsets();
-
-        // Write the items in the file stream
-        foreach(const IndexItemInfo &itemInfo, IndexItems) {
-            ret = indexFile.write(reinterpret_cast<const char *>(&itemInfo.item), sizeof(HbThemeIndexItem));
-            assert(ret == sizeof(HbThemeIndexItem));
-        }
-
-        // Write the string buffer in the stream
-        ret = indexFile.write(StringBuffer.constData(), StringBuffer.size());
-        assert(ret == StringBuffer.size());
-        indexFile.close();    
-    }
-}
-
-void showHelp() {
-    std::cout << "Themeindexer.exe usage:\n\n";
-    std::cout << "themeindexer [-v] -f filename OR -n themename -s theme icons source directory -t theme index file target directory\n\n";
-
-    std::cout << "-n \t\tname of index file (\"<themename>.themeindex\").\n";
-    std::cout << "-s \t\ticons source directory is scanned recursively and all the";
-    std::cout << "\t\t\trecognized icon files are aded in the theme index.\n";
-    std::cout << "-t \t\ttarget directory for the index file.\n";
-
-    std::cout << "-f <filename>\tfile which contains multiple themes to be indexed. Each in its own row.\n";
-    std::cout << "-v \t\tverbose output\n\n";
-
-    std::cout << "Example 1:\n";
-    std::cout << "Themeindexer.exe -n theme1 -s c:/themes/icons/theme1/ -t c:/temp/\n\n";
-    std::cout << "Example 2:\n";
-    std::cout << "Themeindexer.exe -f c:/mythemes/themes.txt\n\n";
-}
-
-void loadHbResource()
-{
-    bool loadSuccess;
-    // To load resources embedded in hb library
-    QString resourceLibName(RESOURCE_LIB_NAME);
-    QLibrary hbLib(resourceLibName);
-    loadSuccess = hbLib.load();
-    
-    if ( !loadSuccess ) {
-        // Library may not be loaded, if it was built in debug mode and the name in debug mode is
-        // different, change the name to debug version in that scenario
-#ifdef Q_OS_WIN32
-        resourceLibName += WIN32_DEBUG_SUFFIX;
-#elif defined(Q_OS_MAC)
-        resourceLibName += MAC_DEBUG_SUFFIX;
-#endif
-        // On symbian library name in debug mode is same as that in release mode,
-        // so no need to do anything for that
-        hbLib.setFileName(resourceLibName);
-        loadSuccess = hbLib.load();
-    }
-}
-
-int main(int argc, char *argv[])
-{
-    QApplication app(argc, argv, false); // GUIenabled=false
-
-    if (argc <= 2) {
-        showHelp();
-    } else {
-        // Load HbCore resource to be able to index hbdefault theme
-        loadHbResource();
-
-        QString filename;
-        QString themename;
-        QDir basedir;
-        QString targetname;
-        QStringList args(app.arguments());
-
-        for (int n = 0; n < args.count(); n++) {
-            if (args[n].toLower() == "-n") {
-                themename = args[n+1];
-                n++;
-            } else if (args[n].toLower() == "-s") {
-                basedir = QDir(args[n+1]);
-                n++;
-            } else if (args[n].toLower() == "-t") {
-                targetname = args[n+1];
-                n++;
-            } else if (args[n].toLower() == "-v") {
-                verboseOn = true;
-            } else if (args[n].toLower() == "-f") {
-                filename = args[n+1];
-            }
-        }
-
-
-        if (filename.length() > 0) {
-            if (!QFile::exists(filename)) {
-                std::cout << "Error: file " << filename.toStdString() << " does not exist.\n";
-            } else {
-                // Open file and parse lines. Each line should have three value separated with:
-                QFile themesToBeIndexed(filename);
-                if (themesToBeIndexed.open(QIODevice::ReadOnly | QIODevice::Text)) {
-                    QTextStream in(&themesToBeIndexed);
-
-                    while(!in.atEnd()) {
-                        QString line = in.readLine();
-
-                        QStringList values = line.split(' ');
-                        if (values.count() == 3) {
-                            themename = values[0];
-                            basedir = values[1];
-                            targetname = values[2];
-
-                            targetname.replace('\\', '/');
-                            // Check that targetname has / at the end
-                            if (!targetname.endsWith('/')) {
-                                targetname.append('/');
-                            }
-                            processDir(basedir, themename, targetname);
-                        }
-                    }
-
-                    themesToBeIndexed.close();
-
-                    // Loop through themes string list and call processDir
-                } else {
-                    std::cout << "Error: file " << filename.toStdString() << " could not be opened.\n";
-                }
-            }
-        } else {
-            // Index only given theme
-
-            targetname.replace('\\', '/');
-            // Check that targetname has / at the end
-            if (!targetname.endsWith('/')) {
-                targetname.append('/');
-            }
-
-            processDir(basedir, themename, targetname);
-
-        }
-    }
-
-    return 0;
-}
-