summaryrefslogtreecommitdiffstats
path: root/src/application-lib/applicationinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/application-lib/applicationinfo.cpp')
-rw-r--r--src/application-lib/applicationinfo.cpp355
1 files changed, 60 insertions, 295 deletions
diff --git a/src/application-lib/applicationinfo.cpp b/src/application-lib/applicationinfo.cpp
index f746f849..661ffa3c 100644
--- a/src/application-lib/applicationinfo.cpp
+++ b/src/application-lib/applicationinfo.cpp
@@ -4,7 +4,7 @@
** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
-** This file is part of the Luxoft Application Manager.
+** This file is part of the Qt Application Manager.
**
** $QT_BEGIN_LICENSE:LGPL-QTAS$
** Commercial License Usage
@@ -40,82 +40,17 @@
**
****************************************************************************/
-#include <QDebug>
+#include <QDataStream>
#include <QBuffer>
#include "applicationinfo.h"
#include "exception.h"
#include "installationreport.h"
+#include "packageinfo.h"
+#include "utilities.h"
QT_BEGIN_NAMESPACE_AM
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// AbstractApplicationInfo
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool AbstractApplicationInfo::isValidApplicationId(const QString &appId, bool isAliasName, QString *errorString)
-{
- static const int maxLength = 150;
-
- try {
- if (appId.isEmpty())
- throw Exception(Error::Parse, "must not be empty");
-
- // we need to make sure that we can use the name as directory on a FAT formatted SD-card,
- // which has a 255 character path length restriction
- if (appId.length() > maxLength)
- throw Exception(Error::Parse, "the maximum length is %1 characters (found %2 characters)").arg(maxLength, appId.length());
-
- int aliasPos = -1;
-
- // aliases need to have the '@' marker
- if (isAliasName) {
- aliasPos = appId.indexOf(qL1C('@'));
- if (aliasPos < 0 || aliasPos == (appId.size() - 1))
- throw Exception(Error::Parse, "missing alias-id tag '@'");
- }
-
- // all characters need to be ASCII minus '@' and any filesystem special characters:
- bool spaceOnly = true;
- static const char forbiddenChars[] = "@<>:\"/\\|?*";
- for (int pos = 0; pos < appId.length(); ++pos) {
- if (pos == aliasPos)
- continue;
- ushort ch = appId.at(pos).unicode();
- if ((ch < 0x20) || (ch > 0x7f) || strchr(forbiddenChars, ch & 0xff)) {
- throw Exception(Error::Parse, "must consist of printable ASCII characters only, except any of \'%1'")
- .arg(QString::fromLatin1(forbiddenChars));
- }
- if (spaceOnly)
- spaceOnly = QChar(ch).isSpace();
- }
- if (spaceOnly)
- throw Exception(Error::Parse, "must not consist of only white-space characters");
-
- return true;
- } catch (const Exception &e) {
- if (errorString)
- *errorString = e.errorString();
- return false;
- }
-}
-
-bool AbstractApplicationInfo::isValidIcon(const QString &icon, QString &errorString)
-{
- if (icon.isEmpty()) {
- errorString = qSL("it's empty");
- return false;
- }
-
- QFileInfo fileInfo(icon);
-
- if (fileInfo.fileName() != icon) {
- errorString = QString(qSL("'%1' is not a valid file name")).arg(icon);
- return false;
- }
-
- return true;
-}
//TODO Make this really unique
static int uniqueCounter = 0;
@@ -127,163 +62,113 @@ static int nextUniqueNumber() {
return uniqueCounter;
}
-AbstractApplicationInfo::AbstractApplicationInfo()
- : m_uniqueNumber(nextUniqueNumber())
+ApplicationInfo::ApplicationInfo(PackageInfo *packageInfo)
+ : m_packageInfo(packageInfo)
+ , m_uniqueNumber(nextUniqueNumber())
+{ }
+
+PackageInfo *ApplicationInfo::packageInfo() const
{
+ return m_packageInfo;
}
-QString AbstractApplicationInfo::id() const
+QString ApplicationInfo::id() const
{
return m_id;
}
-int AbstractApplicationInfo::uniqueNumber() const
+int ApplicationInfo::uniqueNumber() const
{
return m_uniqueNumber;
}
-QMap<QString, QString> AbstractApplicationInfo::names() const
-{
- return m_name;
-}
-
-QString AbstractApplicationInfo::name(const QString &language) const
-{
- return m_name.value(language);
-}
-
-QString AbstractApplicationInfo::icon() const
-{
- return m_icon;
-}
-
-QString AbstractApplicationInfo::documentUrl() const
-{
- return m_documentUrl;
-}
-
-QVariantMap AbstractApplicationInfo::applicationProperties() const
+QVariantMap ApplicationInfo::applicationProperties() const
{
return m_sysAppProperties;
}
-QVariantMap AbstractApplicationInfo::allAppProperties() const
+QVariantMap ApplicationInfo::allAppProperties() const
{
return m_allAppProperties;
}
-void AbstractApplicationInfo::validate() const Q_DECL_NOEXCEPT_EXPR(false)
-{
- QString errorMsg;
- if (!isValidApplicationId(id(), isAlias(), &errorMsg))
- throw Exception(Error::Parse, "the identifier (%1) is not a valid application-id: %2").arg(id()).arg(errorMsg);
-
- if (!isValidIcon(icon(), errorMsg))
- throw Exception(Error::Parse, "Invalid 'icon' field: %1").arg(errorMsg);
-
- if (names().isEmpty())
- throw Exception(Error::Parse, "the 'name' field must not be empty");
-
- // This check won't work during installations, since the icon file is extracted after info.json
- // if (!QFile::exists(displayIcon()))
- // throw Exception("the 'icon' field refers to a non-existent file");
-
- //TODO: check for valid capabilities
-}
-
-void AbstractApplicationInfo::read(QDataStream &ds)
-{
- ds >> m_id
- >> m_uniqueNumber
- >> m_name
- >> m_icon
- >> m_documentUrl
- >> m_sysAppProperties
- >> m_allAppProperties;
-
- uniqueCounter = qMax(uniqueCounter, m_uniqueNumber);
-}
-
-void AbstractApplicationInfo::writeToDataStream(QDataStream &ds) const
+void ApplicationInfo::writeToDataStream(QDataStream &ds) const
{
- ds << isAlias()
- << m_id
+ ds << m_id
<< m_uniqueNumber
- << m_name
- << m_icon
- << m_documentUrl
<< m_sysAppProperties
- << m_allAppProperties;
+ << m_allAppProperties
+ << m_codeFilePath
+ << m_runtimeName
+ << m_runtimeParameters
+ << m_supportsApplicationInterface
+ << m_capabilities
+ << m_openGLConfiguration;
}
-AbstractApplicationInfo *AbstractApplicationInfo::readFromDataStream(QDataStream &ds)
+ApplicationInfo *ApplicationInfo::readFromDataStream(PackageInfo *pkg, QDataStream &ds)
{
- bool isAlias;
- ds >> isAlias;
+ QScopedPointer<ApplicationInfo> app(new ApplicationInfo(pkg));
- QScopedPointer<AbstractApplicationInfo> app;
+ ds >> app->m_id
+ >> app->m_uniqueNumber
+ >> app->m_sysAppProperties
+ >> app->m_allAppProperties
+ >> app->m_codeFilePath
+ >> app->m_runtimeName
+ >> app->m_runtimeParameters
+ >> app->m_supportsApplicationInterface
+ >> app->m_capabilities
+ >> app->m_openGLConfiguration;
- if (isAlias)
- app.reset(new ApplicationAliasInfo);
- else
- app.reset(new ApplicationInfo);
-
- app->read(ds);
+ uniqueCounter = qMax(uniqueCounter, app->m_uniqueNumber);
+ app->m_capabilities.sort();
return app.take();
}
-void AbstractApplicationInfo::toVariantMapHelper(QVariantMap &map) const
+
+QVariantMap ApplicationInfo::toVariantMap() const
{
+ QVariantMap map;
//TODO: check if we can find a better method to keep this as similar as possible to
// ApplicationManager::get().
- // This is used for RuntimeInterface::startApplication(), ContainerInterface and
- // ApplicationInstaller::taskRequestingInstallationAcknowledge.
+ // This is used for RuntimeInterface::startApplication() and the ContainerInterface
map[qSL("id")] = m_id;
map[qSL("uniqueNumber")] = m_uniqueNumber;
{
QVariantMap displayName;
- auto names = m_name;
+ auto names = packageInfo()->names();
for (auto it = names.constBegin(); it != names.constEnd(); ++it)
displayName.insert(it.key(), it.value());
map[qSL("displayName")] = displayName;
}
- map[qSL("displayIcon")] = m_icon;
+ map[qSL("displayIcon")] = packageInfo()->icon();
map[qSL("applicationProperties")] = m_allAppProperties;
-}
+ map[qSL("codeFilePath")] = m_codeFilePath;
+ map[qSL("runtimeName")] = m_runtimeName;
+ map[qSL("runtimeParameters")] = m_runtimeParameters;
+ map[qSL("capabilities")] = m_capabilities;
+ map[qSL("mimeTypes")] = m_supportedMimeTypes;
+
+ map[qSL("categories")] = packageInfo()->categories();
+ map[qSL("version")] = packageInfo()->version();
+ map[qSL("baseDir")] = packageInfo()->baseDir().absolutePath();
+ map[qSL("codeDir")] = map[qSL("baseDir")]; // 5.12 backward compatibility
+ map[qSL("manifestDir")] = map[qSL("baseDir")]; // 5.12 backward compatibility
+ map[qSL("installationLocationId")] = packageInfo()->installationReport() ? qSL("internal-0") : QString();
+ map[qSL("supportsApplicationInterface")] = m_supportsApplicationInterface;
+ map[qSL("dlt")] = packageInfo()->dltConfiguration();
-QVariantMap AbstractApplicationInfo::toVariantMap() const
-{
- QVariantMap map;
- toVariantMapHelper(map);
return map;
}
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// ApplicationInfo
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-ApplicationInfo::ApplicationInfo()
-{ }
-
-void ApplicationInfo::validate() const Q_DECL_NOEXCEPT_EXPR(false)
-{
- AbstractApplicationInfo::validate();
-
- if (absoluteCodeFilePath().isEmpty())
- throw Exception(Error::Parse, "the 'code' field must not be empty");
-
- if (runtimeName().isEmpty())
- throw Exception(Error::Parse, "the 'runtimeName' field must not be empty");
-}
-
QString ApplicationInfo::absoluteCodeFilePath() const
{
- QString code = m_codeFilePath;
- return code.isEmpty() ? QString() : QDir(codeDir()).absoluteFilePath(code);
+ return toAbsoluteFilePath(m_codeFilePath, packageInfo()->baseDir().path());
}
QString ApplicationInfo::codeFilePath() const
@@ -301,11 +186,6 @@ QVariantMap ApplicationInfo::runtimeParameters() const
return m_runtimeParameters;
}
-bool ApplicationInfo::isBuiltIn() const
-{
- return m_builtIn;
-}
-
QStringList ApplicationInfo::capabilities() const
{
return m_capabilities;
@@ -313,17 +193,7 @@ QStringList ApplicationInfo::capabilities() const
QStringList ApplicationInfo::supportedMimeTypes() const
{
- return m_mimeTypes;
-}
-
-QStringList ApplicationInfo::categories() const
-{
- return m_categories;
-}
-
-QString ApplicationInfo::version() const
-{
- return m_version;
+ return m_supportedMimeTypes;
}
QVariantMap ApplicationInfo::openGLConfiguration() const
@@ -331,114 +201,9 @@ QVariantMap ApplicationInfo::openGLConfiguration() const
return m_openGLConfiguration;
}
-QVariantList ApplicationInfo::intents() const
-{
- return m_intents;
-}
-
-void ApplicationInfo::setBuiltIn(bool builtIn)
-{
- m_builtIn = builtIn;
-}
-
-void ApplicationInfo::setSupportsApplicationInterface(bool supportsAppInterface)
-{
- m_supportsApplicationInterface = supportsAppInterface;
-}
-
-void ApplicationInfo::writeToDataStream(QDataStream &ds) const
-{
- AbstractApplicationInfo::writeToDataStream(ds);
-
- QByteArray serializedReport;
-
- if (auto report = installationReport()) {
- QBuffer buffer(&serializedReport);
- buffer.open(QBuffer::WriteOnly);
- report->serialize(&buffer);
- }
-
- ds << m_codeFilePath
- << m_runtimeName
- << m_runtimeParameters
- << m_supportsApplicationInterface
- << m_builtIn
- << m_capabilities
- << m_categories
- << m_mimeTypes
- << m_version
- << m_openGLConfiguration
- << serializedReport
- << m_manifestDir.absolutePath()
- << m_codeDir.absolutePath()
- << m_uid
- << m_dlt
- << m_intents;
-}
-
bool ApplicationInfo::supportsApplicationInterface() const
{
return m_supportsApplicationInterface;
}
-void ApplicationInfo::read(QDataStream &ds)
-{
- AbstractApplicationInfo::read(ds);
-
- QString codeDir;
- QString manifestDir;
- QByteArray installationReport;
-
- ds >> m_codeFilePath
- >> m_runtimeName
- >> m_runtimeParameters
- >> m_supportsApplicationInterface
- >> m_builtIn
- >> m_capabilities
- >> m_categories
- >> m_mimeTypes
- >> m_version
- >> m_openGLConfiguration
- >> installationReport
- >> manifestDir
- >> codeDir
- >> m_uid
- >> m_dlt
- >> m_intents;
-
- m_capabilities.sort();
- m_categories.sort();
- m_mimeTypes.sort();
-
- m_codeDir.setPath(codeDir);
- m_manifestDir.setPath(manifestDir);
- if (!installationReport.isEmpty()) {
- QBuffer buffer(&installationReport);
- buffer.open(QBuffer::ReadOnly);
- m_installationReport.reset(new InstallationReport(m_id));
- if (!m_installationReport->deserialize(&buffer))
- m_installationReport.reset();
- }
-}
-
-void ApplicationInfo::toVariantMapHelper(QVariantMap &map) const
-{
- AbstractApplicationInfo::toVariantMapHelper(map);
-
- map[qSL("codeFilePath")] = m_codeFilePath;
- map[qSL("runtimeName")] = m_runtimeName;
- map[qSL("runtimeParameters")] = m_runtimeParameters;
- map[qSL("capabilities")] = m_capabilities;
- map[qSL("mimeTypes")] = m_mimeTypes;
- map[qSL("categories")] = m_categories;
- map[qSL("version")] = m_version;
- map[qSL("codeDir")] = m_codeDir.absolutePath();
- map[qSL("manifestDir")] = m_manifestDir.absolutePath();
- map[qSL("installationLocationId")] = installationReport() ? installationReport()->installationLocationId()
- : QString();
- map[qSL("supportsApplicationInterface")] = m_supportsApplicationInterface;
- map[qSL("dlt")] = m_dlt;
- map[qSL("intents")] = m_intents;
-}
-
QT_END_NAMESPACE_AM