qmake/generators/symbian/symbiancommon.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- 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);