From 3a4e80053081ab7f5de142bfbc6589dfc2bc6e2d Mon Sep 17 00:00:00 2001 From: Javier Date: Sat, 2 Jan 2016 05:10:03 +0100 Subject: implement blobdbmanager Conflicts: daemon/daemon.pro daemon/manager.h daemon/watchconnector.h --- daemon/blobdbmanager.cc | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ daemon/blobdbmanager.h | 48 ++++++++++++++++++++++++ daemon/daemon.pro | 2 + daemon/manager.h | 2 + daemon/watchconnector.h | 18 +++++++++ 5 files changed, 169 insertions(+) create mode 100644 daemon/blobdbmanager.cc create mode 100644 daemon/blobdbmanager.h 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(WatchConnector::blobdbINSERT); + p.writeLE(transfer.cookie); + p.writeLE(db); + + p.writeLE(16); + p.writeUuid(key); + + p.writeLE(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(WatchConnector::blobdbINSERT); + p.writeLE(transfer.cookie); + p.writeLE(db); + + p.writeLE(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(WatchConnector::blobdbINSERT); + p.writeLE(transfer.cookie); + p.writeLE(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(); + quint8 status = u.readLE(); + + 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 +#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 SuccessCallback; + typedef std::function 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 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, -- cgit v1.2.3