diff options
-rw-r--r-- | doc/installerfw.qdoc | 3 | ||||
-rw-r--r-- | src/libs/installer/component.cpp | 20 | ||||
-rw-r--r-- | src/libs/installer/component.h | 2 | ||||
-rw-r--r-- | src/libs/installer/component_p.h | 2 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 36 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 3 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 22 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 26 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.h | 2 | ||||
-rw-r--r-- | src/libs/kdtools/updatesinfo.cpp | 9 |
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()) |