2
#include "watchconnection.h"
7
BlobDB::BlobDB(Pebble *pebble, WatchConnection *connection):
10
m_connection(connection)
15
void BlobDB::insertNotification(const QString &sender, const QString &subject, const QString &data)
17
QUuid itemUuid = QUuid::createUuid();
18
TimelineItem timelineItem(itemUuid, TimelineItem::TypeNotification);
19
timelineItem.setFlags(TimelineItem::FlagSingleEvent);
21
TimelineAttribute titleAttribute(TimelineAttribute::TypeTitle, sender.left(64).toUtf8());
22
timelineItem.appendAttribute(titleAttribute);
24
TimelineAttribute subjectAttribute(TimelineAttribute::TypeSubtitle, subject.left(64).toUtf8());
25
timelineItem.appendAttribute(subjectAttribute);
27
TimelineAttribute bodyAttribute(TimelineAttribute::TypeBody, data.left(64).toUtf8());
28
timelineItem.appendAttribute(bodyAttribute);
30
// Haven't decrypted this yet. Copied from sailfish...
32
static quint16 bla = 1;
33
blubb.append(bla & 0xFF); blubb.append((bla >> 8) & 0xFF); blubb.append('\0'); blubb.append('\0'); // content
35
TimelineAttribute sourceAttribute(TimelineAttribute::TypeTinyIcon, blubb);
36
timelineItem.appendAttribute(sourceAttribute);
38
TimelineAction dismissAction(0, TimelineAction::TypeDismiss);
39
TimelineAttribute dismissAttribute(TimelineAttribute::TypeTitle, "Dismiss");
40
dismissAction.appendAttribute(dismissAttribute);
41
timelineItem.appendAction(dismissAction);
43
TimelineAction dismiss1Action(1, TimelineAction::TypeSnooze);
44
TimelineAttribute dismiss1Attribute(TimelineAttribute::TypeTitle, "Blubb");
45
dismiss1Action.appendAttribute(dismiss1Attribute);
46
timelineItem.appendAction(dismiss1Action);
48
insert(BlobDB::BlobDBIdNotification, timelineItem);
51
void BlobDB::insertTimelinePin(TimelineItem::Layout layout)
53
TimelineItem item(TimelineItem::TypePin, TimelineItem::FlagSingleEvent, QDateTime::currentDateTime().addMSecs(1000 * 60 * 2), 60);
54
item.setLayout(layout);
56
TimelineAttribute titleAttribute(TimelineAttribute::TypeTitle, "PinTitlex");
57
item.appendAttribute(titleAttribute);
59
TimelineAttribute subjectAttribute(TimelineAttribute::TypeSubtitle, "PinSubtitle");
60
item.appendAttribute(subjectAttribute);
62
TimelineAttribute bodyAttribute(TimelineAttribute::TypeBody, "PinBody");
63
item.appendAttribute(bodyAttribute);
65
// TimelineAttribute t1Attribute(TimelineAttribute::TypeTinyIcon, "T1");
66
// item.appendAttribute(t1Attribute);
69
color.append('\0'); color.append('\0'); color.append('\0'); color.append(0xff);
70
TimelineAttribute t2Attribute(TimelineAttribute::TypeGuess2, color);
71
item.appendAttribute(t2Attribute);
73
// TimelineAttribute t3Attribute(TimelineAttribute::TypeGuess2, "T3");
74
// item.appendAttribute(t3Attribute);
76
TimelineAction dismissAction(0, TimelineAction::TypeDismiss);
77
TimelineAttribute dismissAttribute(TimelineAttribute::TypeTitle, "Dismiss");
78
dismissAction.appendAttribute(dismissAttribute);
79
item.appendAction(dismissAction);
81
insert(BlobDB::BlobDBIdPin, item);
84
void BlobDB::insertReminder()
87
TimelineItem item(TimelineItem::TypeReminder, TimelineItem::FlagSingleEvent, QDateTime::currentDateTime().addMSecs(1000 * 60 * 2), 0);
89
TimelineAttribute titleAttribute(TimelineAttribute::TypeTitle, "ReminderTitle");
90
item.appendAttribute(titleAttribute);
92
TimelineAttribute subjectAttribute(TimelineAttribute::TypeSubtitle, "ReminderSubtitle");
93
item.appendAttribute(subjectAttribute);
95
TimelineAttribute bodyAttribute(TimelineAttribute::TypeBody, "ReminderBody");
96
item.appendAttribute(bodyAttribute);
98
// TimelineAttribute guessAttribute(TimelineAttribute::TypeGuess, "ReminderGuess");
99
// item.appendAttribute(guessAttribute);
101
TimelineAction dismissAction(0, TimelineAction::TypeDismiss);
102
TimelineAttribute dismissAttribute(TimelineAttribute::TypeTitle, "Dismiss");
103
dismissAction.appendAttribute(dismissAttribute);
104
item.appendAction(dismissAction);
106
insert(BlobDB::BlobDBIdReminder, item);
107
// qDebug() << "adding timeline item" << ddd.toHex();
111
void BlobDB::insert(BlobDBId database, TimelineItem item)
114
cmd.m_command = BlobDB::OperationInsert;
115
cmd.m_token = generateToken();
116
cmd.m_database = database;
118
cmd.m_key = item.itemId().toRfc4122();
119
cmd.m_value = item.serialize();
121
m_connection->writeToPebble(WatchConnection::EndpointBlobDB, cmd.serialize());
124
void BlobDB::clear(BlobDB::BlobDBId database)
127
cmd.m_command = BlobDB::OperationClear;
128
cmd.m_token = generateToken();
129
cmd.m_database = database;
131
m_connection->writeToPebble(WatchConnection::EndpointBlobDB, cmd.serialize());
134
quint16 BlobDB::generateToken()
136
return (qrand() % ((int)pow(2, 16) - 2)) + 1;
140
QByteArray BlobCommand::serialize() const
143
ret.append((quint8)m_command);
144
ret.append(m_token & 0xFF); ret.append(((m_token >> 8) & 0xFF));
145
ret.append((quint8)m_database);
147
if (m_command == BlobDB::OperationInsert || m_command == BlobDB::OperationDelete) {
148
ret.append(m_key.length() & 0xFF);
151
if (m_command == BlobDB::OperationInsert) {
152
ret.append(m_value.length() & 0xFF); ret.append((m_value.length() >> 8) & 0xFF); // value length
159
TimelineItem::TimelineItem(TimelineItem::Type type, Flags flags, const QDateTime ×tamp, quint16 duration):
160
TimelineItem(QUuid::createUuid(), type, flags, timestamp, duration)
165
TimelineItem::TimelineItem(const QUuid &uuid, TimelineItem::Type type, Flags flags, const QDateTime ×tamp, quint16 duration):
168
m_timestamp(timestamp),
169
m_duration(duration),
176
QUuid TimelineItem::itemId() const
181
void TimelineItem::setLayout(quint8 layout)
186
void TimelineItem::setFlags(Flags flags)
191
void TimelineItem::appendAttribute(const TimelineAttribute &attribute)
193
m_attributes.append(attribute);
196
void TimelineItem::appendAction(const TimelineAction &action)
198
m_actions.append(action);
201
QByteArray TimelineItem::serialize() const
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);
213
QByteArray serializedAttributes;
214
foreach (const TimelineAttribute &attribute, m_attributes) {
215
serializedAttributes.append(attribute.serialize());
218
QByteArray serializedActions;
219
foreach (const TimelineAction &action, m_actions) {
220
serializedActions.append(action.serialize());
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);
231
TimelineAction::TimelineAction(quint8 actionId, TimelineAction::Type type, const QList<TimelineAttribute> &attributes):
233
m_actionId(actionId),
235
m_attributes(attributes)
240
void TimelineAction::appendAttribute(const TimelineAttribute &attribute)
242
m_attributes.append(attribute);
245
QByteArray TimelineAttribute::serialize() const
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);