summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/installerfw.qdoc3
-rw-r--r--src/libs/installer/component.cpp20
-rw-r--r--src/libs/installer/component.h2
-rw-r--r--src/libs/installer/component_p.h2
-rw-r--r--src/libs/installer/packagemanagercore.cpp36
-rw-r--r--src/libs/installer/packagemanagercore.h3
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp22
-rw-r--r--src/libs/installer/packagemanagercore_p.h1
-rw-r--r--src/libs/installer/packagemanagergui.cpp26
-rw-r--r--src/libs/installer/packagemanagergui.h2
-rw-r--r--src/libs/kdtools/updatesinfo.cpp9
11 files changed, 100 insertions, 26 deletions
diff --git a/doc/installerfw.qdoc b/doc/installerfw.qdoc
index 6d84e51d9..41d1110d2 100644
--- a/doc/installerfw.qdoc
+++ b/doc/installerfw.qdoc
@@ -839,7 +839,8 @@
\li Licenses
\li List of license agreements to be accepted by the installing
user. To add several licenses, add several \c <License> child
- elements that each specify the license \c name and \c file.
+ elements that each specify the license \c name and \c file and,
+ optionally, \c priority.
ASCII and UTF8 file formats are supported for license files.
If there are translations listed for this component, the installer
diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp
index 5c64d3cf1..e8f036ccd 100644
--- a/src/libs/installer/component.cpp
+++ b/src/libs/installer/component.cpp
@@ -642,13 +642,14 @@ void Component::loadUserInterfaces(const QDir &directory, const QStringList &uis
/*!
Loads the text of the licenses contained in \a licenseHash from \a directory.
- This is saved into a new hash containing the filename and the text of that file.
+ This is saved into a new hash containing the filename, the text and the priority of that file.
*/
void Component::loadLicenses(const QString &directory, const QHash<QString, QVariant> &licenseHash)
{
QHash<QString, QVariant>::const_iterator it;
for (it = licenseHash.begin(); it != licenseHash.end(); ++it) {
- const QString &fileName = it.value().toString();
+ QVariantMap license = it.value().toMap();
+ const QString &fileName = license.value(QLatin1String("file")).toString();
if (!ProductKeyCheck::instance()->isValidLicenseTextFile(fileName))
continue;
@@ -682,7 +683,8 @@ void Component::loadLicenses(const QString &directory, const QHash<QString, QVar
}
QTextStream stream(&file);
stream.setCodec("UTF-8");
- d->m_licenses.insert(it.key(), qMakePair(fileName, stream.readAll()));
+ license.insert(QLatin1String("content"), stream.readAll());
+ d->m_licenses.insert(it.key(), license);
}
}
@@ -698,9 +700,9 @@ QStringList Component::userInterfaces() const
}
/*!
- Returns a hash that contains the file names and text of license files for the component.
+ Returns a hash that contains the file names, text and priorities of license files for the component.
*/
-QHash<QString, QPair<QString, QString> > Component::licenses() const
+QHash<QString, QVariantMap> Component::licenses() const
{
return d->m_licenses;
}
@@ -965,9 +967,11 @@ OperationList Component::operations() const
d->m_licenseOperation->setValue(QLatin1String("component"), name());
QVariantMap licenses;
- const QList<QPair<QString, QString> > values = d->m_licenses.values();
- for (int i = 0; i < values.count(); ++i)
- licenses.insert(values.at(i).first, values.at(i).second);
+ const QList<QVariantMap> values = d->m_licenses.values();
+ for (int i = 0; i < values.count(); ++i) {
+ licenses.insert(values.at(i).value(QLatin1String("file")).toString(),
+ values.at(i).value(QLatin1String("content")));
+ }
d->m_licenseOperation->setValue(QLatin1String("licenses"), licenses);
d->m_operations.append(d->m_licenseOperation);
}
diff --git a/src/libs/installer/component.h b/src/libs/installer/component.h
index fd12a53f8..6ff5c8c38 100644
--- a/src/libs/installer/component.h
+++ b/src/libs/installer/component.h
@@ -124,7 +124,7 @@ public:
void markAsPerformedInstallation();
QStringList userInterfaces() const;
- QHash<QString, QPair<QString, QString> > licenses() const;
+ QHash<QString, QVariantMap> licenses() const;
Q_INVOKABLE QWidget *userInterface(const QString &name) const;
Q_INVOKABLE virtual void beginInstallation();
Q_INVOKABLE virtual void createOperations();
diff --git a/src/libs/installer/component_p.h b/src/libs/installer/component_p.h
index c14d53e70..e4d28d26a 100644
--- a/src/libs/installer/component_p.h
+++ b/src/libs/installer/component_p.h
@@ -77,7 +77,7 @@ public:
QHash<QString, QPointer<QWidget> > m_userInterfaces;
// < display name, < file name, file content > >
- QHash<QString, QPair<QString, QString> > m_licenses;
+ QHash<QString, QVariantMap> m_licenses;
QList<QPair<QString, bool> > m_pathsForUninstallation;
};
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index 2a5457b97..d188c178a 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -2343,6 +2343,42 @@ void PackageManagerCore::commitSessionOperations()
}
/*!
+ * Clears all previously added licenses.
+ */
+void PackageManagerCore::clearLicenses()
+{
+ d->m_licenseItems.clear();
+}
+
+/*!
+ * Returns licenses hash which can be sorted by priority.
+ */
+QHash<QString, QMap<QString, QString>> PackageManagerCore::sortedLicenses()
+{
+ QHash<QString, QMap<QString, QString>> priorityHash;
+ for (QString licenseName : d->m_licenseItems.keys()) {
+ QMap<QString, QString> licenses;
+ QString priority = d->m_licenseItems.value(licenseName).value(QLatin1String("priority")).toString();
+ licenses = priorityHash.value(priority);
+ licenses.insert(licenseName, d->m_licenseItems.value(licenseName).value(QLatin1String("content")).toString());
+ priorityHash.insert(priority, licenses);
+ }
+ return priorityHash;
+}
+
+/*!
+ * Adds new set of \a licenses. If a license with the key already exists, it is not added again.
+ */
+void PackageManagerCore::addLicenseItem(const QHash<QString, QVariantMap> &licenses)
+{
+ for (QHash<QString, QVariantMap>::const_iterator it = licenses.begin();
+ it != licenses.end(); ++it) {
+ if (!d->m_licenseItems.contains(it.key()))
+ d->m_licenseItems.insert(it.key(), it.value());
+ }
+}
+
+/*!
Uninstalls the selected components \a components without GUI.
Returns PackageManagerCore installation status.
*/
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index 3fce929ac..5e6ab2867 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -315,6 +315,9 @@ public:
static void parseNameAndVersion(const QString &requirement, QString *name, QString *version);
static QStringList parseNames(const QStringList &requirements);
void commitSessionOperations();
+ void clearLicenses();
+ QHash<QString, QMap<QString, QString>> sortedLicenses();
+ void addLicenseItem(const QHash<QString, QVariantMap> &licenses);
public Q_SLOTS:
bool runInstaller();
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index 3a9386816..f6897d692 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -2586,21 +2586,31 @@ bool PackageManagerCorePrivate::acceptLicenseAgreements() const
if (isUninstaller())
return true;
- typedef QHash<QString, QPair<QString, QString> > LicensesHash;
foreach (Component *component, m_core->orderedComponentsToInstall()) {
// Package manager or updater, no need to accept again as long as
// the component is installed.
if (m_core->isMaintainer() && component->isInstalled())
continue;
+ m_core->addLicenseItem(component->licenses());
+ }
+
+ QHash<QString, QMap<QString, QString>> priorityHash = m_core->sortedLicenses();
+ QStringList priorities = priorityHash.keys();
+ priorities.sort();
+ for (int i = priorities.length() - 1; i >= 0; --i) {
+ QString priority = priorities.at(i);
+ QMap<QString, QString> licenses = priorityHash.value(priority);
- LicensesHash hash = component->licenses();
- for (LicensesHash::iterator it = hash.begin(); it != hash.end(); ++it) {
- if (m_autoAcceptLicenses || askUserAcceptLicense(it.key(), it.value().second)) {
+ QStringList licenseNames = licenses.keys();
+ licenseNames.sort(Qt::CaseInsensitive);
+ for (QString licenseName : licenseNames) {
+ if (m_autoAcceptLicenses
+ || askUserAcceptLicense(licenseName, licenses.value(licenseName))) {
qCDebug(QInstaller::lcInstallerInstallLog) << "License"
- << it.key() << "accepted by user.";
+ << licenseName << "accepted by user.";
} else {
qCDebug(QInstaller::lcInstallerInstallLog) << "License"
- << it.key() << "not accepted by user. Aborting.";
+ << licenseName<< "not accepted by user. Aborting.";
return false;
}
}
diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h
index df7a887f2..09a26a9de 100644
--- a/src/libs/installer/packagemanagercore_p.h
+++ b/src/libs/installer/packagemanagercore_p.h
@@ -282,6 +282,7 @@ private:
QObject *m_guiObject;
QScopedPointer<RemoteFileEngineHandler> m_remoteFileEngineHandler;
+ QHash<QString, QVariantMap> m_licenseItems;
private:
// remove once we deprecate isSelected, setSelected etc...
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index ffacbb6a2..3bcf4e5fc 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -1992,7 +1992,9 @@ void LicenseAgreementPage::entering()
packageManagerCore()->calculateComponentsToInstall();
foreach (QInstaller::Component *component, packageManagerCore()->orderedComponentsToInstall())
- addLicenseItem(component->licenses());
+ packageManagerCore()->addLicenseItem(component->licenses());
+
+ createLicenseWidgets();
const int licenseCount = m_licenseListWidget->count();
if (licenseCount > 0) {
@@ -2000,6 +2002,8 @@ void LicenseAgreementPage::entering()
m_licenseListWidget->setCurrentItem(m_licenseListWidget->item(0));
}
+ packageManagerCore()->clearLicenses();
+
updateUi();
}
@@ -2023,12 +2027,22 @@ void LicenseAgreementPage::currentItemChanged(QListWidgetItem *current)
m_textBrowser->setText(current->data(Qt::UserRole).toString());
}
-void LicenseAgreementPage::addLicenseItem(const QHash<QString, QPair<QString, QString> > &hash)
+void LicenseAgreementPage::createLicenseWidgets()
{
- for (QHash<QString, QPair<QString, QString> >::const_iterator it = hash.begin();
- it != hash.end(); ++it) {
- QListWidgetItem *item = new QListWidgetItem(it.key(), m_licenseListWidget);
- item->setData(Qt::UserRole, it.value().second);
+ QHash<QString, QMap<QString, QString>> priorityHash = packageManagerCore()->sortedLicenses();
+
+ QStringList priorities = priorityHash.keys();
+ priorities.sort();
+
+ for (int i = priorities.length() - 1; i >= 0; --i) {
+ QString priority = priorities.at(i);
+ QMap<QString, QString> licenses = priorityHash.value(priority);
+ QStringList licenseNames = licenses.keys();
+ licenseNames.sort(Qt::CaseInsensitive);
+ for (QString licenseName : licenseNames) {
+ QListWidgetItem *item = new QListWidgetItem(licenseName, m_licenseListWidget);
+ item->setData(Qt::UserRole, licenses.value(licenseName));
+ }
}
}
diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h
index fc0718be4..f8e154a79 100644
--- a/src/libs/installer/packagemanagergui.h
+++ b/src/libs/installer/packagemanagergui.h
@@ -296,7 +296,7 @@ private Q_SLOTS:
void currentItemChanged(QListWidgetItem *current);
private:
- void addLicenseItem(const QHash<QString, QPair<QString, QString> > &hash);
+ void createLicenseWidgets();
void updateUi();
private:
diff --git a/src/libs/kdtools/updatesinfo.cpp b/src/libs/kdtools/updatesinfo.cpp
index f01e60eb6..2d7e001ea 100644
--- a/src/libs/kdtools/updatesinfo.cpp
+++ b/src/libs/kdtools/updatesinfo.cpp
@@ -129,8 +129,13 @@ bool UpdatesInfoData::parsePackageUpdateElement(const QDomElement &updateE)
const QDomNode licenseNode = licenseNodes.at(i);
if (licenseNode.nodeName() == QLatin1String("License")) {
QDomElement element = licenseNode.toElement();
- licenseHash.insert(element.attributeNode(QLatin1String("name")).value(),
- element.attributeNode(QLatin1String("file")).value());
+ QVariantMap attributes;
+ attributes.insert(QLatin1String("file"), element.attributeNode(QLatin1String("file")).value());
+ if (!element.attributeNode(QLatin1String("priority")).isNull())
+ attributes.insert(QLatin1String("priority"), element.attributeNode(QLatin1String("priority")).value());
+ else
+ attributes.insert(QLatin1String("priority"), QLatin1String("0"));
+ licenseHash.insert(element.attributeNode(QLatin1String("name")).value(), attributes);
}
}
if (!licenseHash.isEmpty())