OSDN Git Service

If capabilities inside pro files do not match the dev cert an error is generated...
authorPawel Polanski <pawel.3.polanski@nokia.com>
Tue, 14 Dec 2010 15:19:44 +0000 (16:19 +0100)
committerPawel Polanski <pawel.3.polanski@nokia.com>
Tue, 14 Dec 2010 15:37:50 +0000 (16:37 +0100)
src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.cpp
src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.h
src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
src/plugins/qt4projectmanager/qt4nodes.cpp
src/plugins/qt4projectmanager/qt4nodes.h

index c2a67eb..f6462bd 100644 (file)
@@ -132,6 +132,22 @@ S60CertificateInfo::CertificateState S60CertificateInfo::validateCertificate()
     return result;
 }
 
+bool S60CertificateInfo::compareCapabilities(const QStringList &givenCaps, QStringList &unsupportedCaps) const
+{
+    if (!m_certificate->isValid())
+        return false;
+    unsupportedCaps.clear();
+    if (capabilitiesSupported() == NoInformation)
+        return true;
+
+    QStringList capabilities(createCapabilityList(capabilitiesSupported()));
+    foreach (QString capability, givenCaps) {
+        if (!capabilities.contains(capability, Qt::CaseInsensitive))
+            unsupportedCaps << capability;
+    }
+    return true;
+}
+
 QString S60CertificateInfo::errorString() const
 {
     return m_errorString.isEmpty()?m_certificate->errorString():m_errorString;
index 16f5551..609a280 100644 (file)
@@ -85,6 +85,8 @@ public:
     QString errorString() const;
     bool isDeveloperCertificate() const;
 
+    bool compareCapabilities(const QStringList &givenCaps, QStringList &unsupportedCaps) const;
+
 private:
     S60SymbianCertificate *m_certificate;
     QString m_filePath;
index 3861810..496f34d 100644 (file)
@@ -180,8 +180,12 @@ bool S60CreatePackageStep::init()
     QList<Qt4ProFileNode *> nodes = pro->leafProFiles();
 
     m_workingDirectories.clear();
-    foreach (Qt4ProFileNode *node, nodes)
+    QStringList projectCapabilities;
+    foreach (Qt4ProFileNode *node, nodes) {
+        projectCapabilities += node->symbianCapabilities();
         m_workingDirectories << node->buildDir();
+    }
+    projectCapabilities.removeDuplicates();
 
     m_makeCmd = qt4BuildConfiguration()->makeCommand();
     if (!QFileInfo(m_makeCmd).isAbsolute()) {
@@ -194,7 +198,7 @@ bool S60CreatePackageStep::init()
         m_makeCmd = tmp;
     }
 
-    if (signingMode() == SignCustom && !validateCustomSigningResources())
+    if (signingMode() == SignCustom && !validateCustomSigningResources(projectCapabilities))
         return false;
 
     m_environment = qt4BuildConfiguration()->environment();
@@ -443,7 +447,7 @@ bool S60CreatePackageStep::createOnePackage()
     return true;
 }
 
-bool S60CreatePackageStep::validateCustomSigningResources()
+bool S60CreatePackageStep::validateCustomSigningResources(const QStringList &capabilitiesInPro)
 {
     Q_ASSERT(signingMode() == SignCustom);
 
@@ -463,37 +467,50 @@ bool S60CreatePackageStep::validateCustomSigningResources()
                          "Please define certificate file in the project's options.").arg(customKeyPath());
 
     if (!errorString.isEmpty()) {
-        emit addOutput(errorString, BuildStep::ErrorMessageOutput);
-        emit addTask(ProjectExplorer::Task(ProjectExplorer::Task::Error,
-                                           errorString,
-                                           QString(), -1,
-                                           ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+        reportPackageStepIssue(errorString, true);
         return false;
     }
     QScopedPointer<S60CertificateInfo> certInfoPtr(new S60CertificateInfo(customSignaturePath()));
     S60CertificateInfo::CertificateState certState = certInfoPtr.data()->validateCertificate();
     switch (certState) {
     case S60CertificateInfo::CertificateError:
-        emit addOutput(certInfoPtr.data()->errorString(), BuildStep::ErrorMessageOutput);
-        emit addTask(ProjectExplorer::Task(ProjectExplorer::Task::Error,
-                                           certInfoPtr.data()->errorString(),
-                                           QString(), -1,
-                                           ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+        reportPackageStepIssue(certInfoPtr.data()->errorString(), true);
         return false;
     case S60CertificateInfo::CertificateWarning:
-        emit addOutput(certInfoPtr.data()->errorString(), BuildStep::MessageOutput);
-        emit addTask(ProjectExplorer::Task(ProjectExplorer::Task::Warning,
-                                           certInfoPtr.data()->errorString(),
-                                           QString(), -1,
-                                           ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+        reportPackageStepIssue(certInfoPtr.data()->errorString(), false);
         break;
     default:
         break;
     }
+
+    QStringList unsupportedCaps;
+    if (certInfoPtr.data()->compareCapabilities(capabilitiesInPro, unsupportedCaps)) {
+        if (!unsupportedCaps.isEmpty()) {
+            QString message = tr("The created package will not install on a "
+                                 "device as some of the defined capabilities "
+                                 "are not supported by the certificate: %1")
+                    .arg(unsupportedCaps.join(" "));
+            reportPackageStepIssue(message, true);
+            return false;
+        }
+
+    } else
+        reportPackageStepIssue(certInfoPtr.data()->errorString(), false);
     return true;
 }
 
-
+void S60CreatePackageStep::reportPackageStepIssue(const QString &message, bool isError )
+{
+    emit addOutput(message, isError?
+                       BuildStep::ErrorMessageOutput:
+                       BuildStep::MessageOutput);
+    emit addTask(ProjectExplorer::Task(isError?
+                                           ProjectExplorer::Task::Error:
+                                           ProjectExplorer::Task::Warning,
+                                       message,
+                                       QString(), -1,
+                                       ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+}
 
 void S60CreatePackageStep::packageWarningDialogDone()
 {
index e59ebbb..6976b2e 100644 (file)
@@ -136,9 +136,10 @@ private:
     void stdOutput(const QString &line);
     void stdError(const QString &line);
 
+    void reportPackageStepIssue(const QString &message, bool isError );
     void setupProcess();
     bool createOnePackage();
-    bool validateCustomSigningResources();
+    bool validateCustomSigningResources(const QStringList &capabilitiesInPro);
 
     QString generateKeyId(const QString &keyPath) const;
     QString loadPassphraseForKey(const QString &keyId);
index afc06f6..ceb272b 100644 (file)
@@ -1256,6 +1256,41 @@ QString Qt4ProFileNode::makefile() const
     return m_varValues[Makefile].first();
 }
 
+QStringList Qt4ProFileNode::symbianCapabilities() const
+{
+    QStringList lowerCasedResult;
+
+    QStringList all;
+    all << "LocalServices" << "UserEnvironment" << "NetworkServices"
+        << "ReadUserData" << "WriteUserData" << "Location" << "SwEvent"
+        << "SurroundingsDD" << "ProtServ" << "PowerMgmt" << "ReadDeviceData"
+        << "WriteDeviceData" << "TrustedUI" << "NetworkControl"
+        << "MultimediaDD"<< "CommDD" << "DiskAdmin" << "AllFiles" << "DRM" << "TCB";
+
+    foreach (const QString &cap, m_varValues[SymbianCapabilities]) {
+        QString capability = cap.toLower();
+        if (capability.startsWith("-")) {
+            lowerCasedResult.removeAll(capability.mid(1));
+        } else if (capability == "all") {
+            foreach (const QString &a, all)
+                if (!lowerCasedResult.contains(a, Qt::CaseInsensitive))
+                    lowerCasedResult << a.toLower();
+        } else {
+            lowerCasedResult << cap;
+        }
+    }
+    QStringList result; //let's make the result pretty
+    int index;
+    foreach (QString lowerCase, lowerCasedResult) {
+        index = all.indexOf(lowerCase);
+        if (index != -1)
+            result << all.at(index);
+        else
+            result << lowerCase; //strange capability!
+    }
+    return result;
+}
+
 /*!
   \class Qt4ProFileNode
   Implements abstract ProjectNode class
@@ -1706,9 +1741,15 @@ void Qt4ProFileNode::applyEvaluate(bool parseResult, bool async)
     newVarValues[QmlImportPathVar] = m_readerExact->absolutePathValues(
                 QLatin1String("QML_IMPORT_PATH"), m_projectDir);
     newVarValues[Makefile] = m_readerExact->values("MAKEFILE");
+    // We use the cumulative parse so that we get the capabilities for symbian even if
+    // a different target is selected and the capabilities are set in a symbian scope
+
+    newVarValues[SymbianCapabilities] = m_readerCumulative->values("TARGET.CAPABILITY");
+
 
     if (m_varValues != newVarValues) {
         m_varValues = newVarValues;
+
         foreach (NodesWatcher *watcher, watchers())
             if (Qt4NodesWatcher *qt4Watcher = qobject_cast<Qt4NodesWatcher*>(watcher))
                 emit qt4Watcher->variablesChanged(this, m_varValues, newVarValues);
index 01fcc3d..ec90f42 100644 (file)
@@ -96,7 +96,8 @@ enum Qt4Variable {
     LibDirectoriesVar,
     ConfigVar,
     QmlImportPathVar,
-    Makefile
+    Makefile,
+    SymbianCapabilities
 };
 
 class Qt4PriFileNode;
@@ -294,6 +295,7 @@ public:
     InstallsList installsList() const;
 
     QString makefile() const;
+    QStringList symbianCapabilities() const;
 
     void update();
     void scheduleUpdate();