summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/appfetchmanager.cc106
-rw-r--r--daemon/appfetchmanager.h34
-rw-r--r--daemon/bankmanager.cpp6
-rw-r--r--daemon/daemon.pro2
-rw-r--r--daemon/manager.cpp1
-rw-r--r--daemon/manager.h2
-rw-r--r--daemon/uploadmanager.cpp49
-rw-r--r--daemon/uploadmanager.h11
-rw-r--r--daemon/watchconnector.cpp2
-rw-r--r--daemon/watchconnector.h12
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,