1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBDOWNLOADMANAGER_H
#define UBDOWNLOADMANAGER_H
#include <QObject>
#include <QString>
#include <QVector>
#include <QMutex>
#include <QDropEvent>
#include "UBDownloadThread.h"
#include "network/UBHttpGet.h"
#define SIMULTANEOUS_DOWNLOAD 2 // Maximum 5 because of QNetworkAccessManager limitation!!!
struct sDownloadFileDesc
{
enum eDestinations {
board //default for sDownloadFileDesc
, library
, graphicsWidget
};
//creating constructor to make sure to have default values
sDownloadFileDesc() :
dest(board)
, id(0)
, totalSize(0)
, currentSize(0)
, modal(false)
, isBackground(false)
, dropActions(Qt::IgnoreAction)
, dropMouseButtons(Qt::NoButton)
, dropModifiers(Qt::NoModifier)
{;}
eDestinations dest;
QString name;
int id;
int totalSize;
int currentSize;
QString url;
QString contentTypeHeader;
bool modal;
QPointF pos; // For board drop only
QSize size; // For board drop only
bool isBackground; // For board drop only
QPoint dropPoint; //For widget's Drop event
Qt::DropActions dropActions; //For widget's Drop event
Qt::MouseButtons dropMouseButtons; //For widget's Drop event
Qt::KeyboardModifiers dropModifiers; //For widget's Drop event
};
class UBDownloadHttpFile : public UBHttpGet
{
Q_OBJECT
public:
UBDownloadHttpFile(int fileId, QObject* parent=0);
~UBDownloadHttpFile();
signals:
void downloadProgress(int id, qint64 current,qint64 total);
void downloadFinished(int id, bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
void downloadError(int id);
private slots:
void onDownloadFinished(bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
private:
int mId;
};
class UBDownloadManager : public QObject
{
Q_OBJECT
public:
UBDownloadManager(QObject* parent=0, const char* name="UBDownloadManager");
~UBDownloadManager();
static UBDownloadManager* downloadManager();
int addFileToDownload(sDownloadFileDesc desc);
QVector<sDownloadFileDesc> currentDownloads();
QVector<sDownloadFileDesc> pendingDownloads();
void cancelDownloads();
void cancelDownload(int id);
static void destroy();
signals:
void fileAddedToDownload();
void downloadUpdated(int id, qint64 crnt, qint64 total);
void downloadFinished(int id);
void downloadFinished(bool pSuccess, int id, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData);
void downloadFinished(bool pSuccess, sDownloadFileDesc desc, QByteArray pData);
void downloadModalFinished();
void addDownloadedFileToBoard(bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
void addDownloadedFileToLibrary(bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData);
void cancelAllDownloads();
void allDownloadsFinished();
private slots:
void onUpdateDownloadLists();
void onDownloadProgress(int id, qint64 received, qint64 total);
void onDownloadFinished(int id, bool pSuccess, QUrl sourceUrl, QString pContentTypeHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground);
void onDownloadError(int id);
private:
void init();
void updateDownloadOrder();
void updateFileCurrentSize(int id, qint64 received=-1, qint64 total=-1);
void startFileDownload(sDownloadFileDesc desc);
void checkIfModalRemains();
void finishDownloads(bool cancel=false);
/** The current downloads */
QVector<sDownloadFileDesc> mCrntDL;
/** The pending downloads */
QVector<sDownloadFileDesc> mPendingDL;
/** Pending download mutex */
QMutex mMutex;
/** The last file ID */
int mLastID;
/** The current download availability (-1 = free, otherwise the file ID is recorded)*/
QVector<int> mDLAvailability;
/** A map containing the replies of the GET operations */
QMap<int, QNetworkReply*> mReplies;
};
#endif // UBDOWNLOADMANAGER_H