From 597118b2a2736e7c5696025b6ac89c576ca31268 Mon Sep 17 00:00:00 2001 From: kh1 Date: Thu, 25 Oct 2012 12:39:28 +0200 Subject: 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 --- src/libs/installer/getrepositoriesmetainfojob.cpp | 2 +- src/libs/installer/getrepositorymetainfojob.cpp | 16 +- src/libs/installer/installer.pro | 8 +- src/libs/installer/packagemanagercore.cpp | 48 ++---- src/libs/installer/packagemanagercore_p.cpp | 181 +++++++-------------- src/libs/installer/packagemanagercore_p.h | 6 +- src/libs/installer/packagemanagercoredata.cpp | 188 ++++++++++++++++++++++ src/libs/installer/packagemanagercoredata.h | 62 +++++++ src/libs/installer/packagemanagergui.cpp | 7 +- 9 files changed, 338 insertions(+), 180 deletions(-) create mode 100644 src/libs/installer/packagemanagercoredata.cpp create mode 100644 src/libs/installer/packagemanagercoredata.h (limited to 'src') diff --git a/src/libs/installer/getrepositoriesmetainfojob.cpp b/src/libs/installer/getrepositoriesmetainfojob.cpp index 1e7092129..ebe91d1ba 100644 --- a/src/libs/installer/getrepositoriesmetainfojob.cpp +++ b/src/libs/installer/getrepositoriesmetainfojob.cpp @@ -112,7 +112,7 @@ void GetRepositoriesMetaInfoJob::doStart() { if ((m_corePrivate->isInstaller() && !m_corePrivate->isOfflineOnly()) || (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager())) { - foreach (const Repository &repo, m_corePrivate->m_settings.repositories()) { + foreach (const Repository &repo, m_corePrivate->m_data.settings().repositories()) { if (repo.isEnabled()) m_repositories += repo; } diff --git a/src/libs/installer/getrepositorymetainfojob.cpp b/src/libs/installer/getrepositorymetainfojob.cpp index 689f4a4ed..e538ead01 100644 --- a/src/libs/installer/getrepositorymetainfojob.cpp +++ b/src/libs/installer/getrepositorymetainfojob.cpp @@ -326,7 +326,7 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() } if (!repositoryUpdates.isEmpty()) { - if (m_corePrivate->m_settings.updateDefaultRepositories(repositoryUpdates) + if (m_corePrivate->m_data.settings().updateDefaultRepositories(repositoryUpdates) == Settings::UpdatesApplied) { if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager()) m_corePrivate->writeMaintenanceConfigFiles(); @@ -532,22 +532,22 @@ void GetRepositoryMetaInfoJob::onAuthenticatorChanged(const QAuthenticator &auth const QString username = authenticator.user(); const QString password = authenticator.password(); if (username != m_repository.username() || password != m_repository.password()) { - QSet repositories = m_corePrivate->m_settings.defaultRepositories(); + QSet repositories = m_corePrivate->m_data.settings().defaultRepositories(); bool reposChanged = updateRepositories(&repositories, username, password); if (reposChanged) - m_corePrivate->m_settings.setDefaultRepositories(repositories); + m_corePrivate->m_data.settings().setDefaultRepositories(repositories); - repositories = m_corePrivate->m_settings.temporaryRepositories(); + repositories = m_corePrivate->m_data.settings().temporaryRepositories(); reposChanged |= updateRepositories(&repositories, username, password); if (reposChanged) { - m_corePrivate->m_settings.setTemporaryRepositories(repositories, - m_corePrivate->m_settings.hasReplacementRepos()); + m_corePrivate->m_data.settings().setTemporaryRepositories(repositories, + m_corePrivate->m_data.settings().hasReplacementRepos()); } - repositories = m_corePrivate->m_settings.userRepositories(); + repositories = m_corePrivate->m_data.settings().userRepositories(); reposChanged |= updateRepositories(&repositories, username, password); if (reposChanged) - m_corePrivate->m_settings.setUserRepositories(repositories); + m_corePrivate->m_data.settings().setUserRepositories(repositories); if (reposChanged) { if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager()) diff --git a/src/libs/installer/installer.pro b/src/libs/installer/installer.pro index 4081b5bf5..92da50551 100644 --- a/src/libs/installer/installer.pro +++ b/src/libs/installer/installer.pro @@ -89,9 +89,10 @@ HEADERS += packagemanagercore.h \ createlocalrepositoryoperation.h \ lib7z_facade.h \ link.h \ - createlinkoperation.h + createlinkoperation.h \ + packagemanagercoredata.h -SOURCES += packagemanagercore.cpp \ + SOURCES += packagemanagercore.cpp \ packagemanagercore_p.cpp \ packagemanagergui.cpp \ binaryformat.cpp \ @@ -160,7 +161,8 @@ SOURCES += packagemanagercore.cpp \ createlocalrepositoryoperation.cpp \ lib7z_facade.cpp \ link.cpp \ - createlinkoperation.cpp + createlinkoperation.cpp \ + packagemanagercoredata.cpp RESOURCES += resources/patch_file_lists.qrc \ resources/installer.qrc diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 2dda4205f..2aac6569c 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -295,9 +295,8 @@ void PackageManagerCore::reset(const QHash ¶ms) d->m_forceRestart = false; d->m_status = PackageManagerCore::Unfinished; d->m_installerBaseBinaryUnreplaced.clear(); - d->m_vars.clear(); - d->m_vars = params; - d->initialize(); + + d->initialize(params); } /*! @@ -509,7 +508,7 @@ PackageManagerCore::PackageManagerCore(qint64 magicmaker, const OperationList &p qRegisterMetaType("QInstaller::PackageManagerCore::Status"); qRegisterMetaType("QInstaller::PackageManagerCore::WizardPage"); - d->initialize(); + d->initialize(QHash()); } PackageManagerCore::~PackageManagerCore() @@ -775,7 +774,7 @@ void PackageManagerCore::addUserRepositories(const QStringList &repositories) foreach (const QString &repository, repositories) repositorySet.insert(Repository::fromUserInput(repository)); - d->m_settings.addUserRepositories(repositorySet); + settings().addUserRepositories(repositorySet); } /*! @@ -788,7 +787,7 @@ void PackageManagerCore::setTemporaryRepositories(const QStringList &repositorie foreach (const QString &repository, repositories) repositorySet.insert(Repository::fromUserInput(repository)); - d->m_settings.setTemporaryRepositories(repositorySet, replace); + settings().setTemporaryRepositories(repositorySet, replace); } /*! @@ -1069,7 +1068,7 @@ ComponentModel *PackageManagerCore::updaterComponentModel() const Settings &PackageManagerCore::settings() const { - return d->m_settings; + return d->m_data.settings(); } /*! @@ -1354,27 +1353,7 @@ void PackageManagerCore::setInstallerBaseBinary(const QString &path) */ QString PackageManagerCore::value(const QString &key, const QString &defaultValue) const { -#ifdef Q_OS_WIN - if (!d->m_vars.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 = d->m_vars.value(key, defaultValue); - if (dir.startsWith(QLatin1String("~/"))) - return QDir::home().absoluteFilePath(dir.mid(2)); - return dir; - } -#endif - if (d->m_vars.contains(key)) - return d->m_vars.value(key); - - return d->m_settings.value(key, defaultValue).toString(); + return d->m_data.value(key, defaultValue).toString(); } /*! @@ -1382,12 +1361,9 @@ QString PackageManagerCore::value(const QString &key, const QString &defaultValu */ void PackageManagerCore::setValue(const QString &key, const QString &value) { - QString normalizedValue = replaceVariables(value); - if (d->m_vars.value(key) == normalizedValue) - return; - - d->m_vars.insert(key, normalizedValue); - emit valueChanged(key, normalizedValue); + const QString normalizedValue = replaceVariables(value); + if (d->m_data.setValue(key, normalizedValue)) + emit valueChanged(key, normalizedValue); } /*! @@ -1395,7 +1371,7 @@ void PackageManagerCore::setValue(const QString &key, const QString &value) */ bool PackageManagerCore::containsValue(const QString &key) const { - return d->m_vars.contains(key) || d->m_settings.containsValue(key); + return d->m_data.contains(key); } void PackageManagerCore::setSharedFlag(const QString &key, bool value) @@ -1465,7 +1441,7 @@ QStringList PackageManagerCore::replaceVariables(const QStringList &str) const { QStringList result; foreach (const QString &s, str) - result.push_back(d->replaceVariables(s)); + result.append(d->replaceVariables(s)); return result; } diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 3a31f54fe..a805c439e 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -513,61 +513,16 @@ QString PackageManagerCorePrivate::installReason(Component *component) } -void PackageManagerCorePrivate::initialize() +void PackageManagerCorePrivate::initialize(const QHash ¶ms) { m_coreCheckedHash.clear(); + m_data = PackageManagerCoreData(params); m_componentsToInstallCalculated = false; - // first set some common variables that may used e.g. as placeholder - // in some of the settings variables or in a script or... - m_vars.insert(QLatin1String("rootDir"), QDir::rootPath()); - m_vars.insert(QLatin1String("homeDir"), QDir::homePath()); - m_vars.insert(scTargetConfigurationFile, QLatin1String("components.xml")); - -#ifdef Q_OS_WIN - m_vars.insert(QLatin1String("os"), QLatin1String("win")); -#elif defined(Q_OS_MAC) - m_vars.insert(QLatin1String("os"), QLatin1String("mac")); -#elif defined(Q_WS_X11) - m_vars.insert(QLatin1String("os"), QLatin1String("x11")); -#elif defined(Q_OS_QWS) - m_vars.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) { - qCritical("Could not parse Config: %s", qPrintable(e.message())); - // TODO: try better error handling - return; - } - - // fill the variables defined in the settings - m_vars.insert(QLatin1String("ProductName"), m_settings.applicationName()); - m_vars.insert(QLatin1String("ProductVersion"), m_settings.applicationVersion()); - m_vars.insert(scTitle, m_settings.title()); - m_vars.insert(scPublisher, m_settings.publisher()); - m_vars.insert(QLatin1String("Url"), m_settings.url()); - m_vars.insert(scStartMenuDir, m_settings.startMenuDir()); - m_vars.insert(scTargetConfigurationFile, m_settings.configurationFileName()); - m_vars.insert(QLatin1String("LogoPixmap"), m_settings.logo()); - m_vars.insert(QLatin1String("LogoSmallPixmap"), m_settings.logoSmall()); - m_vars.insert(QLatin1String("WatermarkPixmap"), m_settings.watermark()); - - m_vars.insert(scRunProgram, replaceVariables(m_settings.runProgram())); - const QString desc = m_settings.runProgramDescription(); - if (!desc.isEmpty()) - m_vars.insert(scRunProgramDescription, desc); -#ifdef Q_WS_X11 +#ifdef Q_OS_LINUX if (m_launchedAsRoot) - m_vars.insert(scTargetDir, replaceVariables(m_settings.adminTargetDir())); - else + m_data.setValue(scTargetDir, replaceVariables(m_data.settings().adminTargetDir())); #endif - m_vars.insert(scTargetDir, replaceVariables(m_settings.targetDir())); - m_vars.insert(scRemoveTargetDir, replaceVariables(m_settings.removeTargetDir())); if (!m_core->isInstaller()) { #ifdef Q_OS_MAC @@ -588,14 +543,21 @@ void PackageManagerCorePrivate::initialize() m_updaterApplication.updateSourcesInfo()->setFileName(QString()); KDUpdater::PackagesInfo &packagesInfo = *m_updaterApplication.packagesInfo(); packagesInfo.setFileName(componentsXmlPath()); - if (packagesInfo.applicationName().isEmpty()) - packagesInfo.setApplicationName(m_settings.applicationName()); - if (packagesInfo.applicationVersion().isEmpty()) - packagesInfo.setApplicationVersion(m_settings.applicationVersion()); + + if (packagesInfo.applicationName().isEmpty()) { + // TODO: this seems to be wrong, we should ask for ProductName defaulting to applicationName... + packagesInfo.setApplicationName(m_data.settings().applicationName()); + } + + if (packagesInfo.applicationVersion().isEmpty()) { + // TODO: this seems to be wrong, we should ask for ProductVersion defaulting to applicationVersion... + packagesInfo.setApplicationVersion(m_data.settings().applicationVersion()); + } if (isInstaller()) { - m_updaterApplication.addUpdateSource(m_settings.applicationName(), m_settings.applicationName(), - QString(), QUrl(QLatin1String("resource://metadata/")), 0); + // TODO: this seems to be wrong, we should ask for ProductName defaulting to applicationName... + m_updaterApplication.addUpdateSource(m_data.settings().applicationName(), + m_data.settings().applicationName(), QString(), QUrl(QLatin1String("resource://metadata/")), 0); m_updaterApplication.updateSourcesInfo()->setModified(false); } @@ -660,44 +622,12 @@ void PackageManagerCorePrivate::setStatus(int status, const QString &error) QString PackageManagerCorePrivate::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 += m_core->value(name); - pos = pos2 + 1; - } - res += str.mid(pos); - return res; + return m_data.replaceVariables(str); } QByteArray PackageManagerCorePrivate::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 += m_core->value(name).toLocal8Bit(); - pos = pos2 + 1; - } - res += ba.mid(pos); - return res; + return m_data.replaceVariables(ba); } /*! @@ -726,7 +656,7 @@ Operation *PackageManagerCorePrivate::takeOwnedOperation(Operation *operation) QString PackageManagerCorePrivate::uninstallerName() const { - QString filename = m_settings.uninstallerName(); + QString filename = m_data.settings().uninstallerName(); #if defined(Q_OS_MAC) if (QFileInfo(QCoreApplication::applicationDirPath() + QLatin1String("/../..")).isBundle()) filename += QLatin1String(".app/Contents/MacOS/") + filename; @@ -783,18 +713,18 @@ static QSet readRepositories(QXmlStreamReader &reader, bool isDefaul void PackageManagerCorePrivate::writeMaintenanceConfigFiles() { // write current state (variables) to the uninstaller ini file - const QString iniPath = targetDir() + QLatin1Char('/') + m_settings.uninstallerIniFile(); + const QString iniPath = targetDir() + QLatin1Char('/') + m_data.settings().uninstallerIniFile(); - QVariantHash vars; + QVariantHash variables; QSettingsWrapper cfg(iniPath, QSettingsWrapper::IniFormat); - foreach (const QString &key, m_vars.keys()) { + foreach (const QString &key, m_data.keys()) { if (key != scRunProgramDescription && key != scRunProgram) - vars.insert(key, m_vars.value(key)); + variables.insert(key, m_data.value(key)); } - cfg.setValue(QLatin1String("Variables"), vars); + cfg.setValue(QLatin1String("Variables"), variables); QVariantList repos; - foreach (const Repository &repo, m_settings.defaultRepositories()) + foreach (const Repository &repo, m_data.settings().defaultRepositories()) repos.append(QVariant().fromValue(repo)); cfg.setValue(QLatin1String("DefaultRepositories"), repos); @@ -813,16 +743,16 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles() writer.writeStartDocument(); writer.writeStartElement(QLatin1String("Network")); - writer.writeTextElement(QLatin1String("ProxyType"), QString::number(m_settings.proxyType())); + writer.writeTextElement(QLatin1String("ProxyType"), QString::number(m_data.settings().proxyType())); writer.writeStartElement(QLatin1String("Ftp")); - const QNetworkProxy &ftpProxy = m_settings.ftpProxy(); + const QNetworkProxy &ftpProxy = m_data.settings().ftpProxy(); writer.writeTextElement(QLatin1String("Host"), ftpProxy.hostName()); writer.writeTextElement(QLatin1String("Port"), QString::number(ftpProxy.port())); writer.writeTextElement(QLatin1String("Username"), ftpProxy.user()); writer.writeTextElement(QLatin1String("Password"), ftpProxy.password()); writer.writeEndElement(); writer.writeStartElement(QLatin1String("Http")); - const QNetworkProxy &httpProxy = m_settings.httpProxy(); + const QNetworkProxy &httpProxy = m_data.settings().httpProxy(); writer.writeTextElement(QLatin1String("Host"), httpProxy.hostName()); writer.writeTextElement(QLatin1String("Port"), QString::number(httpProxy.port())); writer.writeTextElement(QLatin1String("Username"), httpProxy.user()); @@ -830,7 +760,7 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles() writer.writeEndElement(); writer.writeStartElement(QLatin1String("Repositories")); - foreach (const Repository &repo, m_settings.userRepositories()) { + foreach (const Repository &repo, m_data.settings().userRepositories()) { writer.writeStartElement(QLatin1String("Repository")); writer.writeTextElement(QLatin1String("Host"), repo.url().toString()); writer.writeTextElement(QLatin1String("Username"), repo.username()); @@ -845,18 +775,18 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles() void PackageManagerCorePrivate::readMaintenanceConfigFiles(const QString &targetDir) { - QSettingsWrapper cfg(targetDir + QLatin1Char('/') + m_settings.uninstallerIniFile(), + QSettingsWrapper cfg(targetDir + QLatin1Char('/') + m_data.settings().uninstallerIniFile(), QSettingsWrapper::IniFormat); const QVariantHash vars = cfg.value(QLatin1String("Variables")).toHash(); for (QHash::ConstIterator it = vars.constBegin(); it != vars.constEnd(); ++it) - m_vars.insert(it.key(), it.value().toString()); + m_data.setValue(it.key(), it.value().toString()); QSet repos; const QVariantList variants = cfg.value(QLatin1String("DefaultRepositories")).toList(); foreach (const QVariant &variant, variants) repos.insert(variant.value()); if (!repos.isEmpty()) - m_settings.setDefaultRepositories(repos); + m_data.settings().setDefaultRepositories(repos); QFile file(targetDir + QLatin1String("/network.xml")); if (!file.open(QIODevice::ReadOnly)) @@ -870,13 +800,13 @@ void PackageManagerCorePrivate::readMaintenanceConfigFiles(const QString &target while (reader.readNextStartElement()) { const QStringRef name = reader.name(); if (name == QLatin1String("Ftp")) { - m_settings.setFtpProxy(readProxy(reader)); + m_data.settings().setFtpProxy(readProxy(reader)); } else if (name == QLatin1String("Http")) { - m_settings.setHttpProxy(readProxy(reader)); + m_data.settings().setHttpProxy(readProxy(reader)); } else if (reader.name() == QLatin1String("Repositories")) { - m_settings.addUserRepositories(readRepositories(reader, false)); + m_data.settings().addUserRepositories(readRepositories(reader, false)); } else if (name == QLatin1String("ProxyType")) { - m_settings.setProxyType(Settings::ProxyType(reader.readElementText().toInt())); + m_data.settings().setProxyType(Settings::ProxyType(reader.readElementText().toInt())); } else { reader.skipCurrentElement(); } @@ -1275,7 +1205,7 @@ void PackageManagerCorePrivate::writeUninstaller(OperationList performedOperatio QFile input; BinaryLayout layout; - const QString dataFile = targetDir() + QLatin1Char('/') + m_settings.uninstallerName() + const QString dataFile = targetDir() + QLatin1Char('/') + m_data.settings().uninstallerName() + QLatin1String(".dat"); try { if (isInstaller()) { @@ -1367,12 +1297,12 @@ void PackageManagerCorePrivate::writeUninstaller(OperationList performedOperatio QString PackageManagerCorePrivate::registerPath() const { #ifdef Q_OS_WIN - QString productName = m_vars.value(QLatin1String("ProductName")); + const QString productName = m_data.value(QLatin1String("ProductName")).toString(); if (productName.isEmpty()) throw Error(tr("ProductName should be set")); QString path = QLatin1String("HKEY_CURRENT_USER"); - if (m_vars.value(QLatin1String("AllUsers")) == scTrue) + if (m_data.value(QLatin1String("AllUsers")).toString() == scTrue) path = QLatin1String("HKEY_LOCAL_MACHINE"); return path + QLatin1String("\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\") @@ -1468,9 +1398,10 @@ bool PackageManagerCorePrivate::runInstaller() // Clear the packages as we might install into an already existing installation folder. info.clearPackageInfoList(); // also update the application name and version, might be set from a script as well - info.setApplicationName(m_core->value(QLatin1String("ProductName"), m_settings.applicationName())); - info.setApplicationVersion(m_core->value(QLatin1String("ProductVersion"), - m_settings.applicationVersion())); + info.setApplicationName(m_data.value(QLatin1String("ProductName"), + m_data.settings().applicationName()).toString()); + info.setApplicationVersion(m_data.value(QLatin1String("ProductVersion"), + m_data.settings().applicationVersion()).toString()); const int progressOperationCount = countProgressOperations(componentsToInstall) // add one more operation as we support progress @@ -1501,13 +1432,13 @@ bool PackageManagerCorePrivate::runInstaller() if (success) { QSet repos; - foreach (Repository repo, m_settings.defaultRepositories()) { + foreach (Repository repo, m_data.settings().defaultRepositories()) { repo.setEnabled(false); repos.insert(repo); } repos.insert(Repository(QUrl::fromUserInput(createRepo ->value(QLatin1String("local-repo")).toString()), true)); - m_settings.setDefaultRepositories(repos); + m_data.settings().setDefaultRepositories(repos); addPerformed(takeOwnedOperation(createRepo)); } else { MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(), @@ -1954,13 +1885,13 @@ void PackageManagerCorePrivate::registerUninstaller() { #ifdef Q_OS_WIN QSettingsWrapper settings(registerPath(), QSettingsWrapper::NativeFormat); - settings.setValue(scDisplayName, m_vars.value(QLatin1String("ProductName"))); - settings.setValue(QLatin1String("DisplayVersion"), m_vars.value(QLatin1String("ProductVersion"))); + settings.setValue(scDisplayName, m_data.value(QLatin1String("ProductName"))); + settings.setValue(QLatin1String("DisplayVersion"), m_data.value(QLatin1String("ProductVersion"))); const QString uninstaller = QDir::toNativeSeparators(uninstallerName()); settings.setValue(QLatin1String("DisplayIcon"), uninstaller); - settings.setValue(scPublisher, m_vars.value(scPublisher)); - settings.setValue(QLatin1String("UrlInfoAbout"), m_vars.value(QLatin1String("Url"))); - settings.setValue(QLatin1String("Comments"), m_vars.value(scTitle)); + settings.setValue(scPublisher, m_data.value(scPublisher)); + settings.setValue(QLatin1String("UrlInfoAbout"), m_data.value(QLatin1String("Url"))); + settings.setValue(QLatin1String("Comments"), m_data.value(scTitle)); settings.setValue(QLatin1String("InstallDate"), QDateTime::currentDateTime().toString()); settings.setValue(QLatin1String("InstallLocation"), QDir::toNativeSeparators(targetDir())); settings.setValue(QLatin1String("UninstallString"), uninstaller); @@ -2081,9 +2012,9 @@ LocalPackagesHash PackageManagerCorePrivate::localInstalledPackages() if (!packagesInfo.isValid()) { packagesInfo.setFileName(componentsXmlPath()); if (packagesInfo.applicationName().isEmpty()) - packagesInfo.setApplicationName(m_settings.applicationName()); + packagesInfo.setApplicationName(m_data.settings().applicationName()); if (packagesInfo.applicationVersion().isEmpty()) - packagesInfo.setApplicationVersion(m_settings.applicationVersion()); + packagesInfo.setApplicationVersion(m_data.settings().applicationVersion()); } if (packagesInfo.error() != KDUpdater::PackagesInfo::NoError) @@ -2144,15 +2075,15 @@ bool PackageManagerCorePrivate::addUpdateResourcesFromRepositories(bool parseChe // forces an refresh / clear on all update sources m_updaterApplication.updateSourcesInfo()->refresh(); if (isInstaller()) { - m_updaterApplication.addUpdateSource(m_settings.applicationName(), m_settings.applicationName(), - QString(), QUrl(QLatin1String("resource://metadata/")), 0); + m_updaterApplication.addUpdateSource(m_data.settings().applicationName(), + m_data.settings().applicationName(), QString(), QUrl(QLatin1String("resource://metadata/")), 0); m_updaterApplication.updateSourcesInfo()->setModified(false); } m_updates = false; m_updateSourcesAdded = false; - const QString &appName = m_settings.applicationName(); + const QString &appName = m_data.settings().applicationName(); const QStringList tempDirs = m_repoMetaInfoJob->temporaryDirectories(); foreach (const QString &tmpDir, tempDirs) { if (statusCanceledOrFailed()) diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index 358b1c6e4..7d3654e19 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -36,6 +36,7 @@ #include "getrepositoriesmetainfojob.h" #include "settings.h" #include "packagemanagercore.h" +#include "packagemanagercoredata.h" #include #include @@ -83,7 +84,7 @@ public: static bool performOperationThreaded(Operation *op, PackageManagerCorePrivate::OperationType type = PackageManagerCorePrivate::Perform); - void initialize(); + void initialize(const QHash ¶ms); bool isOfflineOnly() const; bool statusCanceledOrFailed() const; @@ -173,13 +174,12 @@ public: int m_status; QString m_error; - Settings m_settings; bool m_forceRestart; bool m_testChecksum; bool m_launchedAsRoot; bool m_completeUninstall; bool m_needToWriteUninstaller; - QHash m_vars; + PackageManagerCoreData m_data; QHash m_sharedFlags; QString m_installerBaseBinaryUnreplaced; 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 + +namespace QInstaller +{ + +PackageManagerCoreData::PackageManagerCoreData(const QHash &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 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 diff --git a/src/libs/installer/packagemanagercoredata.h b/src/libs/installer/packagemanagercoredata.h new file mode 100644 index 000000000..be7cac865 --- /dev/null +++ b/src/libs/installer/packagemanagercoredata.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +#ifndef PACKAGEMANAGERCOREDATA_H +#define PACKAGEMANAGERCOREDATA_H + +#include "settings.h" + +namespace QInstaller { + +class PackageManagerCoreData +{ +public: + PackageManagerCoreData() {} + explicit PackageManagerCoreData(const QHash &variables); + + void clear(); + + Settings &settings() const; + QList keys() const; + + bool contains(const QString &key) const; + bool setValue(const QString &key, const QString &normalizedValue); + QVariant value(const QString &key, const QVariant &_default = QVariant()) const; + + QString replaceVariables(const QString &str) const; + QByteArray replaceVariables(const QByteArray &ba) const; + +private: + mutable Settings m_settings; + QHash m_variables; +}; + +} // namespace QInstaller + +#endif // PACKAGEMANAGERCOREDATA_H diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index 353df3df4..7650951e6 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -1787,20 +1787,19 @@ void PerformInstallationPage::entering() setComplete(false); setCommitPage(true); - const QString productName = packageManagerCore()->value(QLatin1String("ProductName")); if (packageManagerCore()->isUninstaller()) { setButtonText(QWizard::CommitButton, tr("&Uninstall")); - setTitle(titleForPage(objectName(), tr("Uninstalling %1")).arg(productName)); + setTitle(titleForPage(objectName(), tr("Uninstalling %1")).arg(productName())); QTimer::singleShot(30, packageManagerCore(), SLOT(runUninstaller())); } else if (packageManagerCore()->isPackageManager() || packageManagerCore()->isUpdater()) { setButtonText(QWizard::CommitButton, tr("&Update")); - setTitle(titleForPage(objectName(), tr("Updating components of %1")).arg(productName)); + setTitle(titleForPage(objectName(), tr("Updating components of %1")).arg(productName())); QTimer::singleShot(30, packageManagerCore(), SLOT(runPackageUpdater())); } else { setButtonText(QWizard::CommitButton, tr("&Install")); - setTitle(titleForPage(objectName(), tr("Installing %1")).arg(productName)); + setTitle(titleForPage(objectName(), tr("Installing %1")).arg(productName())); QTimer::singleShot(30, packageManagerCore(), SLOT(runInstaller())); } -- cgit v1.2.3