From e0fdb8c0f36fc78d3f445c3a218902bc132a33ec Mon Sep 17 00:00:00 2001 From: Javier Date: Sat, 13 Dec 2014 00:24:07 +0100 Subject: progress reporting callbacks in uploadmanager --- daemon/uploadmanager.cpp | 30 ++++++++++++++++++++---------- daemon/uploadmanager.h | 15 +++++++++------ 2 files changed, 29 insertions(+), 16 deletions(-) (limited to 'daemon') diff --git a/daemon/uploadmanager.cpp b/daemon/uploadmanager.cpp index 29c436e..5976fe6 100644 --- a/daemon/uploadmanager.cpp +++ b/daemon/uploadmanager.cpp @@ -21,7 +21,7 @@ UploadManager::UploadManager(WatchConnector *watch, QObject *parent) : } uint UploadManager::upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size, - SuccessCallback successCallback, ErrorCallback errorCallback) + SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { PendingUpload upload; upload.id = ++_lastUploadId; @@ -30,12 +30,14 @@ uint UploadManager::upload(WatchConnector::UploadType type, int index, const QSt upload.filename = filename; upload.device = device; if (size < 0) { - upload.remaining = device->size(); + upload.size = device->size(); } else { - upload.remaining = size; + upload.size = size; } + upload.remaining = upload.size; upload.successCallback = successCallback; upload.errorCallback = errorCallback; + upload.progressCallback = progressCallback; if (upload.remaining <= 0) { logger()->warn() << "upload is empty"; @@ -54,20 +56,20 @@ uint UploadManager::upload(WatchConnector::UploadType type, int index, const QSt return upload.id; } -uint UploadManager::uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback) +uint UploadManager::uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(WatchConnector::uploadBINARY, slot, QString(), device, -1, successCallback, errorCallback); + return upload(WatchConnector::uploadBINARY, slot, QString(), device, -1, successCallback, errorCallback, progressCallback); } -uint UploadManager::uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback) +uint UploadManager::uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(WatchConnector::uploadRESOURCES, slot, QString(), device, -1, successCallback, errorCallback); + return upload(WatchConnector::uploadRESOURCES, slot, QString(), device, -1, successCallback, errorCallback, progressCallback); } -uint UploadManager::uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback) +uint UploadManager::uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { Q_ASSERT(!filename.isEmpty()); - return upload(WatchConnector::uploadFILE, 0, filename, device, -1, successCallback, errorCallback); + return upload(WatchConnector::uploadFILE, 0, filename, device, -1, successCallback, errorCallback, progressCallback); } void UploadManager::cancel(uint id, int code) @@ -181,6 +183,10 @@ void UploadManager::handleMessage(const QByteArray &msg) /* fallthrough */ case StateInProgress: logger()->debug() << "moving to the next chunk"; + if (upload.progressCallback) { + // Report that the previous chunk has been succesfully uploaded + upload.progressCallback(1.0 - (qreal(upload.remaining) / upload.size)); + } if (upload.remaining > 0) { if (!uploadNextChunk(upload)) { cancel(upload.id, -1); @@ -197,6 +203,10 @@ void UploadManager::handleMessage(const QByteArray &msg) break; case StateCommit: logger()->debug() << "commited succesfully"; + if (upload.progressCallback) { + // Report that all chunks have been succesfully uploaded + upload.progressCallback(1.0); + } _state = StateComplete; if (!complete(upload)) { cancel(upload.id, -1); @@ -248,7 +258,7 @@ bool UploadManager::uploadNextChunk(PendingUpload &upload) upload.remaining -= chunk.size(); upload.crc.addData(chunk); - logger()->debug() << "remaining" << upload.remaining << "bytes"; + logger()->debug() << "remaining" << upload.remaining << "/" << upload.size << "bytes"; return true; } diff --git a/daemon/uploadmanager.h b/daemon/uploadmanager.h index b4e951a..45453b6 100644 --- a/daemon/uploadmanager.h +++ b/daemon/uploadmanager.h @@ -16,13 +16,14 @@ public: typedef std::function SuccessCallback; typedef std::function ErrorCallback; + typedef std::function ProgressCallback; uint upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size = -1, - SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback()); + SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); - uint uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback()); - uint uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback()); - uint uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback()); + uint uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); void cancel(uint id, int code = 0); @@ -47,11 +48,13 @@ private: int index; QString filename; QIODevice *device; + int size; int remaining; Stm32Crc crc; - std::function successCallback; - std::function errorCallback; + SuccessCallback successCallback; + ErrorCallback errorCallback; + ProgressCallback progressCallback; }; void startNextUpload(); -- cgit v1.2.3