diff options
Diffstat (limited to 'src/libs/installer/metadatajob.cpp')
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 126 |
1 files changed, 92 insertions, 34 deletions
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) |