androiddeployqt: Make sure generated package name parses
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Fri, 1 Nov 2013 14:07:28 +0000 (15:07 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 1 Nov 2013 16:57:46 +0000 (17:57 +0100)
We need to make sure the generated package name does not break
any parser rules in Java. The cleanPackageName() function is
copied from Qt Creator.

Task-number: QTBUG-34245
Change-Id: Ice2f10e25f7f1d93c87c5ced2659e63d386e51a0
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
src/androiddeployqt/main.cpp

index 998b3d8..f69b205 100644 (file)
@@ -413,6 +413,62 @@ bool copyFileIfNewer(const QString &sourceFileName, const QString &destinationFi
     return true;
 }
 
+QString cleanPackageName(QString packageName)
+{
+    QRegExp legalChars(QLatin1String("[a-zA-Z0-9_\\.]"));
+
+    for (int i = 0; i < packageName.length(); ++i) {
+        if (!legalChars.exactMatch(packageName.mid(i, 1)))
+            packageName[i] = QLatin1Char('_');
+    }
+
+    static QStringList keywords;
+    if (keywords.isEmpty()) {
+        keywords << QLatin1String("abstract") << QLatin1String("continue") << QLatin1String("for")
+                 << QLatin1String("new") << QLatin1String("switch") << QLatin1String("assert")
+                 << QLatin1String("default") << QLatin1String("if") << QLatin1String("package")
+                 << QLatin1String("synchronized") << QLatin1String("boolean") << QLatin1String("do")
+                 << QLatin1String("goto") << QLatin1String("private") << QLatin1String("this")
+                 << QLatin1String("break") << QLatin1String("double") << QLatin1String("implements")
+                 << QLatin1String("protected") << QLatin1String("throw") << QLatin1String("byte")
+                 << QLatin1String("else") << QLatin1String("import") << QLatin1String("public")
+                 << QLatin1String("throws") << QLatin1String("case") << QLatin1String("enum")
+                 << QLatin1String("instanceof") << QLatin1String("return") << QLatin1String("transient")
+                 << QLatin1String("catch") << QLatin1String("extends") << QLatin1String("int")
+                 << QLatin1String("short") << QLatin1String("try") << QLatin1String("char")
+                 << QLatin1String("final") << QLatin1String("interface") << QLatin1String("static")
+                 << QLatin1String("void") << QLatin1String("class") << QLatin1String("finally")
+                 << QLatin1String("long") << QLatin1String("strictfp") << QLatin1String("volatile")
+                 << QLatin1String("const") << QLatin1String("float") << QLatin1String("native")
+                 << QLatin1String("super") << QLatin1String("while");
+    }
+
+    // No keywords
+    int index = -1;
+    while (index < packageName.length()) {
+        int next = packageName.indexOf(QLatin1Char('.'), index + 1);
+        if (next == -1)
+            next = packageName.length();
+        QString word = packageName.mid(index + 1, next - index - 1);
+        if (!word.isEmpty()) {
+            QChar c = word[0];
+            if (c >= QChar(QLatin1Char('0')) && c<= QChar(QLatin1Char('9'))) {
+                packageName.insert(index + 1, QLatin1Char('_'));
+                index = next + 1;
+                continue;
+            }
+        }
+        if (keywords.contains(word)) {
+            packageName.insert(next, QLatin1String("_"));
+            index = next + 1;
+        } else {
+            index = next;
+        }
+    }
+
+    return packageName;
+}
+
 QString detectLatestAndroidPlatform(const QString &sdkPath)
 {
     QDir dir(sdkPath + QLatin1String("/platforms"));
@@ -561,7 +617,7 @@ bool readInputFile(Options *options)
         options->ndkHost = ndkHost.toString();
     }
 
-    options->packageName = QString::fromLatin1("org.qtproject.example.%1").arg(QFileInfo(options->applicationBinary).baseName().mid(sizeof("lib") - 1));
+    options->packageName = cleanPackageName(QString::fromLatin1("org.qtproject.example.%1").arg(QFileInfo(options->applicationBinary).baseName().mid(sizeof("lib") - 1)));
 
     {
         QJsonValue extraLibs = jsonObject.value("android-extra-libs");