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
|
#ifndef UPLOADMANAGER_H
#define UPLOADMANAGER_H
#include <functional>
#include <QQueue>
#include "watchconnector.h"
class UploadManager : public QObject
{
Q_OBJECT
QLoggingCategory l;
public:
explicit UploadManager(WatchConnector *watch, QObject *parent = 0);
typedef std::function<void()> SuccessCallback;
typedef std::function<void(int)> ErrorCallback;
typedef std::function<void(qreal)> ProgressCallback;
uint upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size = -1, quint32 crc = 0,
SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
uint uploadAppBinary(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
uint uploadAppResources(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
uint uploadAppWorker(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
uint uploadFile(const QString &filename, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
uint uploadFirmwareBinary(bool recovery, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
uint uploadFirmwareResources(QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback());
void cancel(uint id, int code = 0);
signals:
public slots:
private:
enum State {
StateNotStarted,
StateWaitForToken,
StateInProgress,
StateCommit,
StateComplete
};
struct PendingUpload {
uint id;
WatchConnector::UploadType type;
int index;
QString filename;
QIODevice *device;
int size;
int remaining;
quint32 crc;
SuccessCallback successCallback;
ErrorCallback errorCallback;
ProgressCallback progressCallback;
};
void startNextUpload();
void handleMessage(const QByteArray &msg);
bool uploadNextChunk(PendingUpload &upload);
bool commit(PendingUpload &upload);
bool complete(PendingUpload &upload);
private:
WatchConnector *watch;
QQueue<PendingUpload> _pending;
uint _lastUploadId;
State _state;
quint32 _token;
};
#endif // UPLOADMANAGER_H
|