diff -r ef0373b55136 -r 758a864f9613 qmake/generators/symbian/symbiancommon.cpp --- a/qmake/generators/symbian/symbiancommon.cpp Fri Sep 17 08:34:18 2010 +0300 +++ b/qmake/generators/symbian/symbiancommon.cpp Mon Oct 04 01:19:32 2010 +0300 @@ -146,7 +146,7 @@ void SymbianCommonGenerator::removeSpecialCharacters(QString& str) { - // When modifying this method check also application_icon.prf + // When modifying this method check also symbianRemoveSpecialCharacters in symbian.conf str.replace(QString("/"), QString("_")); str.replace(QString("\\"), QString("_")); str.replace(QString(" "), QString("_")); @@ -154,7 +154,7 @@ void SymbianCommonGenerator::removeEpocSpecialCharacters(QString& str) { - // When modifying this method check also application_icon.prf + // When modifying this method check also symbianRemoveSpecialCharacters in symbian.conf str.replace(QString("-"), QString("_")); str.replace(QString(":"), QString("_")); str.replace(QString("."), QString("_")); @@ -171,13 +171,8 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile, bool epocBuild) { QMakeProject *project = generator->project; - QString pkgTarget = project->first("QMAKE_ORIG_TARGET"); - if (pkgTarget.isEmpty()) - pkgTarget = project->first("TARGET"); - pkgTarget = generator->unescapeFilePath(pkgTarget); - pkgTarget = removePathSeparators(pkgTarget); QString pkgFilename = Option::output_dir + QLatin1Char('/') + - QString("%1_template.pkg").arg(pkgTarget); + QString("%1_template.pkg").arg(fixedTarget); QFile pkgFile(pkgFilename); if (!pkgFile.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -186,7 +181,7 @@ } QString stubPkgFileName = Option::output_dir + QLatin1Char('/') + - QString("%1_stub.pkg").arg(pkgTarget); + QString("%1_stub.pkg").arg(fixedTarget); QFile stubPkgFile(stubPkgFileName); if (!stubPkgFile.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -210,7 +205,7 @@ // Header info QString wrapperPkgFilename = Option::output_dir + QLatin1Char('/') + QString("%1_installer.%2") - .arg(pkgTarget).arg("pkg"); + .arg(fixedTarget).arg("pkg"); QString headerComment = "; %1 generated by qmake at %2\n" "; This file is generated by qmake and should not be modified by the user\n" @@ -269,8 +264,44 @@ tw << languageRules.join("\n") << endl; ts << languageRules.join("\n") << endl; - // name of application, UID and version - QString applicationVersion = project->first("VERSION").isEmpty() ? "1,0,0" : project->first("VERSION").replace('.', ','); + // Determine application version. If version has missing component values, + // those will default to zero. + // If VERSION is missing altogether or is invalid, use "1,0,0" + QStringList verNumList = project->first("VERSION").split('.'); + uint major = 0; + uint minor = 0; + uint patch = 0; + bool success = false; + + if (verNumList.size() > 0) { + major = verNumList[0].toUInt(&success); + if (success && verNumList.size() > 1) { + minor = verNumList[1].toUInt(&success); + if (success && verNumList.size() > 2) { + patch = verNumList[2].toUInt(&success); + } + } + } + + QString applicationVersion("1,0,0"); + if (success) + applicationVersion = QString("%1,%2,%3").arg(major).arg(minor).arg(patch); + + // Append package build version number if it is set + QString pkgBuildVersion = project->first("DEPLOYMENT.pkg_build_version"); + if (!pkgBuildVersion.isEmpty()) { + success = false; + uint build = pkgBuildVersion.toUInt(&success); + if (success && build < 100) { + if (pkgBuildVersion.size() == 1) + pkgBuildVersion.prepend(QLatin1Char('0')); + applicationVersion.append(pkgBuildVersion); + } else { + fprintf(stderr, "Warning: Invalid DEPLOYMENT.pkg_build_version (%s), must be a number between 0 - 99\n", qPrintable(pkgBuildVersion)); + } + } + + // Package header QString sisHeader = "; SIS header: name, uid, version\n#{\"%1\"},(%2),%3\n\n"; QString visualTarget = generator->escapeFilePath(project->first("TARGET")); @@ -519,7 +550,7 @@ // Wrapped files deployment QString currentPath = qmake_getpwd(); - QString sisName = QString("%1.sis").arg(pkgTarget); + QString sisName = QString("%1.sis").arg(fixedTarget); twf << "\"" << currentPath << "/" << sisName << "\" - \"c:\\private\\2002CCCE\\import\\" << sisName << "\"" << endl; QString bootStrapPath = QLibraryInfo::location(QLibraryInfo::PrefixPath); @@ -536,7 +567,7 @@ if (QDir::separator().unicode() != '/') ret.replace(QDir::separator(), QLatin1Char('/')); - if (ret.indexOf(QLatin1Char('/')) > 0) + if (ret.indexOf(QLatin1Char('/')) >= 0) ret.remove(0, ret.lastIndexOf(QLatin1Char('/')) + 1); return ret; @@ -559,7 +590,7 @@ t << "// * user." << endl; t << "// ============================================================================" << endl; t << endl; - t << "#include <" << fixedTarget << ".rsg>" << endl; + t << "#include <" << fixedTarget.toLower() << ".rsg>" << endl; t << "#include " << endl; foreach(QString item, userItems[RSS_TAG_HEADER]) t << item << endl; @@ -639,7 +670,7 @@ //QTP: //QTP: loc change start - t << "#include <" << translationFileName << ".loc>" << endl; + t << "#include <" << translationFileName.toLower() << ".loc>" << endl; //QTP: loc change end t << endl; t << "RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info" << endl; @@ -774,107 +805,120 @@ void SymbianCommonGenerator::writeSymbianLocFile(QStringList &symbianLangCodes) { - QMakeProject *project = generator->project; - QString filename(translationFileName); + QMakeProject *project = generator->project; + // Loop through all the languages and generate language specific loc files. foreach(QString lang, symbianLangCodes) { - - QString tsFilename(filename); - QString language = qt2S60LangMapTable.key(lang, QString("en")); - tsFilename.append("_"+language+".ts"); - - tsFilename.insert(0, project->first("SYMBIANTRANSLATIONSRCDIR")); - - QString locFilename(filename); - locFilename.append("_"+lang+".loc"); - if (!project->first("SYMBIANLOCFILESDIR").isEmpty()) { - locFilename.insert(0, lang+"/"); - locFilename.insert(0, project->first("SYMBIANLOCFILESDIR")); - } else { - locFilename.insert(0, "/epoc32/include/platform/mw/loc/"+lang+"/"); + QString locFilename(translationFileName); //Use first entry from pro files TRANSLATIONS field as the name of the loc file. + locFilename.append("_"+lang+".loc"); + if (!project->first("SYMBIANLOCFILESDIR").isEmpty()) { + locFilename.insert(0, lang+"/"); + locFilename.insert(0, project->first("SYMBIANLOCFILESDIR")); + } else { + locFilename.insert(0, "/epoc32/include/platform/mw/loc/"+lang+"/"); + } + QString shortCaption; + QString longCaption; + + QStringList translationFilenames = project->values("TRANSLATIONS"); + // Read captions from all the ts files that exist on pro file. Use the caption that is found first. Print warning notes from duplicates. + foreach (QString tsFilename, translationFilenames) { + // add the path and current language identification to ts name and search if txt_short_caption_ or txt_long_caption_ is present + //QString tsFilename(tempfilename); + if (!tsFilename.isEmpty()) { + tsFilename = generator->fileInfo(tsFilename).completeBaseName(); + tsFilename = generator->unescapeFilePath(tsFilename); + tsFilename = removePathSeparators(tsFilename); + } + QString language = qt2S60LangMapTable.key(lang, QString("en")); + tsFilename.append("_"+language+".ts"); + tsFilename.insert(0, project->first("SYMBIANTRANSLATIONSRCDIR")); + QFile tsFile(tsFilename); + if (tsFile.exists()) { + if (tsFile.open(QIODevice::ReadOnly)) { + QString shortCaptionId = QLatin1String("txt_short_caption_"); + QString longCaptionId = QLatin1String("txt_long_caption_"); + QXmlStreamReader xml(&tsFile); + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "context") { + while (!(xml.isEndElement() && xml.name() == "context") && !xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "message" + && xml.attributes().value("numerus") == "no" + && xml.attributes().value("id").toString().left(shortCaptionId.length()) == shortCaptionId) { + while (!(xml.isEndElement() && xml.name() == "message") && !xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "translation") { + if (shortCaption.isEmpty()){ + shortCaption = xml.readElementText(); + } else { + fprintf(stderr, "Duplicate short caption field found from: '%s'.\n", qPrintable(tsFilename)); + } + } + } + } + if (xml.isStartElement() && xml.name() == "message" + && xml.attributes().value("numerus") == "no" + && xml.attributes().value("id").toString().left(longCaptionId.length()) == longCaptionId) { + while (!(xml.isEndElement() && xml.name() == "message") && !xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "translation" ) { + if (longCaption.isEmpty()){ + longCaption = xml.readElementText(); + } else { + fprintf(stderr, "Duplicate long caption field found from: '%s'.\n", qPrintable(tsFilename)); + } + } + } + } + } + } + } + if (shortCaption.isEmpty()) { + fprintf(stderr, "Short caption generated from target name '#%s'.\n", qPrintable(fixedTarget)); + } + if (longCaption.isEmpty()) { + fprintf(stderr, "Warning: STRING_r_caption not generated from file '%s'.\n", qPrintable(tsFilename)); + fprintf(stderr, " : caption generated from target name '#%s'.\n", qPrintable(fixedTarget)); + } + if (xml.hasError()) + fprintf(stderr, "ERROR: \"%s\" when parsing ts file\n", qPrintable(xml.errorString())); + } else { + fprintf(stderr, "Could not open ts file (%s)\n", qPrintable(tsFilename)); + } + } else { + fprintf(stderr, "Warning: ts file does not exist: (%s)\n", qPrintable(tsFilename)); + fprintf(stderr, " : short and long caption generated from target name '#%s'.\n", qPrintable(fixedTarget)); + } + } + // generate language specific caption loc file + QFile ft(locFilename); + if (ft.open(QIODevice::WriteOnly)) { + generatedFiles << ft.fileName(); + QTextStream t(&ft); + t << "// ============================================================================" << endl; + t << "// * Generated by qmake (" << qmake_version() << ") (Qt " << QT_VERSION_STR << ") on: "; + t << QDateTime::currentDateTime().toString(Qt::ISODate) << endl; + t << "// * This file is generated by qmake and should not be modified by the" << endl; + t << "// * user." << endl; + t << "// ============================================================================" << endl; + t << endl; + t <<"CHARACTER_SET UTF8"<project; - QString systemLanguagesIniFile = project->first("SYMBIANTRANSLATIONDIR"). - append(QLatin1String("system_languages.ini")); + + QString systemLanguagesIniFile("/epoc32/include/system_languages.ini"); + QFileInfo systemLangFileInfo(systemLanguagesIniFile); if (systemLangFileInfo.exists()) { QSettings systemLanguages(systemLanguagesIniFile, QSettings::IniFormat);