From 6f50ea0faa45112e4b5ec7b1c17e34eec6dc26cc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 18 Mar 2014 13:55:14 -0700 Subject: [PATCH] Improved FileDownloader --- libraries/shared/src/FileDownloader.cpp | 43 +++++++++++++++++++------ libraries/shared/src/FileDownloader.h | 13 ++++++-- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/libraries/shared/src/FileDownloader.cpp b/libraries/shared/src/FileDownloader.cpp index 5d4a82ca00..2b65bbd8df 100644 --- a/libraries/shared/src/FileDownloader.cpp +++ b/libraries/shared/src/FileDownloader.cpp @@ -9,12 +9,15 @@ #include #include -#include #include +#include #include "FileDownloader.h" -FileDownloader::FileDownloader(const QUrl dataURL, QObject* parent) : QObject(parent) { +FileDownloader::FileDownloader(const QUrl dataURL, QObject* parent) : + QObject(parent), + _done(false) +{ connect(&_networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(processReply(QNetworkReply*))); QNetworkRequest request(dataURL); @@ -22,21 +25,41 @@ FileDownloader::FileDownloader(const QUrl dataURL, QObject* parent) : QObject(pa } void FileDownloader::processReply(QNetworkReply *reply) { - if (reply->error() != QNetworkReply::NoError) { - emit done(reply->error()); - return; + if (reply->error() == QNetworkReply::NoError) { + _downloadedData = reply->readAll(); } - _downloadedData = reply->readAll(); reply->deleteLater(); - - emit done(QNetworkReply::NoError); + _done = true; + emit done(reply->error()); } -QByteArray FileDownloader::download(const QUrl dataURL) { +void FileDownloader::waitForFile(int timeout) { + QTimer timer; QEventLoop loop; + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + connect(this, SIGNAL(done(QNetworkReply::NetworkError)), &loop, SLOT(quit())); + + if (!_done) { + if (timeout > 0) { + timer.start(timeout); + } + loop.exec(); + } +} + +QByteArray FileDownloader::download(const QUrl dataURL, int timeout) { + QTimer timer; + QEventLoop loop; + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit)); + FileDownloader downloader(dataURL); - connect(&downloader, SIGNAL(done()), &loop, SLOT(quit())); + connect(&downloader, SIGNAL(done(QNetworkReply::NetworkError)), &loop, SLOT(quit())); + + if (timeout > 0) { + timer.start(timeout); + } loop.exec(); + return downloader.getData(); } \ No newline at end of file diff --git a/libraries/shared/src/FileDownloader.h b/libraries/shared/src/FileDownloader.h index 892fd10a96..a2ed0b8ccb 100644 --- a/libraries/shared/src/FileDownloader.h +++ b/libraries/shared/src/FileDownloader.h @@ -12,13 +12,20 @@ #include #include +#include class FileDownloader : public QObject { + Q_OBJECT + public: FileDownloader(const QUrl dataURL, QObject* parent = NULL); - QByteArray getData() const { return _downloadedData; } - static QByteArray download(const QUrl dataURL); + void waitForFile(int timeout = 0); + + QByteArray getData() const { return _downloadedData; } + bool done() { return _done; } + + static QByteArray download(const QUrl dataURL, int timeout = 0); signals: void done(QNetworkReply::NetworkError); @@ -29,6 +36,8 @@ private slots: private: QNetworkAccessManager _networkAccessManager; QByteArray _downloadedData; + + bool _done; };