~mzanetti/+junk/upebble

« back to all changes in this revision

Viewing changes to upebbled/libpebble/blobdb.cpp

  • Committer: Michael Zanetti
  • Date: 2015-12-06 23:17:41 UTC
  • Revision ID: michael.zanetti@canonical.com-20151206231741-w0n1tdybvilxy0o3
create BlobDB class

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "blobdb.h"
 
2
#include "watchconnection.h"
 
3
#include "pebble.h"
 
4
 
 
5
#include <QDebug>
 
6
 
 
7
BlobDB::BlobDB(Pebble *pebble, WatchConnection *connection):
 
8
    QObject(pebble),
 
9
    m_pebble(pebble),
 
10
    m_connection(connection)
 
11
{
 
12
 
 
13
}
 
14
 
 
15
void BlobDB::insertNotification(const QString &sender, const QString &subject, const QString &data)
 
16
{
 
17
    QUuid itemUuid = QUuid::createUuid();
 
18
    TimelineItem timelineItem(itemUuid, TimelineItem::TypeNotification);
 
19
    timelineItem.setFlags(TimelineItem::FlagSingleEvent);
 
20
 
 
21
    TimelineAttribute titleAttribute(TimelineAttribute::TypeTitle, sender.left(64).toUtf8());
 
22
    timelineItem.appendAttribute(titleAttribute);
 
23
 
 
24
    TimelineAttribute subjectAttribute(TimelineAttribute::TypeSubtitle, subject.left(64).toUtf8());
 
25
    timelineItem.appendAttribute(subjectAttribute);
 
26
 
 
27
    TimelineAttribute bodyAttribute(TimelineAttribute::TypeBody, data.left(64).toUtf8());
 
28
    timelineItem.appendAttribute(bodyAttribute);
 
29
 
 
30
    // Haven't decrypted this yet. Copied from sailfish...
 
31
    QByteArray blubb;
 
32
    static quint16 bla = 1;
 
33
    blubb.append(bla & 0xFF); blubb.append((bla >> 8) & 0xFF); blubb.append('\0'); blubb.append('\0'); // content
 
34
    bla++;
 
35
    TimelineAttribute sourceAttribute(TimelineAttribute::TypeTinyIcon, blubb);
 
36
    timelineItem.appendAttribute(sourceAttribute);
 
37
 
 
38
    TimelineAction dismissAction(0, TimelineAction::TypeDismiss);
 
39
    TimelineAttribute dismissAttribute(TimelineAttribute::TypeTitle, "Dismiss");
 
40
    dismissAction.appendAttribute(dismissAttribute);
 
41
    timelineItem.appendAction(dismissAction);
 
42
 
 
43
    TimelineAction dismiss1Action(1, TimelineAction::TypeSnooze);
 
44
    TimelineAttribute dismiss1Attribute(TimelineAttribute::TypeTitle, "Blubb");
 
45
    dismiss1Action.appendAttribute(dismiss1Attribute);
 
46
    timelineItem.appendAction(dismiss1Action);
 
47
 
 
48
    insert(BlobDB::BlobDBIdNotification, timelineItem);
 
49
}
 
50
 
 
51
void BlobDB::insertTimelinePin(TimelineItem::Layout layout)
 
52
{
 
53
    TimelineItem item(TimelineItem::TypePin, TimelineItem::FlagSingleEvent, QDateTime::currentDateTime().addMSecs(1000 * 60 * 2), 60);
 
54
    item.setLayout(layout);
 
55
 
 
56
    TimelineAttribute titleAttribute(TimelineAttribute::TypeTitle, "PinTitlex");
 
57
    item.appendAttribute(titleAttribute);
 
58
 
 
59
    TimelineAttribute subjectAttribute(TimelineAttribute::TypeSubtitle, "PinSubtitle");
 
60
    item.appendAttribute(subjectAttribute);
 
61
 
 
62
    TimelineAttribute bodyAttribute(TimelineAttribute::TypeBody, "PinBody");
 
63
    item.appendAttribute(bodyAttribute);
 
64
 
 
65
//    TimelineAttribute t1Attribute(TimelineAttribute::TypeTinyIcon, "T1");
 
66
//    item.appendAttribute(t1Attribute);
 
67
 
 
68
    QByteArray color;
 
69
    color.append('\0'); color.append('\0'); color.append('\0'); color.append(0xff);
 
70
    TimelineAttribute t2Attribute(TimelineAttribute::TypeGuess2, color);
 
71
    item.appendAttribute(t2Attribute);
 
72
 
 
73
//    TimelineAttribute t3Attribute(TimelineAttribute::TypeGuess2, "T3");
 
74
//    item.appendAttribute(t3Attribute);
 
75
 
 
76
    TimelineAction dismissAction(0, TimelineAction::TypeDismiss);
 
77
    TimelineAttribute dismissAttribute(TimelineAttribute::TypeTitle, "Dismiss");
 
78
    dismissAction.appendAttribute(dismissAttribute);
 
79
    item.appendAction(dismissAction);
 
80
 
 
81
    insert(BlobDB::BlobDBIdPin, item);
 
82
}
 
83
 
 
84
void BlobDB::insertReminder()
 
85
{
 
86
 
 
87
    TimelineItem item(TimelineItem::TypeReminder, TimelineItem::FlagSingleEvent, QDateTime::currentDateTime().addMSecs(1000 * 60 * 2), 0);
 
88
 
 
89
    TimelineAttribute titleAttribute(TimelineAttribute::TypeTitle, "ReminderTitle");
 
90
    item.appendAttribute(titleAttribute);
 
91
 
 
92
    TimelineAttribute subjectAttribute(TimelineAttribute::TypeSubtitle, "ReminderSubtitle");
 
93
    item.appendAttribute(subjectAttribute);
 
94
 
 
95
    TimelineAttribute bodyAttribute(TimelineAttribute::TypeBody, "ReminderBody");
 
96
    item.appendAttribute(bodyAttribute);
 
97
 
 
98
    //    TimelineAttribute guessAttribute(TimelineAttribute::TypeGuess, "ReminderGuess");
 
99
    //    item.appendAttribute(guessAttribute);
 
100
 
 
101
    TimelineAction dismissAction(0, TimelineAction::TypeDismiss);
 
102
    TimelineAttribute dismissAttribute(TimelineAttribute::TypeTitle, "Dismiss");
 
103
    dismissAction.appendAttribute(dismissAttribute);
 
104
    item.appendAction(dismissAction);
 
105
 
 
106
    insert(BlobDB::BlobDBIdReminder, item);
 
107
    //    qDebug() << "adding timeline item" << ddd.toHex();
 
108
 
 
109
}
 
110
 
 
111
void BlobDB::insert(BlobDBId database, TimelineItem item)
 
112
{
 
113
    BlobCommand cmd;
 
114
    cmd.m_command = BlobDB::OperationInsert;
 
115
    cmd.m_token = generateToken();
 
116
    cmd.m_database = database;
 
117
 
 
118
    cmd.m_key = item.itemId().toRfc4122();
 
119
    cmd.m_value = item.serialize();
 
120
 
 
121
    m_connection->writeToPebble(WatchConnection::EndpointBlobDB, cmd.serialize());
 
122
}
 
123
 
 
124
void BlobDB::clear(BlobDB::BlobDBId database)
 
125
{
 
126
    BlobCommand cmd;
 
127
    cmd.m_command = BlobDB::OperationClear;
 
128
    cmd.m_token = generateToken();
 
129
    cmd.m_database = database;
 
130
 
 
131
    m_connection->writeToPebble(WatchConnection::EndpointBlobDB, cmd.serialize());
 
132
}
 
133
 
 
134
quint16 BlobDB::generateToken()
 
135
{
 
136
    return (qrand() % ((int)pow(2, 16) - 2)) + 1;
 
137
}
 
138
 
 
139
 
 
140
QByteArray BlobCommand::serialize() const
 
141
{
 
142
    QByteArray ret;
 
143
    ret.append((quint8)m_command);
 
144
    ret.append(m_token & 0xFF); ret.append(((m_token >> 8) & 0xFF));
 
145
    ret.append((quint8)m_database);
 
146
 
 
147
    if (m_command == BlobDB::OperationInsert || m_command == BlobDB::OperationDelete) {
 
148
        ret.append(m_key.length() & 0xFF);
 
149
        ret.append(m_key);
 
150
    }
 
151
    if (m_command == BlobDB::OperationInsert) {
 
152
        ret.append(m_value.length() & 0xFF); ret.append((m_value.length() >> 8) & 0xFF); // value length
 
153
        ret.append(m_value);
 
154
    }
 
155
 
 
156
    return ret;
 
157
}
 
158
 
 
159
TimelineItem::TimelineItem(TimelineItem::Type type, Flags flags, const QDateTime &timestamp, quint16 duration):
 
160
    TimelineItem(QUuid::createUuid(), type, flags, timestamp, duration)
 
161
{
 
162
 
 
163
}
 
164
 
 
165
TimelineItem::TimelineItem(const QUuid &uuid, TimelineItem::Type type, Flags flags, const QDateTime &timestamp, quint16 duration):
 
166
    PebblePacket(),
 
167
    m_itemId(uuid),
 
168
    m_timestamp(timestamp),
 
169
    m_duration(duration),
 
170
    m_type(type),
 
171
    m_flags(flags)
 
172
{
 
173
 
 
174
}
 
175
 
 
176
QUuid TimelineItem::itemId() const
 
177
{
 
178
    return m_itemId;
 
179
}
 
180
 
 
181
void TimelineItem::setLayout(quint8 layout)
 
182
{
 
183
    m_layout = layout;
 
184
}
 
185
 
 
186
void TimelineItem::setFlags(Flags flags)
 
187
{
 
188
    m_flags = flags;
 
189
}
 
190
 
 
191
void TimelineItem::appendAttribute(const TimelineAttribute &attribute)
 
192
{
 
193
    m_attributes.append(attribute);
 
194
}
 
195
 
 
196
void TimelineItem::appendAction(const TimelineAction &action)
 
197
{
 
198
    m_actions.append(action);
 
199
}
 
200
 
 
201
QByteArray TimelineItem::serialize() const
 
202
{
 
203
    QByteArray ret;
 
204
    ret.append(m_itemId.toRfc4122());
 
205
    ret.append(m_parentId.toRfc4122());
 
206
    int ts = m_timestamp.toMSecsSinceEpoch() / 1000;
 
207
    ret.append(ts & 0xFF); ret.append((ts >> 8) & 0xFF); ret.append((ts >> 16) & 0xFF); ret.append((ts >> 24) & 0xFF);
 
208
    ret.append(m_duration & 0xFF); ret.append(((m_duration >> 8) & 0xFF));
 
209
    ret.append((quint8)m_type);
 
210
    ret.append(m_flags & 0xFF); ret.append(((m_flags >> 8) & 0xFF));
 
211
    ret.append(m_layout);
 
212
 
 
213
    QByteArray serializedAttributes;
 
214
    foreach (const TimelineAttribute &attribute, m_attributes) {
 
215
        serializedAttributes.append(attribute.serialize());
 
216
    }
 
217
 
 
218
    QByteArray serializedActions;
 
219
    foreach (const TimelineAction &action, m_actions) {
 
220
        serializedActions.append(action.serialize());
 
221
    }
 
222
    quint16 dataLength = serializedAttributes.length() + serializedActions.length();
 
223
    ret.append(dataLength & 0xFF); ret.append(((dataLength >> 8) & 0xFF));
 
224
    ret.append(m_attributes.count());
 
225
    ret.append(m_actions.count());
 
226
    ret.append(serializedAttributes);
 
227
    ret.append(serializedActions);
 
228
    return ret;
 
229
}
 
230
 
 
231
TimelineAction::TimelineAction(quint8 actionId, TimelineAction::Type type, const QList<TimelineAttribute> &attributes):
 
232
    PebblePacket(),
 
233
    m_actionId(actionId),
 
234
    m_type(type),
 
235
    m_attributes(attributes)
 
236
{
 
237
 
 
238
}
 
239
 
 
240
void TimelineAction::appendAttribute(const TimelineAttribute &attribute)
 
241
{
 
242
    m_attributes.append(attribute);
 
243
}
 
244
 
 
245
QByteArray TimelineAttribute::serialize() const
 
246
{
 
247
    QByteArray ret;
 
248
    ret.append((quint8)m_type);
 
249
    ret.append(m_content.length() & 0xFF); ret.append(((m_content.length() >> 8) & 0xFF)); // length
 
250
    ret.append(m_content);
 
251
    return ret;
 
252
}