diff options
| author | Javier <dev.git@javispedro.com> | 2016-01-02 03:31:42 +0100 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2016-02-12 00:07:55 +0100 |
| commit | 5dc645452192f1e0b2261ec261945e310c77f8da (patch) | |
| tree | 7ae609824320b35783fe5954f7f258d65a92666c | |
| parent | b8f4002115abfc7a63af023e6199284041368a62 (diff) | |
implement the AppFetch manager, including upload based on AppId
Conflicts:
daemon/daemon.pro
daemon/manager.cpp
daemon/manager.h
daemon/watchconnector.h
| -rw-r--r-- | daemon/appfetchmanager.cc | 106 | ||||
| -rw-r--r-- | daemon/appfetchmanager.h | 34 | ||||
| -rw-r--r-- | daemon/bankmanager.cpp | 6 | ||||
| -rw-r--r-- | daemon/daemon.pro | 2 | ||||
| -rw-r--r-- | daemon/manager.cpp | 1 | ||||
| -rw-r--r-- | daemon/manager.h | 2 | ||||
| -rw-r--r-- | daemon/uploadmanager.cpp | 49 | ||||
| -rw-r--r-- | daemon/uploadmanager.h | 11 | ||||
| -rw-r--r-- | daemon/watchconnector.cpp | 2 | ||||
| -rw-r--r-- | daemon/watchconnector.h | 12 |
10 files changed, 205 insertions, 20 deletions
diff --git a/daemon/appfetchmanager.cc b/daemon/appfetchmanager.cc new file mode 100644 index 0000000..9c58e27 --- /dev/null +++ b/daemon/appfetchmanager.cc @@ -0,0 +1,106 @@ +#include "appfetchmanager.h" +#include "appmanager.h" +#include "uploadmanager.h" +#include "unpacker.h" +#include "packer.h" + +AppFetchManager::AppFetchManager(WatchConnector *watch, UploadManager *upload, AppManager *apps, QObject *parent) + : QObject(parent), l(metaObject()->className()), + watch(watch), upload(upload), apps(apps) + +{ + watch->setEndpointHandler(WatchConnector::watchAPP_FETCH, + [this](const QByteArray &data) { + switch (data.at(0)) { + case WatchConnector::appfetchREQUEST: + handleAppFetchRequest(data); + break; + } + + return true; + }); +} + +void AppFetchManager::handleAppFetchRequest(const QByteArray &msg) +{ + Unpacker u(msg); + quint8 command = u.readLE<quint8>(); + QUuid uuid = u.readUuid(); + qint32 appId = u.readLE<qint32>(); + + Q_ASSERT(command == WatchConnector::appfetchREQUEST); + + uploadApp(uuid, appId); +} + +void AppFetchManager::sendAppFetchResponse(WatchConnector::AppFetchMessage command, WatchConnector::AppFetchStatus status) +{ + QByteArray msg; + Packer p(&msg); + + p.writeLE<quint8>(command); + p.writeLE<quint8>(status); + + watch->sendMessage(WatchConnector::watchAPP_FETCH, msg); +} + +void AppFetchManager::uploadApp(const QUuid &uuid, quint32 appId) +{ + AppInfo info = apps->info(uuid); + if (info.uuid() != uuid) { + qCWarning(l) << "uuid" << uuid << "is not installed"; + sendAppFetchResponse(WatchConnector::appfetchREQUEST, WatchConnector::appfetchINVALID_UUID); + return; + } + + qCDebug(l) << "about to upload app" << info.shortName(); + + QSharedPointer<QIODevice> binaryFile(info.openFile(AppInfo::APPLICATION)); + if (!binaryFile) { + qCWarning(l) << "failed to open" << info.shortName() << "AppInfo::BINARY"; + sendAppFetchResponse(WatchConnector::appfetchREQUEST, WatchConnector::appfetchINVALID_UUID); + return; + } + + qCDebug(l) << "binary file size is" << binaryFile->size(); + + upload->uploadAppBinaryId(appId, binaryFile.data(), info.crcFile(AppInfo::APPLICATION), + [this, info, binaryFile, appId]() { + qCDebug(l) << "app binary upload succesful"; + binaryFile->close(); + + // Upload worker if present + if (info.type() == "worker") { + QSharedPointer<QIODevice> workerFile(info.openFile(AppInfo::WORKER)); + if (workerFile) { + upload->uploadAppWorkerId(appId, workerFile.data(), info.crcFile(AppInfo::WORKER), + [this, workerFile]() { + qCDebug(l) << "app worker upload succesful"; + workerFile->close(); + }, [this, workerFile](int code) { + qCWarning(l) << "app worker upload failed" << code; + workerFile->close(); + }); + } + } + + // Proceed to upload the resource file + QSharedPointer<QIODevice> resourceFile(info.openFile(AppInfo::RESOURCES)); + if (resourceFile) { + upload->uploadAppResourcesId(appId, resourceFile.data(), info.crcFile(AppInfo::RESOURCES), + [this, resourceFile]() { + qCDebug(l) << "app resources upload succesful"; + resourceFile->close(); + // Upload succesful + }, [this, resourceFile](int code) { + qCWarning(l) << "app resources upload failed" << code; + resourceFile->close(); + }); + } else { + // No resource file + } + }, [this, binaryFile](int code) { + binaryFile->close(); + qCWarning(l) << "app binary upload failed" << code; + }); +} diff --git a/daemon/appfetchmanager.h b/daemon/appfetchmanager.h new file mode 100644 index 0000000..2134ab5 --- /dev/null +++ b/daemon/appfetchmanager.h @@ -0,0 +1,34 @@ +#ifndef APPFETCHMANAGER_H +#define APPFETCHMANAGER_H + +#include <QTimer> +#include <QUuid> +#include <QVector> +#include <QLoggingCategory> + +#include "watchconnector.h" + +class UploadManager; +class AppManager; + +class AppFetchManager : public QObject +{ + Q_OBJECT + QLoggingCategory l; + +public: + explicit AppFetchManager(WatchConnector *watch, UploadManager *upload, AppManager *apps, QObject *parent = 0); + +private: + void handleAppFetchRequest(const QByteArray &msg); + void sendAppFetchResponse(WatchConnector::AppFetchMessage command, WatchConnector::AppFetchStatus status); + + void uploadApp(const QUuid &uuid, quint32 app_id); + +private: + WatchConnector *watch; + UploadManager *upload; + AppManager *apps; +}; + +#endif // APPFETCHMANAGER_H diff --git a/daemon/bankmanager.cpp b/daemon/bankmanager.cpp index 797d7e3..3df83e4 100644 --- a/daemon/bankmanager.cpp +++ b/daemon/bankmanager.cpp @@ -93,7 +93,7 @@ bool BankManager::uploadApp(const QUuid &uuid, int slot) _slots[slot].name.clear(); _slots[slot].uuid = QUuid(); - upload->uploadAppBinary(slot, binaryFile.data(), info.crcFile(AppInfo::APPLICATION), + upload->uploadAppBinaryInSlot(slot, binaryFile.data(), info.crcFile(AppInfo::APPLICATION), [this, info, binaryFile, slot]() { qCDebug(l) << "app binary upload succesful"; binaryFile->close(); @@ -102,7 +102,7 @@ bool BankManager::uploadApp(const QUuid &uuid, int slot) if (info.type() == "worker") { QSharedPointer<QIODevice> workerFile(info.openFile(AppInfo::WORKER)); if (workerFile) { - upload->uploadAppWorker(slot, workerFile.data(), info.crcFile(AppInfo::WORKER), + upload->uploadAppWorkerInSlot(slot, workerFile.data(), info.crcFile(AppInfo::WORKER), [this, workerFile, slot]() { qCDebug(l) << "app worker upload succesful"; workerFile->close(); @@ -116,7 +116,7 @@ bool BankManager::uploadApp(const QUuid &uuid, int slot) // Proceed to upload the resource file QSharedPointer<QIODevice> resourceFile(info.openFile(AppInfo::RESOURCES)); if (resourceFile) { - upload->uploadAppResources(slot, resourceFile.data(), info.crcFile(AppInfo::RESOURCES), + upload->uploadAppResourcesInSlot(slot, resourceFile.data(), info.crcFile(AppInfo::RESOURCES), [this, resourceFile, slot]() { qCDebug(l) << "app resources upload succesful"; resourceFile->close(); diff --git a/daemon/daemon.pro b/daemon/daemon.pro index 47be329..0414e00 100644 --- a/daemon/daemon.pro +++ b/daemon/daemon.pro @@ -29,6 +29,7 @@ SOURCES += \ bankmanager.cpp \ uploadmanager.cpp \ bundle.cpp \ + appfetchmanager.cc \ timelineitem.cpp HEADERS += \ @@ -50,6 +51,7 @@ HEADERS += \ bankmanager.h \ uploadmanager.h \ bundle.h \ + appfetchmanager.h \ timelineitem.h DBUS_ADAPTORS += ../org.pebbled.Watch.xml diff --git a/daemon/manager.cpp b/daemon/manager.cpp index 55138d9..0b365c3 100644 --- a/daemon/manager.cpp +++ b/daemon/manager.cpp @@ -13,6 +13,7 @@ Manager::Manager(Settings *settings, QObject *parent) : upload(new UploadManager(watch, this)),
apps(new AppManager(this)),
bank(new BankManager(watch, upload, apps, this)),
+ fetch(new AppFetchManager(watch, upload, apps, this)), voice(new VoiceCallManager(settings, this)),
notifications(new NotificationManager(settings, this)),
music(new MusicManager(watch, settings, this)),
diff --git a/daemon/manager.h b/daemon/manager.h index 7c9db3c..e3bdb4e 100644 --- a/daemon/manager.h +++ b/daemon/manager.h @@ -11,6 +11,7 @@ #include "jskitmanager.h"
#include "appmanager.h"
#include "bankmanager.h"
+#include "appfetchmanager.h" #include "settings.h"
#include <QObject>
@@ -41,6 +42,7 @@ class Manager : public QObject, protected QDBusContext UploadManager *upload;
AppManager *apps;
BankManager *bank;
+ AppFetchManager *fetch; VoiceCallManager *voice;
NotificationManager *notifications;
MusicManager *music;
diff --git a/daemon/uploadmanager.cpp b/daemon/uploadmanager.cpp index cfca8e5..3501485 100644 --- a/daemon/uploadmanager.cpp +++ b/daemon/uploadmanager.cpp @@ -57,19 +57,40 @@ uint UploadManager::upload(WatchConnector::UploadType type, int index, const QSt return upload.id; } -uint UploadManager::uploadAppBinary(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) +uint UploadManager::uploadAppBinaryInSlot(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(WatchConnector::uploadBINARY, slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); + return upload(WatchConnector::uploadBINARY, + slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); } -uint UploadManager::uploadAppResources(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) +uint UploadManager::uploadAppResourcesInSlot(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(WatchConnector::uploadRESOURCES, slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); + return upload(WatchConnector::uploadRESOURCES, + slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); } -uint UploadManager::uploadAppWorker(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) +uint UploadManager::uploadAppWorkerInSlot(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(WatchConnector::uploadWORKER, slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); + return upload(WatchConnector::uploadWORKER, + slot, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); +} + +uint UploadManager::uploadAppBinaryId(int id, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) +{ + return upload(WatchConnector::UploadType(WatchConnector::uploadBINARY | WatchConnector::uploadAPP_ID_FLAG), + id, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); +} + +uint UploadManager::uploadAppResourcesId(int id, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) +{ + return upload(WatchConnector::UploadType(WatchConnector::uploadRESOURCES | WatchConnector::uploadAPP_ID_FLAG), + id, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); +} + +uint UploadManager::uploadAppWorkerId(int id, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) +{ + return upload(WatchConnector::UploadType(WatchConnector::uploadWORKER | WatchConnector::uploadAPP_ID_FLAG), + id, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); } uint UploadManager::uploadFile(const QString &filename, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) @@ -80,12 +101,14 @@ uint UploadManager::uploadFile(const QString &filename, QIODevice *device, quint uint UploadManager::uploadFirmwareBinary(bool recovery, QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(recovery ? WatchConnector::uploadRECOVERY : WatchConnector::uploadFIRMWARE, 0, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); + return upload(recovery ? WatchConnector::uploadRECOVERY : WatchConnector::uploadFIRMWARE, + 0, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); } uint UploadManager::uploadFirmwareResources(QIODevice *device, quint32 crc, SuccessCallback successCallback, ErrorCallback errorCallback, ProgressCallback progressCallback) { - return upload(WatchConnector::uploadSYS_RESOURCES, 0, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); + return upload(WatchConnector::uploadSYS_RESOURCES, + 0, QString(), device, -1, crc, successCallback, errorCallback, progressCallback); } void UploadManager::cancel(uint id, int code) @@ -146,9 +169,13 @@ void UploadManager::startNextUpload() p.write<quint8>(WatchConnector::putbytesINIT); p.write<quint32>(upload.remaining); p.write<quint8>(upload.type); - p.write<quint8>(upload.index); - if (!upload.filename.isEmpty()) { - p.writeCString(upload.filename); + if (upload.type & WatchConnector::uploadAPP_ID_FLAG) { + p.write<qint32>(upload.index); + } else { + p.write<quint8>(upload.index); + if (!upload.filename.isEmpty()) { + p.writeCString(upload.filename); + } } qCDebug(l).nospace() << "starting new upload " << upload.id diff --git a/daemon/uploadmanager.h b/daemon/uploadmanager.h index 85c5b3b..3fd59d9 100644 --- a/daemon/uploadmanager.h +++ b/daemon/uploadmanager.h @@ -20,9 +20,12 @@ public: 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 uploadAppBinaryInSlot(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadAppResourcesInSlot(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadAppWorkerInSlot(int slot, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadAppBinaryId(int id, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadAppResourcesId(int id, QIODevice *device, quint32 crc, SuccessCallback successCallback = SuccessCallback(), ErrorCallback errorCallback = ErrorCallback(), ProgressCallback progressCallback = ProgressCallback()); + uint uploadAppWorkerId(int id, 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()); @@ -47,7 +50,7 @@ private: uint id; WatchConnector::UploadType type; - int index; + int index; // Used both as the slot number, or the AppID, depending on type QString filename; QIODevice *device; int size; diff --git a/daemon/watchconnector.cpp b/daemon/watchconnector.cpp index 3e72a58..8411115 100644 --- a/daemon/watchconnector.cpp +++ b/daemon/watchconnector.cpp @@ -13,7 +13,7 @@ #include "timelineitem.h" static const int RECONNECT_TIMEOUT = 500; //ms -static const bool PROTOCOL_DEBUG = false; +static const bool PROTOCOL_DEBUG = true; QDebug operator<< (QDebug d, const WatchConnector::SoftwareVersion &ver) { QDebugStateSaver save(d); diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h index cea5993..3ce2e74 100644 --- a/daemon/watchconnector.h +++ b/daemon/watchconnector.h @@ -105,6 +105,15 @@ public: appmgrREFRESH_APP = 3,
appmgrGET_APPBANK_UUIDS = 5
};
+ enum AppFetchMessage { + appfetchREQUEST = 1 + }; + enum AppFetchStatus { + appfetchSTART = 1, + appfetchBUSY = 2, + appfetchINVALID_UUID = 3, + appfetchNO_DATA = 4 + }; enum AppMessage {
appmsgPUSH = 1,
appmsgREQUEST = 2,
@@ -160,7 +169,8 @@ public: uploadRESOURCES = 4,
uploadBINARY = 5,
uploadFILE = 6,
- uploadWORKER = 7
+ uploadWORKER = 7, + uploadAPP_ID_FLAG = (1 << 7) };
enum PutBytesCommand {
putbytesINIT = 1,
|
