summaryrefslogtreecommitdiff
path: root/src/plugins/qt4projectmanager
diff options
context:
space:
mode:
authorPawel Polanski <pawel.3.polanski@nokia.com>2010-12-14 16:19:44 +0100
committerPawel Polanski <pawel.3.polanski@nokia.com>2010-12-14 16:37:50 +0100
commit057591e0dd663a838bfacba9d671a2f1a82a1a9e (patch)
tree8366ed8b51e1845b09972e47b5bf89bbd29deac2 /src/plugins/qt4projectmanager
parent5ed78fb633b448488d7ed2c758d0bf818e0a20b5 (diff)
downloadqt-creator-057591e0dd663a838bfacba9d671a2f1a82a1a9e.tar.gz
If capabilities inside pro files do not match the dev cert an error is generated (SymbianOS)
Diffstat (limited to 'src/plugins/qt4projectmanager')
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.cpp16
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.h2
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp55
-rw-r--r--src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h3
-rw-r--r--src/plugins/qt4projectmanager/qt4nodes.cpp41
-rw-r--r--src/plugins/qt4projectmanager/qt4nodes.h4
6 files changed, 100 insertions, 21 deletions
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.cpp b/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.cpp
index c2a67eb57f..f6462bdcee 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.cpp
@@ -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;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.h b/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.h
index 16f55511dc..609a280437 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60certificateinfo.h
@@ -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;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
index 386181025a..496f34db27 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
@@ -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()
{
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
index e59ebbb82a..6976b2e25d 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
@@ -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);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index afc06f6c9b..ceb272bc4c 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -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);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index 01fcc3da80..ec90f428c9 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -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();