--- 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 <appinfo.rh>" << 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"<<endl;
+ if (!shortCaption.isEmpty()) {
+ t << "#define STRING_r_short_caption \"" << shortCaption << "\"" << endl;
+ } else {
+ t << "#define STRING_r_short_caption \"" "#"<< fixedTarget << "\"" << endl;
+ }
+ if (!longCaption.isEmpty()) {
+ t << "#define STRING_r_caption \"" << longCaption << "\"" << endl;
+ } else {
+ t << "#define STRING_r_caption \"" "#"<< fixedTarget << "\"" << endl;
}
-
- QString shortCaption;
- QString longCaption;
-
- // get captions from ts file
- 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") {
- shortCaption = xml.readElementText();
- }
- }
- }
- 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") {
- longCaption = xml.readElementText();
- }
- }
- }
- }
- }
- }
- 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;
- if (!shortCaption.isEmpty()) {
- t << "#define STRING_r_short_caption \"" << shortCaption << "\"" << endl;
- } else {
- t << "#define STRING_r_short_caption \"" "#"<< fixedTarget << "\"" << endl;
- }
- if (!longCaption.isEmpty()) {
- t << "#define STRING_r_caption \"" << longCaption << "\"" << endl;
- } else {
- t << "#define STRING_r_caption \"" "#"<< fixedTarget << "\"" << endl;
- }
- ft.close();
- } else {
- PRINT_FILE_CREATE_ERROR(locFilename);
- }
+ ft.close();
+ } else {
+ PRINT_FILE_CREATE_ERROR(locFilename);
}
+ }
}
//QTP: loc change ends
@@ -1229,8 +1273,9 @@
void SymbianCommonGenerator::modifyQt2S60LangMapTable()
{
QMakeProject *project = generator->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);