summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/domain/folder.cpp9
-rw-r--r--common/domain/folder.fbs1
-rw-r--r--common/propertymapper.cpp20
-rw-r--r--examples/dummyresource/dummystore.cpp91
-rw-r--r--examples/dummyresource/dummystore.h17
-rw-r--r--examples/dummyresource/resourcefactory.cpp36
-rw-r--r--examples/dummyresource/resourcefactory.h2
7 files changed, 120 insertions, 56 deletions
diff --git a/common/domain/folder.cpp b/common/domain/folder.cpp
index 989d2c4..5558060 100644
--- a/common/domain/folder.cpp
+++ b/common/domain/folder.cpp
@@ -80,8 +80,9 @@ void TypeImplementation<Folder>::removeIndex(const QByteArray &identifier, const
80QSharedPointer<ReadPropertyMapper<TypeImplementation<Folder>::Buffer> > TypeImplementation<Folder>::initializeReadPropertyMapper() 80QSharedPointer<ReadPropertyMapper<TypeImplementation<Folder>::Buffer> > TypeImplementation<Folder>::initializeReadPropertyMapper()
81{ 81{
82 auto propertyMapper = QSharedPointer<ReadPropertyMapper<Buffer> >::create(); 82 auto propertyMapper = QSharedPointer<ReadPropertyMapper<Buffer> >::create();
83 propertyMapper->addMapping<QString, Buffer>("parent", &Buffer::parent); 83 propertyMapper->addMapping<QByteArray, Buffer>("parent", &Buffer::parent);
84 propertyMapper->addMapping<QString, Buffer>("name", &Buffer::name); 84 propertyMapper->addMapping<QString, Buffer>("name", &Buffer::name);
85 propertyMapper->addMapping<QByteArray, Buffer>("icon", &Buffer::icon);
85 return propertyMapper; 86 return propertyMapper;
86} 87}
87 88
@@ -89,12 +90,16 @@ QSharedPointer<WritePropertyMapper<TypeImplementation<Folder>::BufferBuilder> >
89{ 90{
90 auto propertyMapper = QSharedPointer<WritePropertyMapper<BufferBuilder> >::create(); 91 auto propertyMapper = QSharedPointer<WritePropertyMapper<BufferBuilder> >::create();
91 propertyMapper->addMapping("parent", [](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 92 propertyMapper->addMapping("parent", [](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
92 auto offset = variantToProperty<QString>(value, fbb); 93 auto offset = variantToProperty<QByteArray>(value, fbb);
93 return [offset](BufferBuilder &builder) { builder.add_parent(offset); }; 94 return [offset](BufferBuilder &builder) { builder.add_parent(offset); };
94 }); 95 });
95 propertyMapper->addMapping("name", [](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 96 propertyMapper->addMapping("name", [](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
96 auto offset = variantToProperty<QString>(value, fbb); 97 auto offset = variantToProperty<QString>(value, fbb);
97 return [offset](BufferBuilder &builder) { builder.add_name(offset); }; 98 return [offset](BufferBuilder &builder) { builder.add_name(offset); };
98 }); 99 });
100 propertyMapper->addMapping("icon", [](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
101 auto offset = variantToProperty<QByteArray>(value, fbb);
102 return [offset](BufferBuilder &builder) { builder.add_icon(offset); };
103 });
99 return propertyMapper; 104 return propertyMapper;
100} 105}
diff --git a/common/domain/folder.fbs b/common/domain/folder.fbs
index 3476d58..31dc32a 100644
--- a/common/domain/folder.fbs
+++ b/common/domain/folder.fbs
@@ -3,6 +3,7 @@ namespace Akonadi2.ApplicationDomain.Buffer;
3table Folder { 3table Folder {
4 name:string; 4 name:string;
5 parent:string; 5 parent:string;
6 icon:string;
6} 7}
7 8
8root_type Folder; 9root_type Folder;
diff --git a/common/propertymapper.cpp b/common/propertymapper.cpp
index 7ff072a..60f7dd5 100644
--- a/common/propertymapper.cpp
+++ b/common/propertymapper.cpp
@@ -29,6 +29,15 @@ flatbuffers::uoffset_t variantToProperty<QString>(const QVariant &property, flat
29} 29}
30 30
31template <> 31template <>
32flatbuffers::uoffset_t variantToProperty<QByteArray>(const QVariant &property, flatbuffers::FlatBufferBuilder &fbb)
33{
34 if (property.isValid()) {
35 return fbb.CreateString(property.toByteArray().toStdString()).o;
36 }
37 return 0;
38}
39
40template <>
32QVariant propertyToVariant<QString>(const flatbuffers::String *property) 41QVariant propertyToVariant<QString>(const flatbuffers::String *property)
33{ 42{
34 if (property) { 43 if (property) {
@@ -39,8 +48,17 @@ QVariant propertyToVariant<QString>(const flatbuffers::String *property)
39} 48}
40 49
41template <> 50template <>
51QVariant propertyToVariant<QByteArray>(const flatbuffers::String *property)
52{
53 if (property) {
54 //We have to copy the memory, otherwise it would become eventually invalid
55 return QString::fromStdString(property->c_str()).toUtf8();
56 }
57 return QVariant();
58}
59
60template <>
42QVariant propertyToVariant<bool>(uint8_t property) 61QVariant propertyToVariant<bool>(uint8_t property)
43{ 62{
44 return static_cast<bool>(property); 63 return static_cast<bool>(property);
45} 64}
46
diff --git a/examples/dummyresource/dummystore.cpp b/examples/dummyresource/dummystore.cpp
index 8592a30..e948475 100644
--- a/examples/dummyresource/dummystore.cpp
+++ b/examples/dummyresource/dummystore.cpp
@@ -19,6 +19,7 @@
19#include "dummystore.h" 19#include "dummystore.h"
20 20
21#include <QString> 21#include <QString>
22#include <QDateTime>
22 23
23static QMap<QString, QVariant> createEvent(int i) 24static QMap<QString, QVariant> createEvent(int i)
24{ 25{
@@ -29,67 +30,91 @@ static QMap<QString, QVariant> createEvent(int i)
29 return event; 30 return event;
30} 31}
31 32
32static QMap<QString, QVariant> createMail(int i) 33QMap<QString, QMap<QString, QVariant> > DummyStore::populateEvents()
33{ 34{
34 QMap<QString, QVariant> mail; 35 QMap<QString, QMap<QString, QVariant>> content;
35 mail.insert("subject", QString("subject%1").arg(i)); 36 for (int i = 0; i < 2; i++) {
36 return mail; 37 content.insert(QString("key%1").arg(i), createEvent(i));
38 }
39 return content;
37} 40}
38 41
39static QMap<QString, QVariant> createFolder(int i) 42static QByteArray addMail(QMap <QString, QMap<QString, QVariant> > &content, const QString &subject, const QDateTime &date, const QString &senderName, const QString &senderEmail, bool isUnread, bool isImportant, const QByteArray &parentFolder)
40{ 43{
41 QMap<QString, QVariant> folder; 44 static int id = 0;
42 folder.insert("name", QString("folder%1").arg(i)); 45 id++;
43 return folder; 46 const auto uid = QString("key%1").arg(id);
47 QMap<QString, QVariant> mail;
48 mail.insert("subject", subject);
49 mail.insert("date", date);
50 mail.insert("senderName", senderName);
51 mail.insert("senderEmail", senderEmail);
52 mail.insert("unread", isUnread);
53 mail.insert("important", isImportant);
54 mail.insert("parentFolder", parentFolder);
55 content.insert(uid, mail);
56 return uid.toUtf8();
44} 57}
45 58
46QMap<QString, QMap<QString, QVariant> > populateEvents() 59QMap<QString, QMap<QString, QVariant> > DummyStore::populateMails()
47{ 60{
48 QMap<QString, QMap<QString, QVariant>> content; 61 QMap<QString, QMap<QString, QVariant>> content;
49 for (int i = 0; i < 2; i++) { 62 for (const auto &parentFolder : mFolders.keys()) {
50 content.insert(QString("key%1").arg(i), createEvent(i)); 63 addMail(content, "Hello World!", QDateTime::currentDateTimeUtc(), "John Doe", "doe@example.com", true, false, parentFolder.toUtf8());
51 } 64 }
52 return content; 65 return content;
53} 66}
54 67
55QMap<QString, QMap<QString, QVariant> > populateMails() 68static QByteArray addFolder(QMap <QString, QMap<QString, QVariant> > &content, const QString &name, const QByteArray &icon, const QByteArray &parent = QByteArray())
56{ 69{
57 QMap<QString, QMap<QString, QVariant>> content; 70 static int id = 0;
58 for (int i = 0; i < 2; i++) { 71 id++;
59 content.insert(QString("key%1").arg(i), createMail(i)); 72 const auto uid = QString("key%1").arg(id);
73 QMap<QString, QVariant> folder;
74 folder.insert("name", name);
75 if (!parent.isEmpty()) {
76 folder.insert("parent", parent);
60 } 77 }
61 return content; 78 folder.insert("icon", icon);
79 content.insert(uid, folder);
80 return uid.toUtf8();
62} 81}
63 82
64QMap<QString, QMap<QString, QVariant> > populateFolders() 83QMap<QString, QMap<QString, QVariant> > DummyStore::populateFolders()
65{ 84{
66 QMap<QString, QMap<QString, QVariant>> content; 85 QMap<QString, QMap<QString, QVariant>> content;
67 int i = 0; 86 addFolder(content, "Inbox", "mail-folder-inbox");
68 for (i = 0; i < 5; i++) { 87 auto data = addFolder(content, "Data", "folder");
69 content.insert(QString("key%1").arg(i), createFolder(i)); 88 addFolder(content, "Sent", "mail-folder-sent");
89 addFolder(content, "Trash", "user-trash");
90 addFolder(content, "Drafts", "document-edit");
91 addFolder(content, "Stuff", "folder", data);
92 auto bulk = addFolder(content, "Bulk", "folder", data);
93 for (int i = 0; i < 5; i++) {
94 addFolder(content, QString("Folder %1").arg(i), "folder", bulk);
70 } 95 }
71 i++;
72 auto folder = createFolder(i);
73 folder.insert("parent", "key0");
74 content.insert(QString("key%1").arg(i), folder);
75 return content; 96 return content;
76} 97}
77 98
78static QMap<QString, QMap<QString, QVariant> > s_eventSource = populateEvents(); 99DummyStore::DummyStore()
79static QMap<QString, QMap<QString, QVariant> > s_mailSource = populateMails(); 100{
80static QMap<QString, QMap<QString, QVariant> > s_folderSource = populateFolders(); 101 mFolders = populateFolders();
102 mMails = populateMails();
103 mEvents = populateEvents();
104
105}
81 106
82QMap<QString, QMap<QString, QVariant> > DummyStore::events() const 107QMap<QString, QMap<QString, QVariant> > &DummyStore::events()
83{ 108{
84 return s_eventSource; 109 return mEvents;
85} 110}
86 111
87QMap<QString, QMap<QString, QVariant> > DummyStore::mails() const 112QMap<QString, QMap<QString, QVariant> > &DummyStore::mails()
88{ 113{
89 return s_mailSource; 114 return mMails;
90} 115}
91 116
92QMap<QString, QMap<QString, QVariant> > DummyStore::folders() const 117QMap<QString, QMap<QString, QVariant> > &DummyStore::folders()
93{ 118{
94 return s_folderSource; 119 return mFolders;
95} 120}
diff --git a/examples/dummyresource/dummystore.h b/examples/dummyresource/dummystore.h
index c730118..a29ce38 100644
--- a/examples/dummyresource/dummystore.h
+++ b/examples/dummyresource/dummystore.h
@@ -29,7 +29,18 @@ public:
29 return instance; 29 return instance;
30 } 30 }
31 31
32 QMap<QString, QMap<QString, QVariant> > events() const; 32 QMap<QString, QMap<QString, QVariant> > &events();
33 QMap<QString, QMap<QString, QVariant> > mails() const; 33 QMap<QString, QMap<QString, QVariant> > &mails();
34 QMap<QString, QMap<QString, QVariant> > folders() const; 34 QMap<QString, QMap<QString, QVariant> > &folders();
35
36private:
37 DummyStore();
38
39 QMap<QString, QMap<QString, QVariant> > populateEvents();
40 QMap<QString, QMap<QString, QVariant> > populateMails();
41 QMap<QString, QMap<QString, QVariant> > populateFolders();
42
43 QMap<QString, QMap<QString, QVariant> > mEvents;
44 QMap<QString, QMap<QString, QVariant> > mMails;
45 QMap<QString, QMap<QString, QVariant> > mFolders;
35}; 46};
diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp
index 9a577a0..a084c19 100644
--- a/examples/dummyresource/resourcefactory.cpp
+++ b/examples/dummyresource/resourcefactory.cpp
@@ -160,14 +160,27 @@ void DummyResource::createEvent(const QByteArray &ridBuffer, const QMap<QString,
160 Akonadi2::EntityBuffer::assembleEntityBuffer(entityFbb, 0, 0, m_fbb.GetBufferPointer(), m_fbb.GetSize(), 0, 0); 160 Akonadi2::EntityBuffer::assembleEntityBuffer(entityFbb, 0, 0, m_fbb.GetBufferPointer(), m_fbb.GetSize(), 0, 0);
161} 161}
162 162
163QString DummyResource::resolveRemoteId(const QByteArray &bufferType, const QString &remoteId, Akonadi2::Storage::Transaction &transaction)
164{
165 //Lookup local id for remote id, or insert a new pair otherwise
166 auto remoteIdWithType = bufferType + remoteId.toUtf8();
167 QByteArray akonadiId = Index("rid.mapping", transaction).lookup(remoteIdWithType);
168 if (akonadiId.isEmpty()) {
169 akonadiId = QUuid::createUuid().toString().toUtf8();
170 Index("rid.mapping", transaction).add(remoteIdWithType, akonadiId);
171 }
172 return akonadiId;
173}
174
175
163void DummyResource::createMail(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &transaction) 176void DummyResource::createMail(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &transaction)
164{ 177{
165 //Map the source format to the buffer format (which happens to be an exact copy here) 178 //Map the source format to the buffer format (which happens to be an almost exact copy here)
166 auto subject = m_fbb.CreateString(data.value("subject").toString().toStdString()); 179 auto subject = m_fbb.CreateString(data.value("subject").toString().toStdString());
167 auto sender = m_fbb.CreateString(data.value("sender").toString().toStdString()); 180 auto sender = m_fbb.CreateString(data.value("senderEmail").toString().toStdString());
168 auto senderName = m_fbb.CreateString(data.value("senderName").toString().toStdString()); 181 auto senderName = m_fbb.CreateString(data.value("senderName").toString().toStdString());
169 auto date = m_fbb.CreateString(data.value("date").toDate().toString().toStdString()); 182 auto date = m_fbb.CreateString(data.value("date").toDate().toString().toStdString());
170 auto folder = m_fbb.CreateString(std::string("inbox")); 183 auto folder = m_fbb.CreateString(resolveRemoteId(ENTITY_TYPE_MAIL, data.value("parentFolder").toString(), transaction).toStdString());
171 184
172 auto builder = Akonadi2::ApplicationDomain::Buffer::MailBuilder(m_fbb); 185 auto builder = Akonadi2::ApplicationDomain::Buffer::MailBuilder(m_fbb);
173 builder.add_subject(subject); 186 builder.add_subject(subject);
@@ -182,26 +195,16 @@ void DummyResource::createMail(const QByteArray &ridBuffer, const QMap<QString,
182 Akonadi2::EntityBuffer::assembleEntityBuffer(entityFbb, 0, 0, 0, 0, m_fbb.GetBufferPointer(), m_fbb.GetSize()); 195 Akonadi2::EntityBuffer::assembleEntityBuffer(entityFbb, 0, 0, 0, 0, m_fbb.GetBufferPointer(), m_fbb.GetSize());
183} 196}
184 197
185QString DummyResource::resolveRemoteId(const QString &remoteId, Akonadi2::Storage::Transaction &transaction)
186{
187 //Lookup local id for remote id, or insert a new pair otherwise
188 QByteArray akonadiId = Index("rid.mapping", transaction).lookup(remoteId.toLatin1());
189 if (akonadiId.isEmpty()) {
190 akonadiId = QUuid::createUuid().toString().toUtf8();
191 Index("rid.mapping", transaction).add(remoteId.toLatin1(), akonadiId);
192 }
193 return akonadiId;
194}
195
196void DummyResource::createFolder(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &transaction) 198void DummyResource::createFolder(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &transaction)
197{ 199{
198 //Map the source format to the buffer format (which happens to be an exact copy here) 200 //Map the source format to the buffer format (which happens to be an exact copy here)
199 auto name = m_fbb.CreateString(data.value("name").toString().toStdString()); 201 auto name = m_fbb.CreateString(data.value("name").toString().toStdString());
202 auto icon = m_fbb.CreateString(data.value("icon").toString().toStdString());
200 flatbuffers::Offset<flatbuffers::String> parent; 203 flatbuffers::Offset<flatbuffers::String> parent;
201 bool hasParent = false; 204 bool hasParent = false;
202 if (!data.value("parent").toString().isEmpty()) { 205 if (!data.value("parent").toString().isEmpty()) {
203 hasParent = true; 206 hasParent = true;
204 auto akonadiId = resolveRemoteId(data.value("parent").toString(), transaction); 207 auto akonadiId = resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toString(), transaction);
205 parent = m_fbb.CreateString(akonadiId.toStdString()); 208 parent = m_fbb.CreateString(akonadiId.toStdString());
206 } 209 }
207 210
@@ -210,6 +213,7 @@ void DummyResource::createFolder(const QByteArray &ridBuffer, const QMap<QString
210 if (hasParent) { 213 if (hasParent) {
211 builder.add_parent(parent); 214 builder.add_parent(parent);
212 } 215 }
216 builder.add_icon(icon);
213 auto buffer = builder.Finish(); 217 auto buffer = builder.Finish();
214 Akonadi2::ApplicationDomain::Buffer::FinishFolderBuffer(m_fbb, buffer); 218 Akonadi2::ApplicationDomain::Buffer::FinishFolderBuffer(m_fbb, buffer);
215 Akonadi2::EntityBuffer::assembleEntityBuffer(entityFbb, 0, 0, 0, 0, m_fbb.GetBufferPointer(), m_fbb.GetSize()); 219 Akonadi2::EntityBuffer::assembleEntityBuffer(entityFbb, 0, 0, 0, 0, m_fbb.GetBufferPointer(), m_fbb.GetSize());
@@ -222,7 +226,7 @@ void DummyResource::synchronize(const QString &bufferType, const QMap<QString, Q
222 Index ridMapping("rid.mapping", synchronizationTransaction); 226 Index ridMapping("rid.mapping", synchronizationTransaction);
223 for (auto it = data.constBegin(); it != data.constEnd(); it++) { 227 for (auto it = data.constBegin(); it != data.constEnd(); it++) {
224 const auto remoteId = it.key().toUtf8(); 228 const auto remoteId = it.key().toUtf8();
225 auto akonadiId = resolveRemoteId(remoteId, synchronizationTransaction); 229 auto akonadiId = resolveRemoteId(bufferType.toUtf8(), remoteId, synchronizationTransaction);
226 230
227 bool found = false; 231 bool found = false;
228 transaction.openDatabase(bufferType.toUtf8() + ".main").scan(akonadiId.toUtf8(), [&found](const QByteArray &, const QByteArray &) -> bool { 232 transaction.openDatabase(bufferType.toUtf8() + ".main").scan(akonadiId.toUtf8(), [&found](const QByteArray &, const QByteArray &) -> bool {
diff --git a/examples/dummyresource/resourcefactory.h b/examples/dummyresource/resourcefactory.h
index 5706c16..4144985 100644
--- a/examples/dummyresource/resourcefactory.h
+++ b/examples/dummyresource/resourcefactory.h
@@ -36,7 +36,7 @@ public:
36 KAsync::Job<void> synchronizeWithSource() Q_DECL_OVERRIDE; 36 KAsync::Job<void> synchronizeWithSource() Q_DECL_OVERRIDE;
37 static void removeFromDisk(const QByteArray &instanceIdentifier); 37 static void removeFromDisk(const QByteArray &instanceIdentifier);
38private: 38private:
39 QString resolveRemoteId(const QString &remoteId, Akonadi2::Storage::Transaction &transaction); 39 QString resolveRemoteId(const QByteArray &type, const QString &remoteId, Akonadi2::Storage::Transaction &transaction);
40 void createEvent(const QByteArray &rid, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &); 40 void createEvent(const QByteArray &rid, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &);
41 void createMail(const QByteArray &rid, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &); 41 void createMail(const QByteArray &rid, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &);
42 void createFolder(const QByteArray &rid, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &); 42 void createFolder(const QByteArray &rid, const QMap<QString, QVariant> &data, flatbuffers::FlatBufferBuilder &entityFbb, Akonadi2::Storage::Transaction &);