summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/blobdbmanager.cc99
-rw-r--r--daemon/blobdbmanager.h48
-rw-r--r--daemon/daemon.pro2
-rw-r--r--daemon/manager.h2
-rw-r--r--daemon/watchconnector.h18
5 files changed, 169 insertions, 0 deletions
diff --git a/daemon/blobdbmanager.cc b/daemon/blobdbmanager.cc
new file mode 100644
index 0000000..f7a33dd
--- /dev/null
+++ b/daemon/blobdbmanager.cc
@@ -0,0 +1,99 @@
+#include "blobdbmanager.h"
+#include "unpacker.h"
+#include "packer.h"
+
+BlobDbManager::BlobDbManager(WatchConnector *watch, QObject *parent) :
+ QObject(parent), l(metaObject()->className()), watch(watch),
+ lastCookie(0)
+{
+ watch->setEndpointHandler(WatchConnector::watchBLOB_DB,
+ [this](const QByteArray &msg) {
+ handleMessage(msg);
+ return true;
+ });
+}
+
+void BlobDbManager::insert(BlobDatabase db, const QUuid &key, const QByteArray &data, const SuccessCallback &successCallback, const ErrorCallback &errorCallback)
+{
+ QByteArray msg;
+ Packer p(&msg);
+ PendingTransfer transfer;
+ transfer.cookie = ++lastCookie;
+ transfer.successCallback = successCallback;
+ transfer.errorCallback = errorCallback;
+
+ p.writeLE<quint8>(WatchConnector::blobdbINSERT);
+ p.writeLE<quint16>(transfer.cookie);
+ p.writeLE<quint8>(db);
+
+ p.writeLE<quint8>(16);
+ p.writeUuid(key);
+
+ p.writeLE<quint16>(data.size());
+ msg.append(data);
+
+ pending.insert(transfer.cookie, transfer);
+ watch->sendMessage(WatchConnector::watchBLOB_DB, msg);
+}
+
+void BlobDbManager::remove(BlobDatabase db, const QUuid &key, const SuccessCallback &successCallback, const ErrorCallback &errorCallback)
+{
+ QByteArray msg;
+ Packer p(&msg);
+ PendingTransfer transfer;
+ transfer.cookie = ++lastCookie;
+ transfer.successCallback = successCallback;
+ transfer.errorCallback = errorCallback;
+
+ p.writeLE<quint8>(WatchConnector::blobdbINSERT);
+ p.writeLE<quint16>(transfer.cookie);
+ p.writeLE<quint8>(db);
+
+ p.writeLE<quint8>(16);
+ p.writeUuid(key);
+
+ pending.insert(transfer.cookie, transfer);
+ watch->sendMessage(WatchConnector::watchBLOB_DB, msg);
+}
+
+void BlobDbManager::clear(BlobDatabase db, const SuccessCallback &successCallback, const ErrorCallback &errorCallback)
+{
+ QByteArray msg;
+ Packer p(&msg);
+ PendingTransfer transfer;
+ transfer.cookie = ++lastCookie;
+ transfer.successCallback = successCallback;
+ transfer.errorCallback = errorCallback;
+
+ p.writeLE<quint8>(WatchConnector::blobdbINSERT);
+ p.writeLE<quint16>(transfer.cookie);
+ p.writeLE<quint8>(db);
+
+ pending.insert(transfer.cookie, transfer);
+ watch->sendMessage(WatchConnector::watchBLOB_DB, msg);
+}
+
+void BlobDbManager::handleMessage(const QByteArray &msg)
+{
+ Unpacker u(msg);
+ Cookie cookie = u.readLE<quint16>();
+ quint8 status = u.readLE<quint8>();
+
+ PendingTransfer transfer = pending.take(cookie);
+ if (transfer.cookie != cookie) {
+ qCWarning(l) << "received a message for a cookie we don't know" << cookie;
+ return;
+ }
+
+ if (status == 0 || status == WatchConnector::blobdbSUCCESS) {
+ qCDebug(l) << "success on cookie" << cookie;
+ if (transfer.successCallback) {
+ transfer.successCallback();
+ }
+ } else {
+ qCWarning(l) << "failure on cookie" << cookie << "with status" << status;
+ if (transfer.errorCallback) {
+ transfer.errorCallback(WatchConnector::BlobDbStatus(status));
+ }
+ }
+}
diff --git a/daemon/blobdbmanager.h b/daemon/blobdbmanager.h
new file mode 100644
index 0000000..26f2ca6
--- /dev/null
+++ b/daemon/blobdbmanager.h
@@ -0,0 +1,48 @@
+#ifndef BLOBDBMANAGER_H
+#define BLOBDBMANAGER_H
+
+#include <functional>
+#include "watchconnector.h"
+
+class BlobDbManager : public QObject
+{
+ Q_OBJECT
+public:
+ explicit BlobDbManager(WatchConnector *watch, QObject *parent = 0);
+
+ enum BlobDatabase {
+ BlobDbTest = 0,
+ BlobDbPin = 1,
+ BlobDbApp = 2,
+ BlobDbReminder = 3,
+ BlobDbNotification = 4
+ };
+
+ typedef std::function<void()> SuccessCallback;
+ typedef std::function<void(WatchConnector::BlobDbStatus)> ErrorCallback;
+
+ void insert(BlobDatabase db, const QUuid &key, const QByteArray &data, const SuccessCallback &successCallback = SuccessCallback(), const ErrorCallback &errorCallback = ErrorCallback());
+ void remove(BlobDatabase db, const QUuid &key, const SuccessCallback &successCallback = SuccessCallback(), const ErrorCallback &errorCallback = ErrorCallback());
+ void clear(BlobDatabase db, const SuccessCallback &successCallback = SuccessCallback(), const ErrorCallback &errorCallback = ErrorCallback());
+
+private:
+ typedef quint16 Cookie;
+
+ struct PendingTransfer {
+ Cookie cookie;
+ SuccessCallback successCallback;
+ ErrorCallback errorCallback;
+ };
+
+private:
+ void handleMessage(const QByteArray &msg);
+
+private:
+ QLoggingCategory l;
+ WatchConnector *watch;
+
+ QHash<Cookie, PendingTransfer> pending;
+ Cookie lastCookie;
+};
+
+#endif // BLOBDBMANAGER_H
diff --git a/daemon/daemon.pro b/daemon/daemon.pro
index 0414e00..9bfb6d0 100644
--- a/daemon/daemon.pro
+++ b/daemon/daemon.pro
@@ -30,6 +30,7 @@ SOURCES += \
uploadmanager.cpp \
bundle.cpp \
appfetchmanager.cc \
+ blobdbmanager.cc \
timelineitem.cpp
HEADERS += \
@@ -52,6 +53,7 @@ HEADERS += \
uploadmanager.h \
bundle.h \
appfetchmanager.h \
+ blobdbmanager.h \
timelineitem.h
DBUS_ADAPTORS += ../org.pebbled.Watch.xml
diff --git a/daemon/manager.h b/daemon/manager.h
index e3bdb4e..5d3b494 100644
--- a/daemon/manager.h
+++ b/daemon/manager.h
@@ -10,6 +10,7 @@
#include "appmsgmanager.h"
#include "jskitmanager.h"
#include "appmanager.h"
+#include "blobdbmanager.h"
#include "bankmanager.h"
#include "appfetchmanager.h"
#include "settings.h"
@@ -41,6 +42,7 @@ class Manager : public QObject, protected QDBusContext
WatchConnector *watch;
UploadManager *upload;
AppManager *apps;
+ BlobDbManager *blobdb;
BankManager *bank;
AppFetchManager *fetch;
VoiceCallManager *voice;
diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h
index 3ce2e74..011d2ab 100644
--- a/daemon/watchconnector.h
+++ b/daemon/watchconnector.h
@@ -171,6 +171,24 @@ public:
uploadFILE = 6,
uploadWORKER = 7,
uploadAPP_ID_FLAG = (1 << 7)
+
+ uploadWORKER = 7,
+ uploadAPP_ID_FLAG = (1 << 7)
+ };
+ enum BlobDbCommand {
+ blobdbINSERT = 1,
+ blobdbDELETE = 4,
+ blobdbCLEAR = 5
+ };
+ enum BlobDbStatus {
+ blobdbSUCCESS = 1,
+ blobdbFAILURE = 2,
+ blobdbINVALID_OPERATION = 3,
+ blobdbINVALID_DATABASE_ID = 4,
+ blobdbINVALID_DATA = 5,
+ blobdbKEY_DOES_NOT_EXIST = 6,
+ blobdbDATABASE_FULL = 7,
+ blobdbDATA_STALE = 8
};
enum PutBytesCommand {
putbytesINIT = 1,