diff options
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/installer/componentmodel.cpp | 8 | ||||
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 126 | ||||
-rw-r--r-- | src/libs/installer/metadatajob.h | 2 | ||||
-rw-r--r-- | src/libs/installer/metadatajob_p.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 41 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 29 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 6 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 42 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.h | 1 | ||||
-rw-r--r-- | src/libs/installer/productkeycheck.cpp | 5 | ||||
-rw-r--r-- | src/libs/installer/productkeycheck.h | 1 | ||||
-rw-r--r-- | src/libs/kdtools/job.cpp | 4 | ||||
-rw-r--r-- | src/libs/kdtools/job.h | 1 |
14 files changed, 201 insertions, 67 deletions
diff --git a/src/libs/installer/componentmodel.cpp b/src/libs/installer/componentmodel.cpp index 88465b85b..e0cc3fcd8 100644 --- a/src/libs/installer/componentmodel.cpp +++ b/src/libs/installer/componentmodel.cpp @@ -575,7 +575,13 @@ QSet<QModelIndex> ComponentModel::updateCheckedState(const ComponentSet &compone // we can start in descending order to check node and tri-state nodes properly for (int i = sortedNodes.count(); i > 0; i--) { Component * const node = sortedNodes.at(i - 1); - if (!node->isCheckable() || !node->isEnabled() || !node->autoDependencies().isEmpty()) + + bool checkable = true; + if (node->value(scCheckable, scTrue).toLower() == scFalse) { + checkable = false; + } + + if ((!node->isCheckable() && checkable) || !node->isEnabled() || !node->autoDependencies().isEmpty()) continue; Qt::CheckState newState = state; diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index 83f252349..ecc66f493 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -34,6 +34,7 @@ #include "proxycredentialsdialog.h" #include "serverauthenticationdialog.h" #include "settings.h" +#include "testrepository.h" #include <QTemporaryDir> @@ -60,6 +61,7 @@ MetadataJob::MetadataJob(QObject *parent) MetadataJob::~MetadataJob() { + resetCompressedFetch(); reset(); } @@ -118,19 +120,34 @@ void MetadataJob::doStart() emitFinished(); } } else { - m_packages.clear(); + resetCompressedFetch(); + bool repositoriesFound = false; - foreach (const Repository &repo, m_core->settings().repositories()) { + foreach (const Repository &repo, m_core->settings().temporaryRepositories()) { if (repo.isCompressed() && repo.isEnabled() && productKeyCheck->isValidRepository(repo)) { repositoriesFound = true; startUnzipRepositoryTask(repo); + + //Set the repository disabled so we don't handle it many times + Repository replacement = repo; + replacement.setEnabled(false); + Settings &s = m_core->settings(); + QSet<Repository> temporaries = s.temporaryRepositories(); + if (temporaries.contains(repo)) { + temporaries.remove(repo); + temporaries.insert(replacement); + s.setTemporaryRepositories(temporaries, true); + } } } - if (!repositoriesFound) + if (!repositoriesFound) { emitFinished(); - else - emit infoMessage(this, tr("Unpacking compressed repositories...")); + } + else { + setProgressTotalAmount(0); + emit infoMessage(this, tr("Unpacking compressed repositories. This may take a while...")); + } } } @@ -170,8 +187,61 @@ void MetadataJob::startUnzipRepositoryTask(const Repository &repo) void MetadataJob::unzipRepositoryTaskFinished() { QFutureWatcher<void> *watcher = static_cast<QFutureWatcher<void> *>(sender()); + int error = Job::NoError; + QString errorString; try { watcher->waitForFinished(); // trigger possible exceptions + + QHashIterator<QFutureWatcher<void> *, QObject*> i(m_unzipRepositoryTasks); + while (i.hasNext()) { + + i.next(); + if (i.key() == watcher) { + UnzipArchiveTask *task = qobject_cast<UnzipArchiveTask*> (i.value()); + QString url = task->target(); + + QUrl targetUrl = targetUrl.fromLocalFile(url); + Repository repo(targetUrl, false, true); + url = repo.url().toString() + QLatin1String("/Updates.xml"); + TestRepository testJob(m_core); + testJob.setRepository(repo); + testJob.start(); + testJob.waitForFinished(); + error = testJob.error(); + errorString = testJob.errorString(); + if (error == Job::NoError) { + FileTaskItem item(url); + item.insert(TaskRole::UserRole, QVariant::fromValue(repo)); + m_unzipRepositoryitems.append(item); + } else { + //Repository is not valid, remove it + Repository repository; + repository.setUrl(QUrl(task->archive())); + Settings &s = m_core->settings(); + QSet<Repository> temporaries = s.temporaryRepositories(); + foreach (Repository repository, temporaries) { + if (repository.url().toLocalFile() == task->archive()) { + temporaries.remove(repository); + } + } + s.setTemporaryRepositories(temporaries, false); + } + } + } + delete m_unzipRepositoryTasks.value(watcher); + m_unzipRepositoryTasks.remove(watcher); + delete watcher; + + //One can specify many zipped repository items at once. As the repositories are + //unzipped one by one, we collect here all items before parsing xml files from those. + if (m_unzipRepositoryitems.count() > 0 && m_unzipRepositoryTasks.isEmpty()) { + startXMLTask(m_unzipRepositoryitems); + } else { + if (error != Job::NoError) { + emitFinishedWithError(QInstaller::DownloadError, errorString); + } + } + } catch (const UnzipArchiveException &e) { reset(); emitFinishedWithError(QInstaller::ExtractionError, e.message()); @@ -182,31 +252,6 @@ void MetadataJob::unzipRepositoryTaskFinished() reset(); emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting.")); } - - QHashIterator<QFutureWatcher<void> *, QObject*> i(m_unzipRepositoryTasks); - while (i.hasNext()) { - i.next(); - if (i.key() == watcher) { - UnzipArchiveTask *task = qobject_cast<UnzipArchiveTask*> (i.value()); - QString url = task->target(); - - QUrl targetUrl = targetUrl.fromLocalFile(url); - Repository repo(targetUrl, false, true); - url = repo.url().toString() + QLatin1String("/Updates.xml"); - FileTaskItem item(url); - item.insert(TaskRole::UserRole, QVariant::fromValue(repo)); - m_unzipRepositoryitems.append(item); - } - } - - //One can specify many zipped repository items at once. As the repositories are - //unzipped one by one, we collect here all items before parsing xml files from those. - delete m_unzipRepositoryTasks.value(watcher); - m_unzipRepositoryTasks.remove(watcher); - delete watcher; - - if (m_unzipRepositoryitems.count() > 0 && m_unzipRepositoryTasks.isEmpty()) - startXMLTask(m_unzipRepositoryitems); } void MetadataJob::xmlTaskFinished() @@ -284,6 +329,7 @@ void MetadataJob::xmlTaskFinished() DownloadFileTask *const metadataTask = new DownloadFileTask(m_packages); metadataTask->setProxyFactory(m_core->proxyFactory()); m_metadataTask.setFuture(QtConcurrent::run(&DownloadFileTask::doTask, metadataTask)); + setProgressTotalAmount(100); emit infoMessage(this, tr("Retrieving meta information from remote repository...")); } else if (status == XmlDownloadRetry) { QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection); @@ -299,13 +345,10 @@ void MetadataJob::unzipTaskFinished() try { watcher->waitForFinished(); // trigger possible exceptions } catch (const UnzipArchiveException &e) { - reset(); emitFinishedWithError(QInstaller::ExtractionError, e.message()); } catch (const QUnhandledException &e) { - reset(); emitFinishedWithError(QInstaller::DownloadError, QLatin1String(e.what())); } catch (...) { - reset(); emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting.")); } @@ -327,6 +370,11 @@ void MetadataJob::progressChanged(int progress) setProcessedAmount(progress); } +void MetadataJob::setProgressTotalAmount(int maximum) +{ + setTotalAmount(maximum); +} + void MetadataJob::metadataTaskFinished() { try { @@ -374,6 +422,17 @@ void MetadataJob::reset() try { m_xmlTask.cancel(); m_metadataTask.cancel(); + } catch (...) {} + m_tempDirDeleter.releaseAndDeleteAll(); +} + +void MetadataJob::resetCompressedFetch() +{ + setError(Job::NoError); + setErrorString(QString()); + m_unzipRepositoryitems.clear(); + + try { foreach (QFutureWatcher<void> *const watcher, m_unzipTasks.keys()) { watcher->cancel(); watcher->deleteLater(); @@ -390,7 +449,6 @@ void MetadataJob::reset() object->deleteLater(); m_unzipRepositoryTasks.clear(); } catch (...) {} - m_tempDirDeleter.releaseAndDeleteAll(); } MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &results) diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h index 261ae295f..c6d5ad353 100644 --- a/src/libs/installer/metadatajob.h +++ b/src/libs/installer/metadatajob.h @@ -74,12 +74,14 @@ private slots: void unzipTaskFinished(); void metadataTaskFinished(); void progressChanged(int progress); + void setProgressTotalAmount(int maximum); void unzipRepositoryTaskFinished(); void startXMLTask(const QList<FileTaskItem> items); private: void startUnzipRepositoryTask(const Repository &repo); void reset(); + void resetCompressedFetch(); Status parseUpdatesXml(const QList<FileTaskResult> &results); private: diff --git a/src/libs/installer/metadatajob_p.h b/src/libs/installer/metadatajob_p.h index 65be0a174..9160f4cc9 100644 --- a/src/libs/installer/metadatajob_p.h +++ b/src/libs/installer/metadatajob_p.h @@ -65,6 +65,7 @@ public: : m_archive(arcive), m_targetDir(target) {} QString target() { return m_targetDir; } + QString archive() { return m_archive; } void doTask(QFutureInterface<void> &fi) { fi.reportStarted(); diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index edd2460a8..c4ba5ae4a 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1799,23 +1799,42 @@ ComponentModel *PackageManagerCore::updaterComponentModel() const void PackageManagerCore::updateComponentsSilently() { + //Check if there are processes running in the install + QStringList excludeFiles; + excludeFiles.append(maintenanceToolName()); + + QStringList runningProcesses = d->runningInstallerProcesses(excludeFiles); + if (!runningProcesses.isEmpty()) { + qDebug() << "Unable to update components. Please stop these processes: " + << runningProcesses << " and try again."; + return; + } + autoAcceptMessageBoxes(); + + //Prevent infinite loop if installation for some reason fails. + setMessageBoxAutomaticAnswer(QLatin1String("installationErrorWithRetry"), QMessageBox::Cancel); + fetchRemotePackagesTree(); //Mark all components to be installed const QList<QInstaller::Component*> componentList = components( ComponentType::Root | ComponentType::Descendants); - foreach (Component *comp, componentList) { - comp->setCheckState(Qt::Checked); - } - QString htmlOutput; - bool componentsOk = calculateComponents(&htmlOutput); - if (componentsOk) { - if (runPackageUpdater()) - qDebug() << "Components updated successfully."; - } - else { - qDebug() << htmlOutput; + if (componentList.count() == 0) { + qDebug() << "No updates available."; + } else { + foreach (Component *comp, componentList) { + comp->setCheckState(Qt::Checked); + } + QString htmlOutput; + bool componentsOk = calculateComponents(&htmlOutput); + if (componentsOk) { + if (runPackageUpdater()) + qDebug() << "Components updated successfully."; + } + else { + qDebug() << htmlOutput; + } } } diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 59be3e9ee..2a235bd44 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -290,6 +290,7 @@ Q_SIGNALS: void finishButtonClicked(); void metaJobProgress(int progress); + void metaJobTotalProgress(int progress); void metaJobInfoMessage(const QString &message); void startAllComponentsReset(); diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index f29b65780..28d64d09c 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -581,6 +581,7 @@ void PackageManagerCorePrivate::initialize(const QHash<QString, QString> ¶ms m_metadataJob.setPackageManagerCore(m_core); connect(&m_metadataJob, &Job::infoMessage, this, &PackageManagerCorePrivate::infoMessage); connect(&m_metadataJob, &Job::progress, this, &PackageManagerCorePrivate::infoProgress); + connect(&m_metadataJob, &Job::totalProgress, this, &PackageManagerCorePrivate::totalProgress); KDUpdater::FileDownloaderFactory::instance().setProxyFactory(m_core->proxyFactory()); } @@ -2247,7 +2248,9 @@ bool PackageManagerCorePrivate::fetchMetaInformationFromCompressedRepositories() case QInstaller::UserIgnoreError: break; // we can simply ignore this error, the user knows about it default: - setStatus(PackageManagerCore::Failure, m_metadataJob.errorString()); + //Do not change core status here, we can recover if there is invalid + //compressed repository + setStatus(m_core->status(), m_metadataJob.errorString()); return compressedRepoFetched; } } @@ -2419,4 +2422,28 @@ void PackageManagerCorePrivate::processFilesForDelayedDeletion() } } +void PackageManagerCorePrivate::findExecutablesRecursive(const QString &path, const QStringList &excludeFiles, QStringList *result) +{ + QString executable; + QDirIterator it(path, QDir::NoDotAndDotDot | QDir::Executable | QDir::Files | QDir::System, QDirIterator::Subdirectories ); + + while (it.hasNext()) { + executable = it.next(); + foreach (QString exclude, excludeFiles) { + if (QDir::toNativeSeparators(executable.toLower()) + != QDir::toNativeSeparators(exclude.toLower())) { + result->append(executable); + } + } + } +} + +QStringList PackageManagerCorePrivate::runningInstallerProcesses(const QStringList &excludeFiles) +{ + QStringList resultFiles; + findExecutablesRecursive(QCoreApplication::applicationDirPath(), excludeFiles, &resultFiles); + return checkRunningProcessesFromList(resultFiles); +} + + } // namespace QInstaller diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index 7ba081539..21ab3fc40 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -209,6 +209,10 @@ private slots: emit m_core->metaJobProgress(progress); } + void totalProgress(quint64 total) { + emit m_core->metaJobTotalProgress(total); + } + void handleMethodInvocationRequest(const QString &invokableMethodName); private: @@ -230,6 +234,8 @@ private: bool fetchMetaInformationFromCompressedRepositories(); bool addUpdateResourcesFromRepositories(bool parseChecksum, bool compressedRepository = false); void processFilesForDelayedDeletion(); + void findExecutablesRecursive(const QString &path, const QStringList &excludeFiles, QStringList *result); + QStringList runningInstallerProcesses(const QStringList &exludeFiles); private: PackageManagerCore *m_core; diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index 513b9d0e0..d31eb6a94 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -1323,6 +1323,7 @@ IntroductionPage::IntroductionPage(PackageManagerCore *core) core->setCompleteUninstallation(core->isUninstaller()); connect(core, &PackageManagerCore::metaJobProgress, this, &IntroductionPage::onProgressChanged); + connect(core, &PackageManagerCore::metaJobTotalProgress, this, &IntroductionPage::setTotalProgress); connect(core, &PackageManagerCore::metaJobInfoMessage, this, &IntroductionPage::setMessage); connect(core, &PackageManagerCore::coreNetworkSettingsChanged, this, &IntroductionPage::onCoreNetworkSettingsChanged); @@ -1512,11 +1513,19 @@ void IntroductionPage::setMessage(const QString &msg) */ void IntroductionPage::onProgressChanged(int progress) { - m_progressBar->setRange(0, 100); m_progressBar->setValue(progress); } /*! + Sets total \a progress value to progress bar. +*/ +void IntroductionPage::setTotalProgress(int totalProgress) +{ + if (m_progressBar) + m_progressBar->setRange(0, totalProgress); +} + +/*! Displays the error message \a error on the page. */ void IntroductionPage::setErrorMessage(const QString &error) @@ -1946,19 +1955,17 @@ public: m_vlayout->addSpacing(50); m_vlayout->addWidget(m_bspLabel); - m_progressBar = new QProgressBar(); m_progressBar->setRange(0, 0); m_progressBar->hide(); m_vlayout->addWidget(m_progressBar); m_progressBar->setObjectName(QLatin1String("CompressedInstallProgressBar")); - m_installCompressButton = new QPushButton; connect(m_installCompressButton, &QAbstractButton::clicked, this, &ComponentSelectionPage::Private::selectCompressedPackage); m_installCompressButton->setObjectName(QLatin1String("InstallCompressedPackageButton")); - m_installCompressButton->setText(ComponentSelectionPage::tr("&Browse QBSP or 7z files...")); + m_installCompressButton->setText(ComponentSelectionPage::tr("&Browse QBSP files")); m_vlayout->addWidget(m_installCompressButton); m_compressedButtonVisible = true; } @@ -2057,21 +2064,26 @@ public slots: QSet<Repository> set; foreach (QString fileName, fileNames) { Repository repository = Repository::fromUserInput(fileName, true); + repository.setEnabled(true); set.insert(repository); } if (set.count() > 0) { m_progressBar->show(); - m_installCompressButton->setEnabled(false); + m_installCompressButton->hide(); QPushButton *const b = qobject_cast<QPushButton *>(q->gui()->button(QWizard::NextButton)); b->setEnabled(false); m_core->settings().addTemporaryRepositories(set, false); - m_core->fetchCompressedPackagesTree(); - updateTreeView(); + if (!m_core->fetchCompressedPackagesTree()) { + setMessage(m_core->error()); + } + else { + updateTreeView(); + setMessage(ComponentSelectionPage::tr("To install new "\ + "compressed repository, browse the repositories from your computer")); + } m_progressBar->hide(); - m_bspLabel->setText(ComponentSelectionPage::tr("To install new "\ - "compressed repository, browse the repositories from your computer")); - m_installCompressButton->setEnabled(true); + m_installCompressButton->show(); b->setEnabled(true); } } @@ -2089,13 +2101,9 @@ public slots: */ void setMessage(const QString &msg) { - if (m_progressBar->isVisible()) { + QWizardPage *page = q->gui()->currentPage(); + if (m_bspLabel && page && page->objectName() == QLatin1String("ComponentSelectionPage")) m_bspLabel->setText(msg); - } - else { - m_bspLabel->setText(ComponentSelectionPage::tr("To install new "\ - "compressed repository, browse the repositories from your computer")); - } } void selectDefault() @@ -2183,7 +2191,7 @@ void ComponentSelectionPage::entering() QT_TR_NOOP("Please select the components you want to update."), QT_TR_NOOP("Please select the components you want to install."), QT_TR_NOOP("Please select the components you want to uninstall."), - QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them.") + QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated.") }; int index = 0; diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h index fc7440647..238e22a62 100644 --- a/src/libs/installer/packagemanagergui.h +++ b/src/libs/installer/packagemanagergui.h @@ -224,6 +224,7 @@ public Q_SLOTS: void onCoreNetworkSettingsChanged(); void setMessage(const QString &msg); void onProgressChanged(int progress); + void setTotalProgress(int totalProgress); void setErrorMessage(const QString &error); Q_SIGNALS: diff --git a/src/libs/installer/productkeycheck.cpp b/src/libs/installer/productkeycheck.cpp index 4a8ce4677..c1dfe83d6 100644 --- a/src/libs/installer/productkeycheck.cpp +++ b/src/libs/installer/productkeycheck.cpp @@ -101,3 +101,8 @@ QList<int> ProductKeyCheck::registeredPages() const { return QList<int>(); } + +bool ProductKeyCheck::hasValidLicense() const +{ + return true; +} diff --git a/src/libs/installer/productkeycheck.h b/src/libs/installer/productkeycheck.h index 221fdc7ef..b7e8c6d52 100644 --- a/src/libs/installer/productkeycheck.h +++ b/src/libs/installer/productkeycheck.h @@ -66,6 +66,7 @@ public: bool isValidPackage(const QString &packageName) const; QList<int> registeredPages() const; + bool hasValidLicense() const; private: ProductKeyCheck(); diff --git a/src/libs/kdtools/job.cpp b/src/libs/kdtools/job.cpp index 7e36c295c..426aa1198 100644 --- a/src/libs/kdtools/job.cpp +++ b/src/libs/kdtools/job.cpp @@ -199,10 +199,8 @@ quint64 Job::processedAmount() const void Job::setTotalAmount(quint64 amount) { - if (d->totalAmount == amount) - return; d->totalAmount = amount; - emit progress(this, d->processedAmount, d->totalAmount); + emit totalProgress(d->totalAmount); } /*! diff --git a/src/libs/kdtools/job.h b/src/libs/kdtools/job.h index 0fe496943..200650259 100644 --- a/src/libs/kdtools/job.h +++ b/src/libs/kdtools/job.h @@ -86,6 +86,7 @@ Q_SIGNALS: void infoMessage(Job *job, const QString &message); void progress(Job *job, quint64 processed, quint64 total); + void totalProgress(quint64 total); protected: virtual void doStart() = 0; |