summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/installer/getrepositoriesmetainfojob.cpp2
-rw-r--r--src/libs/installer/getrepositorymetainfojob.cpp16
-rw-r--r--src/libs/installer/installer.pro8
-rw-r--r--src/libs/installer/packagemanagercore.cpp48
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp181
-rw-r--r--src/libs/installer/packagemanagercore_p.h6
-rw-r--r--src/libs/installer/packagemanagercoredata.cpp188
-rw-r--r--src/libs/installer/packagemanagercoredata.h62
-rw-r--r--src/libs/installer/packagemanagergui.cpp7
9 files changed, 338 insertions, 180 deletions
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<Repository> repositories = m_corePrivate->m_settings.defaultRepositories();
+ QSet<Repository> 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<QString, QString> &params)
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>("QInstaller::PackageManagerCore::Status");
qRegisterMetaType<QInstaller::PackageManagerCore::WizardPage>("QInstaller::PackageManagerCore::WizardPage");
- d->initialize();
+ d->initialize(QHash<QString, QString>());
}
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<QString, QString> &params)
{
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<Repository> 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<QString, QVariant>::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<Repository> repos;
const QVariantList variants = cfg.value(QLatin1String("DefaultRepositories")).toList();
foreach (const QVariant &variant, variants)
repos.insert(variant.value<Repository>());
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<Repository> 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 <kdsysinfo.h>
#include <kdupdaterapplication.h>
@@ -83,7 +84,7 @@ public:
static bool performOperationThreaded(Operation *op, PackageManagerCorePrivate::OperationType type
= PackageManagerCorePrivate::Perform);
- void initialize();
+ void initialize(const QHash<QString, QString> &params);
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<QString, QString> m_vars;
+ PackageManagerCoreData m_data;
QHash<QString, bool> 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 <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
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<QString, QString> &variables);
+
+ void clear();
+
+ Settings &settings() const;
+ QList<QString> 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<QString, QString> 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()));
}