diff options
author | kh1 <karsten.heimrich@digia.com> | 2012-10-25 12:39:28 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@digia.com> | 2012-10-25 17:45:54 +0200 |
commit | 597118b2a2736e7c5696025b6ac89c576ca31268 (patch) | |
tree | 49522d88d5ef1f6d1fcccc481d2bc69249077c15 /src/libs/installer/packagemanagercoredata.cpp | |
parent | 7f6fb7e915d742216aca9a6a5b06ab0b5c4c0fe5 (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.cpp | 188 |
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 |