summaryrefslogtreecommitdiffstats
path: root/src/filedownloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/filedownloader.cpp')
-rw-r--r--src/filedownloader.cpp84
1 files changed, 29 insertions, 55 deletions
diff --git a/src/filedownloader.cpp b/src/filedownloader.cpp
index e0b0289..30f30da 100644
--- a/src/filedownloader.cpp
+++ b/src/filedownloader.cpp
@@ -1,72 +1,46 @@
-/*
- * filedownloader.cpp
- *
- * Created on: Mar 7, 2014
- * Author: nils
- */
-
-#include <QFileInfo>
-
#include "filedownloader.h"
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+
// Maximum size of download
-#define MAXSIZE (200000)
+#define MAXSIZE (400000)
static QNetworkAccessManager m_WebCtrl;
-FileDownloader::FileDownloader(const QUrl& fileUrl, QObject *parent) :
- QObject(parent), started(false), url(fileUrl) {
-}
-
-FileDownloader::~FileDownloader() {
+static void killReply(QNetworkReply *reply);
-}
-
-bool FileDownloader::downloadFile() {
- if (this->started)
- return true;
- QNetworkRequest request(this->url);
+bool FileDownloader::download(const QUrl& fileUrl, const std::function <void (QNetworkReply::NetworkError, const QByteArray&)>& f) {
+ QNetworkRequest request(fileUrl);
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
QNetworkReply *reply = m_WebCtrl.get(request);
if (reply == nullptr)
return false;
- this->started = true;
- connect(reply, SIGNAL(finished()), SLOT(fileDownloaded()));
- connect(reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(downloadProgress(qint64, qint64)));
- return true;
-}
-
-/*
- * Slots from networkreply
- */
-
-void FileDownloader::downloadFailed(QNetworkReply::NetworkError) {
- QNetworkReply *reply = reinterpret_cast<QNetworkReply*>(this->sender());
- killReply(reply);
- emit downloaded(this->url, QByteArray());
-}
-
-void FileDownloader::fileDownloaded() {
- QNetworkReply *reply = reinterpret_cast<QNetworkReply*>(this->sender());
- if (reply == nullptr)
- return;
- QByteArray downloadedData(reply->readAll());
- killReply(reply);
- //emit a signal
- emit downloaded(this->url, downloadedData);
-}
-
-void FileDownloader::downloadProgress(qint64 received, qint64 totalSize) {
- QNetworkReply *reply = reinterpret_cast<QNetworkReply*>(this->sender());
- if (reply == nullptr)
- return;
- if (received > MAXSIZE || totalSize > MAXSIZE) {
+ // Handle normal finish
+ QObject::connect(reply, &QNetworkReply::finished, [reply, f, fileUrl]() {
+ QByteArray downloadedData(reply->readAll());
killReply(reply);
- emit downloaded(this->url, QByteArray());
- }
+ f(QNetworkReply::NoError, downloadedData);
+ });
+ // Handle files that are too large
+ QObject::connect(reply, &QNetworkReply::downloadProgress, [reply, f, fileUrl](qint64 received, qint64 totalSize) {
+ if (received > MAXSIZE || totalSize > MAXSIZE) {
+ qDebug() << fileUrl << "too large";
+ killReply(reply);
+ f(QNetworkReply::NetworkError::UnknownNetworkError, QByteArray());
+ }
+ });
+ // Handle errors
+ QObject::connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
+ [reply, f, fileUrl](QNetworkReply::NetworkError err) {
+ qDebug() << fileUrl << "error" << err;
+ killReply(reply);
+ f(err, QByteArray());
+ });
+ return true;
}
-void FileDownloader::killReply(QNetworkReply *reply) {
+static void killReply(QNetworkReply *reply) {
if (reply == nullptr)
return;
reply->blockSignals(true);