From 3925556481327972a25ad40ef4e72dc79dd1cec8 Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 10 Apr 2017 14:42:15 +0300 Subject: Fix invalid QBSP installer break Change-Id: I7e0bfc2fb0dc4c5438ec2c5ce59b49eb0f0348ee Task-number: QTIFW-954 Reviewed-by: Iikka Eklund --- src/libs/installer/metadatajob.cpp | 112 ++++++++++++++++++++-------- src/libs/installer/metadatajob.h | 1 + src/libs/installer/metadatajob_p.h | 1 + src/libs/installer/packagemanagercore_p.cpp | 4 +- src/libs/installer/packagemanagergui.cpp | 27 ++++--- 5 files changed, 98 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index 83f252349..4b13508ec 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 @@ -60,6 +61,7 @@ MetadataJob::MetadataJob(QObject *parent) MetadataJob::~MetadataJob() { + resetCompressedFetch(); reset(); } @@ -118,13 +120,25 @@ 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 temporaries = s.temporaryRepositories(); + if (temporaries.contains(repo)) { + temporaries.remove(repo); + temporaries.insert(replacement); + s.setTemporaryRepositories(temporaries, true); + } } } if (!repositoriesFound) @@ -170,8 +184,61 @@ void MetadataJob::startUnzipRepositoryTask(const Repository &repo) void MetadataJob::unzipRepositoryTaskFinished() { QFutureWatcher *watcher = static_cast *>(sender()); + int error = Job::NoError; + QString errorString; try { watcher->waitForFinished(); // trigger possible exceptions + + QHashIterator *, QObject*> i(m_unzipRepositoryTasks); + while (i.hasNext()) { + + i.next(); + if (i.key() == watcher) { + UnzipArchiveTask *task = qobject_cast (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 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 +249,6 @@ void MetadataJob::unzipRepositoryTaskFinished() reset(); emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting.")); } - - QHashIterator *, QObject*> i(m_unzipRepositoryTasks); - while (i.hasNext()) { - i.next(); - if (i.key() == watcher) { - UnzipArchiveTask *task = qobject_cast (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() @@ -299,13 +341,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.")); } @@ -364,7 +403,6 @@ void MetadataJob::metadataTaskFinished() void MetadataJob::reset() { - m_packages.clear(); m_metadata.clear(); setError(Job::NoError); @@ -374,6 +412,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(); + m_packages.clear(); + try { foreach (QFutureWatcher *const watcher, m_unzipTasks.keys()) { watcher->cancel(); watcher->deleteLater(); @@ -390,7 +439,6 @@ void MetadataJob::reset() object->deleteLater(); m_unzipRepositoryTasks.clear(); } catch (...) {} - m_tempDirDeleter.releaseAndDeleteAll(); } MetadataJob::Status MetadataJob::parseUpdatesXml(const QList &results) diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h index 261ae295f..dac92153f 100644 --- a/src/libs/installer/metadatajob.h +++ b/src/libs/installer/metadatajob.h @@ -80,6 +80,7 @@ private slots: private: void startUnzipRepositoryTask(const Repository &repo); void reset(); + void resetCompressedFetch(); Status parseUpdatesXml(const QList &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 &fi) { fi.reportStarted(); diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index f29b65780..5fa2b0515 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -2247,7 +2247,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; } } diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index b51589c14..ae6057995 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -1946,14 +1946,12 @@ 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); @@ -2057,21 +2055,26 @@ public slots: QSet 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(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 +2092,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() -- cgit v1.2.3