summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/packagemanagercoredata.cpp
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2012-10-25 12:39:28 +0200
committerKarsten Heimrich <karsten.heimrich@digia.com>2012-10-25 17:45:54 +0200
commit597118b2a2736e7c5696025b6ac89c576ca31268 (patch)
tree49522d88d5ef1f6d1fcccc481d2bc69249077c15 /src/libs/installer/packagemanagercoredata.cpp
parent7f6fb7e915d742216aca9a6a5b06ab0b5c4c0fe5 (diff)
Have a new class to control user set value access.
Since both the settings object and the core engine hold user set'able values, we need to channel access thru a common object. Change-Id: I4583a8ee4639cd204a778ee125b19f69a1def710 Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
Diffstat (limited to 'src/libs/installer/packagemanagercoredata.cpp')
-rw-r--r--src/libs/installer/packagemanagercoredata.cpp188
1 files changed, 188 insertions, 0 deletions
diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp
new file mode 100644
index 000000000..3c31abac0
--- /dev/null
+++ b/src/libs/installer/packagemanagercoredata.cpp
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Installer Framework.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "packagemanagercoredata.h"
+
+#include "errors.h"
+#include "qsettingswrapper.h"
+
+#include <QDir>
+
+namespace QInstaller
+{
+
+PackageManagerCoreData::PackageManagerCoreData(const QHash<QString, QString> &variables)
+{
+ m_variables = variables;
+
+ // Set some common variables that may used e.g. as placeholder in some of the settings variables or
+ // in a script or...
+ m_variables.insert(QLatin1String("rootDir"), QDir::rootPath());
+ m_variables.insert(QLatin1String("homeDir"), QDir::homePath());
+ m_variables.insert(scTargetConfigurationFile, QLatin1String("components.xml"));
+
+#ifdef Q_OS_WIN
+ m_variables.insert(QLatin1String("os"), QLatin1String("win"));
+#elif defined(Q_OS_MAC)
+ m_variables.insert(QLatin1String("os"), QLatin1String("mac"));
+#elif defined(Q_OS_LINUX)
+ m_variables.insert(QLatin1String("os"), QLatin1String("x11"));
+#elif defined(Q_OS_QWS)
+ m_variables.insert(QLatin1String("os"), QLatin1String("Qtopia"));
+#else
+ // TODO: add more platforms as needed...
+#endif
+
+ try {
+ m_settings =
+ Settings(Settings::fromFileAndPrefix(QLatin1String(":/metadata/installer-config/config.xml"),
+ QLatin1String(":/metadata/installer-config/")));
+ } catch (const Error &e) {
+ // TODO: try better error handling
+ qCritical("Could not parse Config: %s", qPrintable(e.message()));
+ return;
+ }
+
+ // fill the variables defined in the settings
+ m_variables.insert(QLatin1String("ProductName"), m_settings.applicationName());
+ m_variables.insert(QLatin1String("ProductVersion"), m_settings.applicationVersion());
+ m_variables.insert(scTitle, m_settings.title());
+ m_variables.insert(scPublisher, m_settings.publisher());
+ m_variables.insert(QLatin1String("Url"), m_settings.url());
+ m_variables.insert(scStartMenuDir, m_settings.startMenuDir());
+ m_variables.insert(scTargetConfigurationFile, m_settings.configurationFileName());
+ m_variables.insert(QLatin1String("LogoPixmap"), m_settings.logo());
+ m_variables.insert(QLatin1String("LogoSmallPixmap"), m_settings.logoSmall());
+ m_variables.insert(QLatin1String("WatermarkPixmap"), m_settings.watermark());
+
+ const QString description = m_settings.runProgramDescription();
+ if (!description.isEmpty())
+ m_variables.insert(scRunProgramDescription, description);
+
+ m_variables.insert(scTargetDir, replaceVariables(m_settings.targetDir()));
+ m_variables.insert(scRunProgram, replaceVariables(m_settings.runProgram()));
+ m_variables.insert(scRemoveTargetDir, replaceVariables(m_settings.removeTargetDir()));
+}
+
+void PackageManagerCoreData::clear()
+{
+ m_variables.clear();
+ m_settings = Settings();
+}
+
+Settings &PackageManagerCoreData::settings() const
+{
+ return m_settings;
+}
+
+QList<QString> PackageManagerCoreData::keys() const
+{
+ return m_variables.keys();
+}
+
+bool PackageManagerCoreData::contains(const QString &key) const
+{
+ return m_variables.contains(key) || m_settings.containsValue(key);
+}
+
+bool PackageManagerCoreData::setValue(const QString &key, const QString &normalizedValue)
+{
+ if (m_variables.value(key) == normalizedValue)
+ return false;
+ m_variables.insert(key, normalizedValue);
+ return true;
+}
+
+QVariant PackageManagerCoreData::value(const QString &key, const QVariant &_default) const
+{
+#ifdef Q_OS_WIN
+ if (!m_variables.contains(key)) {
+ static const QRegExp regex(QLatin1String("\\\\|/"));
+ const QString filename = key.section(regex, 0, -2);
+ const QString regKey = key.section(regex, -1);
+ const QSettingsWrapper registry(filename, QSettingsWrapper::NativeFormat);
+ if (!filename.isEmpty() && !regKey.isEmpty() && registry.contains(regKey))
+ return registry.value(regKey).toString();
+ }
+#else
+ if (key == scTargetDir) {
+ const QString dir = m_variables.value(key, _default.toString());
+ if (dir.startsWith(QLatin1String("~/")))
+ return QDir::home().absoluteFilePath(dir.mid(2));
+ return dir;
+ }
+#endif
+ if (m_variables.contains(key))
+ return m_variables.value(key);
+
+ return m_settings.value(key, _default);
+}
+
+QString PackageManagerCoreData::replaceVariables(const QString &str) const
+{
+ static const QChar at = QLatin1Char('@');
+ QString res;
+ int pos = 0;
+ while (true) {
+ const int pos1 = str.indexOf(at, pos);
+ if (pos1 == -1)
+ break;
+ const int pos2 = str.indexOf(at, pos1 + 1);
+ if (pos2 == -1)
+ break;
+ res += str.mid(pos, pos1 - pos);
+ const QString name = str.mid(pos1 + 1, pos2 - pos1 - 1);
+ res += value(name).toString();
+ pos = pos2 + 1;
+ }
+ res += str.mid(pos);
+ return res;
+}
+
+QByteArray PackageManagerCoreData::replaceVariables(const QByteArray &ba) const
+{
+ static const QChar at = QLatin1Char('@');
+ QByteArray res;
+ int pos = 0;
+ while (true) {
+ const int pos1 = ba.indexOf(at, pos);
+ if (pos1 == -1)
+ break;
+ const int pos2 = ba.indexOf(at, pos1 + 1);
+ if (pos2 == -1)
+ break;
+ res += ba.mid(pos, pos1 - pos);
+ const QString name = QString::fromLocal8Bit(ba.mid(pos1 + 1, pos2 - pos1 - 1));
+ res += value(name).toString().toLocal8Bit();
+ pos = pos2 + 1;
+ }
+ res += ba.mid(pos);
+ return res;
+}
+
+} // namespace QInstaller