summaryrefslogtreecommitdiffstats
path: root/logic/net/DownloadJob.h
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2013-09-02 00:25:40 +0200
committerPetr Mrázek <peterix@gmail.com>2013-09-02 00:25:40 +0200
commitf8e8414d544f1227e86099146bba903c9082d09e (patch)
treea0983c2a5a17feda4c2f813d32d0b98111463176 /logic/net/DownloadJob.h
parent78e278c1e33e39eb29a26a976b19ea6a8150bfff (diff)
downloadMultiMC-f8e8414d544f1227e86099146bba903c9082d09e.tar
MultiMC-f8e8414d544f1227e86099146bba903c9082d09e.tar.gz
MultiMC-f8e8414d544f1227e86099146bba903c9082d09e.tar.lz
MultiMC-f8e8414d544f1227e86099146bba903c9082d09e.tar.xz
MultiMC-f8e8414d544f1227e86099146bba903c9082d09e.zip
Speed up the downloads. Massively.
Diffstat (limited to 'logic/net/DownloadJob.h')
-rw-r--r--logic/net/DownloadJob.h111
1 files changed, 93 insertions, 18 deletions
diff --git a/logic/net/DownloadJob.h b/logic/net/DownloadJob.h
index 94abb9af..adeef646 100644
--- a/logic/net/DownloadJob.h
+++ b/logic/net/DownloadJob.h
@@ -1,28 +1,37 @@
#pragma once
-#include "JobQueue.h"
#include <QtNetwork>
-/**
- * A single file for the downloader/cache to process.
- */
-class DownloadJob : public Job
+class DownloadJob;
+class Download;
+typedef QSharedPointer<DownloadJob> DownloadJobPtr;
+typedef QSharedPointer<Download> DownloadPtr;
+
+enum JobStatus
+{
+ Job_NotStarted,
+ Job_InProgress,
+ Job_Finished,
+ Job_Failed
+};
+
+class Job : public QObject
{
Q_OBJECT
+protected:
+ explicit Job(): QObject(0){};
public:
- DownloadJob(QUrl url,
- QString rel_target_path = QString(),
- QString expected_md5 = QString()
- );
- static JobPtr create(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString());
+ virtual ~Job() {};
+
public slots:
- virtual void start();
-
-private slots:
- void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);;
- void downloadError(QNetworkReply::NetworkError error);
- void downloadFinished();
- void downloadReadyRead();
-
+ virtual void start() = 0;
+};
+
+class Download: public Job
+{
+ friend class DownloadJob;
+ Q_OBJECT
+protected:
+ Download(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString());
public:
/// the network reply
QSharedPointer<QNetworkReply> m_reply;
@@ -46,6 +55,72 @@ public:
/// if not saving to file, downloaded data is placed here
QByteArray m_data;
+ int currentProgress = 0;
+ int totalProgress = 0;
+
/// The file's status
JobStatus m_status;
+
+ int index_within_job = 0;
+signals:
+ void started(int index);
+ void progress(int index, qint64 current, qint64 total);
+ void succeeded(int index);
+ void failed(int index);
+public slots:
+ virtual void start();
+
+private slots:
+ void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);;
+ void downloadError(QNetworkReply::NetworkError error);
+ void downloadFinished();
+ void downloadReadyRead();
+};
+
+/**
+ * A single file for the downloader/cache to process.
+ */
+class DownloadJob : public Job
+{
+ Q_OBJECT
+public:
+ explicit DownloadJob()
+ :Job(){};
+ explicit DownloadJob(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString())
+ :Job()
+ {
+ add(url, rel_target_path, expected_md5);
+ };
+
+ DownloadPtr add(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString());
+ DownloadPtr operator[](int index)
+ {
+ return downloads[index];
+ };
+ DownloadPtr first()
+ {
+ if(downloads.size())
+ return downloads[0];
+ return DownloadPtr();
+ }
+ int size() const
+ {
+ return downloads.size();
+ }
+signals:
+ void started();
+ void progress(qint64 current, qint64 total);
+ void succeeded();
+ void failed();
+public slots:
+ virtual void start();
+private slots:
+ void partProgress(int index, qint64 bytesReceived, qint64 bytesTotal);;
+ void partSucceeded(int index);
+ void partFailed(int index);
+private:
+ QList<DownloadPtr> downloads;
+ int num_succeeded = 0;
+ int num_failed = 0;
};
+