--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qthighway/xqsreg/main.cpp Fri Apr 16 15:51:22 2010 +0300
@@ -0,0 +1,311 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, version 2.1 of the License.
+*
+* This program 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 Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not,
+* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
+*
+* Description:
+*
+*/
+
+#include <QString>
+#include <QStringList>
+#include <QDebug>
+#include <QFile>
+#include <QIODevice>
+#include <QTextStream>
+#include <QDateTime>
+#include <QDir>
+#include <QFileInfo>
+
+#include <QRegExp>
+
+#include <iostream>
+
+using namespace std;
+
+#define RESOURCE_DIRECTORY_RESOURCE "\\\\resource\\\\apps\\\\"
+#define _s(a) QString::fromLatin1(a)
+const char *FINGERPRINT = "/* xqsreg.exe fingerprint */";
+
+QString appName;
+QString uid3;
+QString configurationFileName;
+QString configurationFile;
+QString resourceFileName;
+QString embeddable;
+QString hidden;
+
+QString epocRoot()
+{
+ QString test=QDir::root().absolutePath() ;
+ qDebug() << QString::fromLatin1("epocroot=") + test;
+ return test;
+}
+
+QString canonizePath(const QString& origPath)
+{
+ // Since current path gets appended almost always anyway, use it as default
+ // for nonexisting paths.
+ static QString defaultPath;
+ if (defaultPath.isEmpty()) {
+ QFileInfo fi(QString::fromLatin1("."));
+ defaultPath = fi.canonicalFilePath();
+ }
+
+ // Prepend epocroot to any paths beginning with "/epoc32/"
+ QString resultPath = QDir::fromNativeSeparators(origPath);
+ if (resultPath.startsWith(QString::fromLatin1("/epoc32/"), Qt::CaseInsensitive))
+ resultPath = QDir::fromNativeSeparators(epocRoot()) + resultPath.mid(1);
+
+ QFileInfo fi(resultPath);
+ if(fi.isDir()) {
+ resultPath = fi.canonicalFilePath();
+ } else {
+ resultPath = fi.canonicalPath();
+ }
+
+ resultPath = QDir::cleanPath(resultPath);
+
+ if (resultPath.isEmpty())
+ resultPath = defaultPath;
+
+ return resultPath;
+}
+
+
+bool checkIfPatched(const QString &rssContent)
+{
+ return rssContent.contains(_s(FINGERPRINT));
+}
+
+int parseProperties(const QStringList ¶ms)
+{
+ int paramCount = params.size();
+
+ if (paramCount < 5) {
+ fprintf(stderr, "Warning: invalid parameters!\n");
+ fprintf(stderr, "Usage: xqsreg <application name> <application uid> <conf_file.xml> <resource file name> [embeddable] [hidden]");
+ return 1;
+ }
+
+ appName = params[1];
+ uid3=params[2];
+ configurationFileName=params[3];
+ configurationFile = QDir::fromNativeSeparators(canonizePath(QString::fromLatin1(".")) + QString::fromLatin1("/") + configurationFileName);
+ resourceFileName=params[4];
+
+ embeddable = QString::fromLatin1("KAppNotEmbeddable");
+ hidden = QString::fromLatin1("KAppNotHidden");
+
+ if (paramCount >= 6) {
+ if(!params[5].compare(QString::fromLatin1("embeddable"), Qt::CaseInsensitive)) {
+ embeddable = QString::fromLatin1("KAppEmbeddable");
+
+ } else if(!params[5].compare(QString::fromLatin1("hidden"), Qt::CaseInsensitive)) {
+ hidden = QString::fromLatin1("KAppIsHidden");
+ }
+ }
+
+ if (paramCount == 7) {
+ if(!params[6].compare(QString::fromLatin1("embeddable"), Qt::CaseInsensitive)) {
+ embeddable = QString::fromLatin1("KAppEmbeddable");
+ } else if(!params[6].compare(QString::fromLatin1("hidden"), Qt::CaseInsensitive)) {
+ hidden = QString::fromLatin1("KAppIsHidden");
+ }
+ }
+
+ return 0;
+}
+
+int populateBeforeRegInfo(QTextStream& t)
+{
+ t << endl << endl;
+ t << FINGERPRINT << endl;
+/* t << "// ============================================================================" << endl;
+ t << "// * Generated by xqrs on " << QDateTime::currentDateTime().toString() << endl;
+ t << "// * This file is generated by xqrs and should not be modified by the" << endl;
+ t << "// * user." << endl;
+ t << "// ============================================================================" << endl;
+ t << endl; */
+
+ t << "#include <xqserviceipcconst.h>" << endl;
+ t << "STRUCT SERVICE_CONFIGURATION {LTEXT xmldata;}" << endl;
+ t << "STRUCT SERVICE_CONFIGURATION_ARRAY {STRUCT service_configuration_array[];}" << endl;
+
+ t << endl;
+
+/* t << "UID2 " << "KUidAppRegistrationResourceFile" << endl;
+ t << "UID3 " << uid3 << endl << endl; */
+
+ return 0;
+}
+
+int populateInsideRegInfo(QTextStream& t)
+{
+ t << endl << endl;
+/* t << "\tapp_file=\"" << appName << "\";" << endl;
+ t << "\tlocalisable_resource_file=\"" RESOURCE_DIRECTORY_RESOURCE << appName << "\";" << endl;
+ t << endl;*/
+
+ t << "\t" << "embeddability = " << embeddable << ";" << endl;
+ t << "\t" << "hidden = " << hidden << ";" << endl;
+ t << "\t" << "newfile = KAppDoesNotSupportNewFile;" << endl;
+ t << "\t" << "service_list =" << endl;
+ t << "\t\t" << "{" << endl;
+ t << "\t\t" << "SERVICE_INFO" << endl;
+ t << "\t\t\t" << "{" << endl;
+ t << "\t\t\t" << "uid = KXQServiceUid;" << endl;
+ t << "\t\t\t" << "datatype_list = {};" << endl;
+ t << "\t\t\t" << "opaque_data = r_service_configuration_reg;" << endl;
+ t << "\t\t\t" << "}" << endl;
+ t << "\t\t" << "};" << endl;
+
+ return 0;
+}
+
+int populateAfterRegInfo(QTextStream& t)
+{
+ t << endl << endl;
+ t << "RESOURCE SERVICE_CONFIGURATION_ARRAY r_service_configuration_reg" << endl;
+ t << "\t{" << endl;
+ t << "\t\tservice_configuration_array=" << endl;
+ t << "\t\t\t{" << endl;
+
+ QFile cf(configurationFile);
+
+ int err = 0;
+
+ QByteArray escapedQuotationMark = QByteArray("\\\"");
+
+ if (cf.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QByteArray xmlConf;
+
+ xmlConf = cf.readAll();
+ xmlConf = xmlConf.replace("\"","\\\"");
+ if (xmlConf.count()) {
+ QByteArray xml = xmlConf.simplified();
+ for (int n=0;;n++) {
+ int splitCount = 255;
+ if (xml.size() > 255 && (xml.mid(254, 2) == escapedQuotationMark)) {
+ splitCount = 254;
+ }
+ QByteArray split = xml.left(splitCount);
+ if (!split.count()) {
+ break;
+ }
+ if (n) {
+ t << "\t\t\t\t," << endl;
+ }
+ t << "\t\t\t\tSERVICE_CONFIGURATION" << endl;
+ t << "\t\t\t\t{" << endl;
+ t << "\t\t\t\txmldata = \"" << split <<"\";" << endl;
+ t << "\t\t\t\t}" << endl;
+
+ xml = xml.mid(splitCount);
+ }
+ }
+ } else {
+ fprintf(stderr, "Error: Cannot open %s file for reading.", qPrintable(configurationFile));
+ err = 1;
+ }
+
+ t << endl;
+ t << "\t\t\t};" << endl;
+ t << "\t}" << endl;
+
+ return err;
+}
+
+int runXQSRegGenerator(QStringList params)
+{
+ QFile ftR(resourceFileName);
+ QString fileContent(_s(""));
+
+ if ( ftR.open(QIODevice::ReadOnly | QIODevice::Text) ) {
+ QTextStream t(&ftR);
+ fileContent = t.readAll(); // let's hope file won't be too big ;)
+ ftR.close();
+ } else {
+ fprintf(stderr, "Error: file %s not found.\n", qPrintable(resourceFileName));
+ return 1;
+ }
+
+ if (checkIfPatched(fileContent)) {
+ fprintf(stderr, "Warning: matched xqsreg.exe fingerprint in resource file %s. Skipping rewriting action.\n", qPrintable(configurationFile));
+ return 0;
+ }
+
+ QRegExp qr(_s("RESOURCE\\s+APP_REGISTRATION_INFO\\s+[{]"));
+
+ int pos = qr.indexIn(fileContent, 0);
+
+ QString beforeRegistrationInfo;
+ QString insideRegistrationInfo;
+ QString afterRegistrationInfo;
+
+ QTextStream tsBeforeRegistrationInfo(&beforeRegistrationInfo);
+ QTextStream tsInsideRegistrationInfo(&insideRegistrationInfo);
+ QTextStream tsAfterRegistrationInfo(&afterRegistrationInfo);
+
+ if (populateBeforeRegInfo(tsBeforeRegistrationInfo)) {
+ return 1;
+ }
+
+ if (populateInsideRegInfo(tsInsideRegistrationInfo)) {
+ return 1;
+ }
+
+ if (populateAfterRegInfo(tsAfterRegistrationInfo)) {
+ return 1;
+ }
+
+ if (pos != -1) {
+ fileContent.insert(pos, beforeRegistrationInfo);
+ pos += qr.matchedLength() + beforeRegistrationInfo.size();
+ fileContent.insert(pos, insideRegistrationInfo);
+ fileContent.append(afterRegistrationInfo);
+ } else {
+ fprintf(stderr, "Error: RESOURCE APP_REGISTRATION_INFO not found in: %s.", qPrintable(configurationFile));
+ return 1;
+ }
+
+ QFile ft(resourceFileName);
+ if(ft.open(QIODevice::WriteOnly)) {
+ QTextStream t(&ft);
+ t << fileContent;
+ } else {
+ fprintf(stderr, "Error: cannot open file %s for writing.", qPrintable(configurationFile));
+ return 1;
+ }
+ ft.close();
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ QStringList params;
+ for (int i=0 ; i < argc ; i++) {
+ params << QString::fromLatin1(argv[i]);
+ //printf("par%d=%s\n",i,argv[i]);
+ }
+
+ int err = parseProperties(params);
+
+ if (err == 0) {
+ err = runXQSRegGenerator(params);
+ }
+ return err;
+}