summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/metadatajob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/metadatajob.cpp')
-rw-r--r--src/libs/installer/metadatajob.cpp126
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)