From 8c86d80504bec6524d9c5006d168438500130ca5 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 12 Dec 2014 01:03:56 +0100 Subject: add support for uploading files, requires fw 2.8 --- daemon/bankmanager.cpp | 24 ++++++++++++++++++++++-- daemon/packer.cpp | 6 ++++++ daemon/packer.h | 2 ++ daemon/uploadmanager.cpp | 26 ++++++++++++++++++++++++-- daemon/uploadmanager.h | 14 ++++++++++---- log4qt-debug.conf | 2 +- 6 files changed, 65 insertions(+), 9 deletions(-) diff --git a/daemon/bankmanager.cpp b/daemon/bankmanager.cpp index 331dd6a..dd278af 100644 --- a/daemon/bankmanager.cpp +++ b/daemon/bankmanager.cpp @@ -4,6 +4,26 @@ #include "packer.h" #include "bankmanager.h" +#if 0 +// TODO -- This is how language files seems to be installed. +if (slot == -4) { + logger()->debug() << "starting lang install"; + QFile *pbl = new QFile(QDir::home().absoluteFilePath("es.pbl")); + if (!pbl->open(QIODevice::ReadOnly)) { + logger()->warn() << "Failed to open pbl"; + return false; + } + + upload->uploadFile("lang", pbl, [this]() { + logger()->debug() << "success"; + }, [this](int code) { + logger()->warn() << "Some error" << code; + }); + + return true; +} +#endif + BankManager::BankManager(WatchConnector *watch, UploadManager *upload, AppManager *apps, QObject *parent) : QObject(parent), watch(watch), upload(upload), apps(apps), _refresh(new QTimer(this)) { @@ -82,14 +102,14 @@ bool BankManager::uploadApp(const QUuid &uuid, int slot) _slots[slot].name.clear(); _slots[slot].uuid = QUuid(); - upload->upload(WatchConnector::uploadBINARY, slot, binaryFile, -1, + upload->uploadAppBinary(slot, binaryFile, [this, binaryFile, resourceFile, slot]() { logger()->debug() << "app binary upload succesful"; delete binaryFile; // Proceed to upload the resource file if (resourceFile) { - upload->upload(WatchConnector::uploadRESOURCES, slot, resourceFile, -1, + upload->uploadAppResources(slot, resourceFile, [this, resourceFile, slot]() { logger()->debug() << "app resources upload succesful"; delete resourceFile; diff --git a/daemon/packer.cpp b/daemon/packer.cpp index 0cc71f6..00d5383 100644 --- a/daemon/packer.cpp +++ b/daemon/packer.cpp @@ -14,6 +14,12 @@ void Packer::writeBytes(int n, const QByteArray &b) } } +void Packer::writeCString(const QString &s) +{ + _buf->append(s.toUtf8()); + _buf->append('\0'); +} + void Packer::writeUuid(const QUuid &uuid) { writeBytes(16, uuid.toRfc4122()); diff --git a/daemon/packer.h b/daemon/packer.h index d22072c..ceb6593 100644 --- a/daemon/packer.h +++ b/daemon/packer.h @@ -25,6 +25,8 @@ public: void writeFixedString(int n, const QString &s); + void writeCString(const QString &s); + void writeUuid(const QUuid &uuid); void writeDict(const QMap &d); diff --git a/daemon/uploadmanager.cpp b/daemon/uploadmanager.cpp index ccbf12a..29c436e 100644 --- a/daemon/uploadmanager.cpp +++ b/daemon/uploadmanager.cpp @@ -20,13 +20,14 @@ UploadManager::UploadManager(WatchConnector *watch, QObject *parent) : }); } -uint UploadManager::upload(WatchConnector::UploadType type, int index, QIODevice *device, int size, - function successCallback, function errorCallback) +uint UploadManager::upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size, + SuccessCallback successCallback, ErrorCallback errorCallback) { PendingUpload upload; upload.id = ++_lastUploadId; upload.type = type; upload.index = index; + upload.filename = filename; upload.device = device; if (size < 0) { upload.remaining = device->size(); @@ -53,6 +54,22 @@ uint UploadManager::upload(WatchConnector::UploadType type, int index, QIODevice return upload.id; } +uint UploadManager::uploadAppBinary(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback) +{ + return upload(WatchConnector::uploadBINARY, slot, QString(), device, -1, successCallback, errorCallback); +} + +uint UploadManager::uploadAppResources(int slot, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback) +{ + return upload(WatchConnector::uploadRESOURCES, slot, QString(), device, -1, successCallback, errorCallback); +} + +uint UploadManager::uploadFile(const QString &filename, QIODevice *device, SuccessCallback successCallback, ErrorCallback errorCallback) +{ + Q_ASSERT(!filename.isEmpty()); + return upload(WatchConnector::uploadFILE, 0, filename, device, -1, successCallback, errorCallback); +} + void UploadManager::cancel(uint id, int code) { if (_pending.empty()) { @@ -112,6 +129,11 @@ void UploadManager::startNextUpload() p.write(upload.remaining); p.write(upload.type); p.write(upload.index); + if (!upload.filename.isEmpty()) { + p.writeCString(upload.filename); + } + + logger()->debug() << "starting new upload, size:" << upload.remaining << ", type:" << upload.type << ", slot:" << upload.index; _state = StateWaitForToken; watch->sendMessage(WatchConnector::watchPUTBYTES, msg); diff --git a/daemon/uploadmanager.h b/daemon/uploadmanager.h index 1d42237..b4e951a 100644 --- a/daemon/uploadmanager.h +++ b/daemon/uploadmanager.h @@ -14,11 +14,16 @@ class UploadManager : public QObject public: explicit UploadManager(WatchConnector *watch, QObject *parent = 0); - typedef std::function Callback; + typedef std::function SuccessCallback; + typedef std::function ErrorCallback; + + uint upload(WatchConnector::UploadType type, int index, const QString &filename, QIODevice *device, int size = -1, + SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback()); + + 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 upload(WatchConnector::UploadType type, int index, QIODevice *device, int size = -1, - std::function successCallback = std::function(), - std::function errorCallback = std::function()); void cancel(uint id, int code = 0); signals: @@ -40,6 +45,7 @@ private: WatchConnector::UploadType type; int index; + QString filename; QIODevice *device; int remaining; Stm32Crc crc; diff --git a/log4qt-debug.conf b/log4qt-debug.conf index 2d55cdc..1baed5d 100644 --- a/log4qt-debug.conf +++ b/log4qt-debug.conf @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, consolelog, syslog +log4j.rootLogger=TRACE, consolelog, syslog log4j.appender.consolelog=org.apache.log4j.ColorConsoleAppender log4j.appender.consolelog.layout=org.apache.log4j.SimpleTimeLayout -- cgit v1.2.3