summaryrefslogtreecommitdiff
path: root/daemon/blobdbmanager.cc
blob: f7a33dde439ab8ac15256d89bd43c1bd4a281f41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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));
        }
    }
}