diff options
author | kh1 <karsten.heimrich@digia.com> | 2014-01-28 15:08:57 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@digia.com> | 2014-02-03 13:29:31 +0100 |
commit | 7fe93a0bd045060fa0736931a1981bf7ef3c72be (patch) | |
tree | 182c37a9891bff2f22601307b907852904891675 | |
parent | 858e16567539b793d31fe918f9728d68307df321 (diff) |
Introduce TaskItem and Authenticator role.
Make sure every reply can use its own authenticator and
pass back the initial task item to the caller(task tracking).
Change-Id: I8b57dbf9d70f3061a91e436a578ec7e0c3138beb
Reviewed-by: Niels Weber <niels.weber@digia.com>
Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
-rw-r--r-- | src/libs/installer/abstractfiletask.h | 5 | ||||
-rw-r--r-- | src/libs/installer/copyfiletask.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/downloadfiletask.cpp | 43 | ||||
-rw-r--r-- | src/libs/installer/downloadfiletask.h | 8 | ||||
-rw-r--r-- | src/libs/installer/downloadfiletask_p.h | 11 |
5 files changed, 42 insertions, 27 deletions
diff --git a/src/libs/installer/abstractfiletask.h b/src/libs/installer/abstractfiletask.h index b4545fef6..858a35f40 100644 --- a/src/libs/installer/abstractfiletask.h +++ b/src/libs/installer/abstractfiletask.h @@ -60,6 +60,7 @@ namespace TaskRole { enum { Checksum, + TaskItem, SourceFile, TargetFile, UserRole = 1000 @@ -88,14 +89,16 @@ class FileTaskResult : public AbstractTaskData { public: FileTaskResult() {} - FileTaskResult(const QString &t, const QByteArray &c) + FileTaskResult(const QString &t, const QByteArray &c, const FileTaskItem &i) { insert(TaskRole::Checksum, c); insert(TaskRole::TargetFile, t); + insert(TaskRole::TaskItem, QVariant::fromValue(i)); } QString target() const { return value(TaskRole::TargetFile).toString(); } QByteArray checkSum() const { return value(TaskRole::Checksum).toByteArray(); } + FileTaskItem taskItem() const { return value(TaskRole::TaskItem).value<FileTaskItem>(); } }; class FileTaskException : public QException diff --git a/src/libs/installer/copyfiletask.cpp b/src/libs/installer/copyfiletask.cpp index ca31b7873..4fe2a17ac 100644 --- a/src/libs/installer/copyfiletask.cpp +++ b/src/libs/installer/copyfiletask.cpp @@ -123,7 +123,7 @@ void CopyFileTask::doTask(QFutureInterface<FileTaskResult> &fi) fi.setProgressValueAndText(observer.progressValue(), observer.progressText()); } - fi.reportResult(FileTaskResult(file->fileName(), observer.checkSum()), 0); + fi.reportResult(FileTaskResult(file->fileName(), observer.checkSum(), item), 0); fi.reportFinished(); } diff --git a/src/libs/installer/downloadfiletask.cpp b/src/libs/installer/downloadfiletask.cpp index d3f5f98f7..8d15a835d 100644 --- a/src/libs/installer/downloadfiletask.cpp +++ b/src/libs/installer/downloadfiletask.cpp @@ -75,11 +75,10 @@ Downloader::~Downloader() } void Downloader::download(QFutureInterface<FileTaskResult> &fi, const QList<FileTaskItem> &items, - const QAuthenticator &authenticator, QNetworkProxyFactory *networkProxyFactory) + QNetworkProxyFactory *networkProxyFactory) { m_items = items; m_futureInterface = &fi; - m_authenticator = authenticator; fi.reportStarted(); fi.setExpectedResultCount(items.count()); @@ -173,8 +172,8 @@ void Downloader::onFinished(QNetworkReply *reply) delete data.file; delete data.observer; - FileTaskItem taskItem(url.toString(), filename); - taskItem.insert(TaskRole::Checksum, data.expectedCheckSum); + FileTaskItem taskItem = data.taskItem; + taskItem.insert(TaskRole::SourceFile, url.toString()); QNetworkReply *const redirectReply = startDownload(taskItem); foreach (const QUrl &redirect, redirects) @@ -199,14 +198,15 @@ void Downloader::onFinished(QNetworkReply *reply) data.observer->addBytesTransfered(ba.size()); data.observer->addCheckSumData(ba.data(), ba.size()); } - m_futureInterface->reportResult(FileTaskResult(filename, data.observer->checkSum())); - if (!data.expectedCheckSum.isEmpty()) { - if (data.expectedCheckSum != data.observer->checkSum().toHex()) { + const QByteArray expectedCheckSum = data.taskItem.value(TaskRole::Checksum).toByteArray(); + if (!expectedCheckSum.isEmpty()) { + if (expectedCheckSum != data.observer->checkSum().toHex()) { m_futureInterface->reportException(FileTaskException(QString::fromLatin1("Checksum" " mismatch detected '%1'.").arg(reply->url().toString()))); } } + m_futureInterface->reportResult(FileTaskResult(filename, data.observer->checkSum(), data.taskItem)); data.file->close(); delete data.file; @@ -259,14 +259,15 @@ void Downloader::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) void Downloader::onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) { - Q_UNUSED(reply) - if (!authenticator) + if (!authenticator || !reply || !m_downloads.contains(reply)) return; - if (!m_authenticator.user().isEmpty()) { - authenticator->setUser(m_authenticator.user()); - authenticator->setPassword(m_authenticator.password()); - m_authenticator = QAuthenticator(); // clear so we fail on next call + FileTaskItem *item = &m_downloads[reply].taskItem; + const QAuthenticator auth = item->value(TaskRole::Authenticator).value<QAuthenticator>(); + if (!auth.user().isEmpty()) { + authenticator->setUser(auth.user()); + authenticator->setPassword(auth.password()); + item->insert(TaskRole::Authenticator, QVariant()); // clear so we fail on next call } else { m_futureInterface->reportException(FileTaskException(QString::fromLatin1("Could not " "authenticate using the provided credentials. Source: '%1'.").arg(reply->url() @@ -314,8 +315,7 @@ QNetworkReply *Downloader::startDownload(const FileTaskItem &item) } QNetworkReply *reply = m_nam.get(QNetworkRequest(source)); - m_downloads.insert(reply, Data(file.take(), new FileTaskObserver(QCryptographicHash::Sha1), - item.value(TaskRole::Checksum).toByteArray())); + m_downloads.insert(reply, Data(file.take(), new FileTaskObserver(QCryptographicHash::Sha1), item)); connect(reply, SIGNAL(readyRead()), this, SLOT(onReadyRead())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, @@ -373,9 +373,16 @@ void DownloadFileTask::doTask(QFutureInterface<FileTaskResult> &fi) QEventLoop el; Downloader downloader; connect(&downloader, SIGNAL(finished()), &el, SLOT(quit())); - downloader.download(fi, taskItems(), m_authenticator, (m_proxyFactory.isNull() ? 0 - : m_proxyFactory->clone())); // Downloader takes ownership of this copy. - el.exec(); // That's tricky here, we run our own event loop to keep QNAM working + + QList<FileTaskItem> items = taskItems(); + if (!m_authenticator.isNull()) { + for (int i = 0; i < items.count(); ++i) { + if (items.at(i).value(TaskRole::Authenticator).isNull()) + items[i].insert(TaskRole::Authenticator, QVariant::fromValue(m_authenticator)); + } + } + downloader.download(fi, items, (m_proxyFactory.isNull() ? 0 : m_proxyFactory->clone())); + el.exec(); // That's tricky here, we need to run our own event loop to keep QNAM working. } } // namespace QInstaller diff --git a/src/libs/installer/downloadfiletask.h b/src/libs/installer/downloadfiletask.h index 4e2cd2312..c320e6dba 100644 --- a/src/libs/installer/downloadfiletask.h +++ b/src/libs/installer/downloadfiletask.h @@ -46,9 +46,17 @@ #include "kdupdaterfiledownloaderfactory.h" #include <QAuthenticator> +Q_DECLARE_METATYPE(QAuthenticator) namespace QInstaller { +namespace TaskRole { +enum +{ + Authenticator = TaskRole::TargetFile + 10 +}; +} + class INSTALLER_EXPORT DownloadFileTask : public AbstractFileTask { Q_OBJECT diff --git a/src/libs/installer/downloadfiletask_p.h b/src/libs/installer/downloadfiletask_p.h index 66b14767c..855b32813 100644 --- a/src/libs/installer/downloadfiletask_p.h +++ b/src/libs/installer/downloadfiletask_p.h @@ -61,14 +61,12 @@ struct Data { Data() : file(0), observer(0) {} - Data(QFile *f, FileTaskObserver *o) - : file(f), observer(o) {} - Data(QFile *f, FileTaskObserver *o, const QByteArray &e) - : file(f), observer(o), expectedCheckSum(e) + Data(QFile *f, FileTaskObserver *o, const FileTaskItem &fti) + : file(f), observer(o), taskItem(fti) {} QFile *file; FileTaskObserver *observer; - QByteArray expectedCheckSum; + FileTaskItem taskItem; }; class Downloader : public QObject @@ -81,7 +79,7 @@ public: ~Downloader(); void download(QFutureInterface<FileTaskResult> &fi, const QList<FileTaskItem> &items, - const QAuthenticator &authenticator, QNetworkProxyFactory *networkProxyFactory); + QNetworkProxyFactory *networkProxyFactory); signals: void finished(); @@ -106,7 +104,6 @@ private: int m_finished; QNetworkAccessManager m_nam; QList<FileTaskItem> m_items; - QAuthenticator m_authenticator; QHash<QNetworkReply*, Data> m_downloads; QMultiHash<QNetworkReply*, QUrl> m_redirects; }; |