summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-01-07 01:01:42 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-01-07 01:01:42 +0100
commita638278ede2d7af9a073da6ca11ba2efee2a934b (patch)
tree1c57b81ffe009607cf6bcdbd873bb4137fa2448f
parentc73371e12fd127cbc39496b9ffadbcf9b702b600 (diff)
downloadsink-a638278ede2d7af9a073da6ca11ba2efee2a934b.tar.gz
sink-a638278ede2d7af9a073da6ca11ba2efee2a934b.zip
Made the domain adaptor actually work. We can read stuff now.
-rw-r--r--common/clientapi.h21
-rw-r--r--common/entitybuffer.cpp18
-rw-r--r--common/entitybuffer.h8
-rw-r--r--dummyresource/domainadaptor.cpp11
-rw-r--r--dummyresource/facade.cpp8
-rw-r--r--dummyresource/resourcefactory.cpp6
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/domainadaptortest.cpp154
-rw-r--r--tests/dummyresourcetest.cpp2
9 files changed, 207 insertions, 22 deletions
diff --git a/common/clientapi.h b/common/clientapi.h
index ba0cb19..d2b1c9c 100644
--- a/common/clientapi.h
+++ b/common/clientapi.h
@@ -178,8 +178,27 @@ namespace Domain {
178 */ 178 */
179class BufferAdaptor { 179class BufferAdaptor {
180public: 180public:
181 virtual QVariant getProperty(const QString &key) { return QVariant(); } 181 virtual QVariant getProperty(const QString &key) const { return QVariant(); }
182 virtual void setProperty(const QString &key, const QVariant &value) {} 182 virtual void setProperty(const QString &key, const QVariant &value) {}
183 virtual QStringList availableProperties() const { return QStringList(); }
184};
185
186class MemoryBufferAdaptor : public BufferAdaptor {
187public:
188 MemoryBufferAdaptor(const BufferAdaptor &buffer)
189 : BufferAdaptor()
190 {
191 for(const auto &property : buffer.availableProperties()) {
192 mValues.insert(property, buffer.getProperty(property));
193 }
194 }
195
196 virtual QVariant getProperty(const QString &key) const { return mValues.value(key); }
197 virtual void setProperty(const QString &key, const QVariant &value) { mValues.insert(key, value); }
198 virtual QStringList availableProperties() const { return mValues.keys(); }
199
200private:
201 QHash<QString, QVariant> mValues;
183}; 202};
184 203
185/** 204/**
diff --git a/common/entitybuffer.cpp b/common/entitybuffer.cpp
index c5d6bce..aa5847c 100644
--- a/common/entitybuffer.cpp
+++ b/common/entitybuffer.cpp
@@ -23,36 +23,36 @@ const Akonadi2::Entity &EntityBuffer::entity()
23 return *mEntity; 23 return *mEntity;
24} 24}
25 25
26const flatbuffers::Vector<uint8_t>* EntityBuffer::resourceBuffer() 26const uint8_t* EntityBuffer::resourceBuffer()
27{ 27{
28 if (!mEntity) { 28 if (!mEntity) {
29 qDebug() << "no buffer"; 29 qDebug() << "no buffer";
30 return nullptr; 30 return nullptr;
31 } 31 }
32 return mEntity->resource(); 32 return mEntity->resource()->Data();
33} 33}
34 34
35const flatbuffers::Vector<uint8_t>* EntityBuffer::metadataBuffer() 35const uint8_t* EntityBuffer::metadataBuffer()
36{ 36{
37 if (!mEntity) { 37 if (!mEntity) {
38 return nullptr; 38 return nullptr;
39 } 39 }
40 return mEntity->metadata(); 40 return mEntity->metadata()->Data();
41} 41}
42 42
43const flatbuffers::Vector<uint8_t>* EntityBuffer::localBuffer() 43const uint8_t* EntityBuffer::localBuffer()
44{ 44{
45 if (!mEntity) { 45 if (!mEntity) {
46 return nullptr; 46 return nullptr;
47 } 47 }
48 return mEntity->local(); 48 return mEntity->local()->Data();
49} 49}
50 50
51void EntityBuffer::extractResourceBuffer(void *dataValue, int dataSize, const std::function<void(const flatbuffers::Vector<uint8_t> *)> &handler) 51void EntityBuffer::extractResourceBuffer(void *dataValue, int dataSize, const std::function<void(const uint8_t *, size_t size)> &handler)
52{ 52{
53 Akonadi2::EntityBuffer buffer(dataValue, dataSize); 53 Akonadi2::EntityBuffer buffer(dataValue, dataSize);
54 if (auto resourceData = buffer.resourceBuffer()) { 54 if (auto resourceData = buffer.entity().resource()) {
55 handler(resourceData); 55 handler(resourceData->Data(), resourceData->size());
56 } 56 }
57} 57}
58 58
diff --git a/common/entitybuffer.h b/common/entitybuffer.h
index bd9360d..600b04d 100644
--- a/common/entitybuffer.h
+++ b/common/entitybuffer.h
@@ -9,12 +9,12 @@ class Entity;
9class EntityBuffer { 9class EntityBuffer {
10public: 10public:
11 EntityBuffer(void *dataValue, int size); 11 EntityBuffer(void *dataValue, int size);
12 const flatbuffers::Vector<uint8_t> *resourceBuffer(); 12 const uint8_t *resourceBuffer();
13 const flatbuffers::Vector<uint8_t> *metadataBuffer(); 13 const uint8_t *metadataBuffer();
14 const flatbuffers::Vector<uint8_t> *localBuffer(); 14 const uint8_t *localBuffer();
15 const Entity &entity(); 15 const Entity &entity();
16 16
17 static void extractResourceBuffer(void *dataValue, int dataSize, const std::function<void(const flatbuffers::Vector<uint8_t> *)> &handler); 17 static void extractResourceBuffer(void *dataValue, int dataSize, const std::function<void(const uint8_t *, size_t size)> &handler);
18 static void assembleEntityBuffer(flatbuffers::FlatBufferBuilder &fbb, void *metadataData, size_t metadataSize, void *resourceData, size_t resourceSize, void *localData, size_t localSize); 18 static void assembleEntityBuffer(flatbuffers::FlatBufferBuilder &fbb, void *metadataData, size_t metadataSize, void *resourceData, size_t resourceSize, void *localData, size_t localSize);
19 19
20private: 20private:
diff --git a/dummyresource/domainadaptor.cpp b/dummyresource/domainadaptor.cpp
index 5d046ff..ae001cf 100644
--- a/dummyresource/domainadaptor.cpp
+++ b/dummyresource/domainadaptor.cpp
@@ -46,6 +46,14 @@ public:
46 return QVariant(); 46 return QVariant();
47 } 47 }
48 48
49 virtual QStringList availableProperties() const
50 {
51 QStringList props;
52 props << mResourceMapper->mReadAccessors.keys();
53 props << mLocalMapper->mReadAccessors.keys();
54 return props;
55 }
56
49 Akonadi2::Domain::Buffer::Event const *mLocalBuffer; 57 Akonadi2::Domain::Buffer::Event const *mLocalBuffer;
50 DummyEvent const *mResourceBuffer; 58 DummyEvent const *mResourceBuffer;
51 59
@@ -65,13 +73,14 @@ DummyEventAdaptorFactory::DummyEventAdaptorFactory()
65 73
66} 74}
67 75
76//TODO pass EntityBuffer instead?
68QSharedPointer<Akonadi2::Domain::BufferAdaptor> DummyEventAdaptorFactory::createAdaptor(const Akonadi2::Entity &entity) 77QSharedPointer<Akonadi2::Domain::BufferAdaptor> DummyEventAdaptorFactory::createAdaptor(const Akonadi2::Entity &entity)
69{ 78{
70 DummyEvent const *resourceBuffer = 0; 79 DummyEvent const *resourceBuffer = 0;
71 if (auto resourceData = entity.resource()) { 80 if (auto resourceData = entity.resource()) {
72 flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size()); 81 flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size());
73 if (VerifyDummyEventBuffer(verifyer)) { 82 if (VerifyDummyEventBuffer(verifyer)) {
74 resourceBuffer = GetDummyEvent(resourceData); 83 resourceBuffer = GetDummyEvent(resourceData->Data());
75 } 84 }
76 } 85 }
77 86
diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp
index 5320216..f754c7e 100644
--- a/dummyresource/facade.cpp
+++ b/dummyresource/facade.cpp
@@ -128,7 +128,7 @@ void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function
128 Akonadi2::EntityBuffer buffer(dataValue, dataSize); 128 Akonadi2::EntityBuffer buffer(dataValue, dataSize);
129 129
130 DummyEvent const *resourceBuffer = 0; 130 DummyEvent const *resourceBuffer = 0;
131 if (auto resourceData = buffer.resourceBuffer()) { 131 if (auto resourceData = buffer.entity().resource()) {
132 flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size()); 132 flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size());
133 if (VerifyDummyEventBuffer(verifyer)) { 133 if (VerifyDummyEventBuffer(verifyer)) {
134 resourceBuffer = GetDummyEvent(resourceData); 134 resourceBuffer = GetDummyEvent(resourceData);
@@ -136,7 +136,7 @@ void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function
136 } 136 }
137 137
138 Akonadi2::Metadata const *metadataBuffer = 0; 138 Akonadi2::Metadata const *metadataBuffer = 0;
139 if (auto metadataData = buffer.metadataBuffer()) { 139 if (auto metadataData = buffer.entity().metadata()) {
140 flatbuffers::Verifier verifyer(metadataData->Data(), metadataData->size()); 140 flatbuffers::Verifier verifyer(metadataData->Data(), metadataData->size());
141 if (Akonadi2::VerifyMetadataBuffer(verifyer)) { 141 if (Akonadi2::VerifyMetadataBuffer(verifyer)) {
142 metadataBuffer = Akonadi2::GetMetadata(metadataData); 142 metadataBuffer = Akonadi2::GetMetadata(metadataData);
@@ -153,7 +153,9 @@ void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function
153 if (preparedQuery && preparedQuery(std::string(static_cast<char*>(keyValue), keySize), resourceBuffer)) { 153 if (preparedQuery && preparedQuery(std::string(static_cast<char*>(keyValue), keySize), resourceBuffer)) {
154 qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1; 154 qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1;
155 auto adaptor = mFactory->createAdaptor(buffer.entity()); 155 auto adaptor = mFactory->createAdaptor(buffer.entity());
156 auto event = QSharedPointer<Akonadi2::Domain::Event>::create("org.kde.dummy", QString::fromUtf8(static_cast<char*>(keyValue), keySize), revision, adaptor); 156 //TODO only copy requested properties
157 auto memoryAdaptor = QSharedPointer<Akonadi2::Domain::MemoryBufferAdaptor>::create(*adaptor);
158 auto event = QSharedPointer<Akonadi2::Domain::Event>::create("org.kde.dummy", QString::fromUtf8(static_cast<char*>(keyValue), keySize), revision, memoryAdaptor);
157 resultCallback(event); 159 resultCallback(event);
158 } 160 }
159 return true; 161 return true;
diff --git a/dummyresource/resourcefactory.cpp b/dummyresource/resourcefactory.cpp
index 87a6048..e4f7e41 100644
--- a/dummyresource/resourcefactory.cpp
+++ b/dummyresource/resourcefactory.cpp
@@ -122,10 +122,10 @@ void findByRemoteId(QSharedPointer<Akonadi2::Storage> storage, const QString &ri
122 return true; 122 return true;
123 } 123 }
124 124
125 Akonadi2::EntityBuffer::extractResourceBuffer(dataValue, dataSize, [&](const flatbuffers::Vector<uint8_t> *buffer) { 125 Akonadi2::EntityBuffer::extractResourceBuffer(dataValue, dataSize, [&](const uint8_t *buffer, size_t size) {
126 flatbuffers::Verifier verifier(buffer->Data(), buffer->size()); 126 flatbuffers::Verifier verifier(buffer, size);
127 if (DummyCalendar::VerifyDummyEventBuffer(verifier)) { 127 if (DummyCalendar::VerifyDummyEventBuffer(verifier)) {
128 DummyCalendar::DummyEvent const *resourceBuffer = DummyCalendar::GetDummyEvent(buffer->Data()); 128 DummyCalendar::DummyEvent const *resourceBuffer = DummyCalendar::GetDummyEvent(buffer);
129 if (resourceBuffer && resourceBuffer->remoteId()) { 129 if (resourceBuffer && resourceBuffer->remoteId()) {
130 if (std::string(resourceBuffer->remoteId()->c_str(), resourceBuffer->remoteId()->size()) == ridString) { 130 if (std::string(resourceBuffer->remoteId()->c_str(), resourceBuffer->remoteId()->size()) == ridString) {
131 callback(keyValue, keySize, dataValue, dataSize); 131 callback(keyValue, keySize, dataValue, dataSize);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 8a1069d..12695ff 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -17,6 +17,7 @@ manual_tests (
17 storagebenchmark 17 storagebenchmark
18 storagetest 18 storagetest
19 dummyresourcetest 19 dummyresourcetest
20 domainadaptortest
20) 21)
21 22
22target_link_libraries(dummyresourcetest akonadi2_resource_dummy) 23target_link_libraries(dummyresourcetest akonadi2_resource_dummy)
diff --git a/tests/domainadaptortest.cpp b/tests/domainadaptortest.cpp
new file mode 100644
index 0000000..d1a9d26
--- /dev/null
+++ b/tests/domainadaptortest.cpp
@@ -0,0 +1,154 @@
1#include <QtTest>
2
3#include <QString>
4#include <QSharedPointer>
5#include <QDebug>
6
7#include "dummyresource/resourcefactory.h"
8#include "clientapi.h"
9
10#include "common/domainadaptor.h"
11#include "common/entitybuffer.h"
12#include "event_generated.h"
13#include "metadata_generated.h"
14#include "entity_generated.h"
15
16class TestEventAdaptor : public Akonadi2::Domain::BufferAdaptor
17{
18public:
19 TestEventAdaptor()
20 : Akonadi2::Domain::BufferAdaptor()
21 {
22 }
23
24 void setProperty(const QString &key, const QVariant &value)
25 {
26 if (mResourceMapper->mWriteAccessors.contains(key)) {
27 // mResourceMapper.setProperty(key, value, mResourceBuffer);
28 } else {
29 // mLocalMapper.;
30 }
31 }
32
33 virtual QVariant getProperty(const QString &key) const
34 {
35 if (mResourceBuffer && mResourceMapper->mReadAccessors.contains(key)) {
36 return mResourceMapper->getProperty(key, mResourceBuffer);
37 } else if (mLocalBuffer) {
38 return mLocalMapper->getProperty(key, mLocalBuffer);
39 }
40 return QVariant();
41 }
42
43 Akonadi2::Domain::Buffer::Event const *mLocalBuffer;
44 Akonadi2::Domain::Buffer::Event const *mResourceBuffer;
45
46 QSharedPointer<PropertyMapper<Akonadi2::Domain::Buffer::Event> > mLocalMapper;
47 QSharedPointer<PropertyMapper<Akonadi2::Domain::Buffer::Event> > mResourceMapper;
48};
49
50class TestFactory : public DomainTypeAdaptorFactory<Akonadi2::Domain::Event, Akonadi2::Domain::Buffer::Event, Akonadi2::Domain::Buffer::Event>
51{
52public:
53 TestFactory()
54 {
55 mResourceMapper = QSharedPointer<PropertyMapper<Akonadi2::Domain::Buffer::Event> >::create();
56 mResourceMapper->mReadAccessors.insert("summary", [](Akonadi2::Domain::Buffer::Event const *buffer) -> QVariant {
57 if (buffer->summary()) {
58 return QString::fromStdString(buffer->summary()->c_str());
59 }
60 return QVariant();
61 });
62 }
63
64 virtual QSharedPointer<Akonadi2::Domain::BufferAdaptor> createAdaptor(const Akonadi2::Entity &entity)
65 {
66 Akonadi2::Domain::Buffer::Event const *resourceBuffer = 0;
67 if (auto resourceData = entity.resource()) {
68 flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size());
69 if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) {
70 resourceBuffer = Akonadi2::Domain::Buffer::GetEvent(resourceData->Data());
71 if (resourceBuffer->summary()) {
72 qDebug() << QString::fromStdString(std::string(resourceBuffer->summary()->c_str()));
73 }
74 }
75 }
76
77 Akonadi2::Metadata const *metadataBuffer = 0;
78 if (auto metadataData = entity.metadata()) {
79 flatbuffers::Verifier verifyer(metadataData->Data(), metadataData->size());
80 if (Akonadi2::VerifyMetadataBuffer(verifyer)) {
81 metadataBuffer = Akonadi2::GetMetadata(metadataData);
82 }
83 }
84
85 Akonadi2::Domain::Buffer::Event const *localBuffer = 0;
86 if (auto localData = entity.local()) {
87 flatbuffers::Verifier verifyer(localData->Data(), localData->size());
88 if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) {
89 localBuffer = Akonadi2::Domain::Buffer::GetEvent(localData);
90 }
91 }
92
93 auto adaptor = QSharedPointer<TestEventAdaptor>::create();
94 adaptor->mLocalBuffer = localBuffer;
95 adaptor->mResourceBuffer = resourceBuffer;
96 adaptor->mResourceMapper = mResourceMapper;
97 adaptor->mLocalMapper = mLocalMapper;
98 return adaptor;
99 }
100};
101
102class DomainAdaptorTest : public QObject
103{
104 Q_OBJECT
105private Q_SLOTS:
106 void initTestCase()
107 {
108 }
109
110 void cleanupTestCase()
111 {
112 }
113
114 void testAdaptor()
115 {
116 //Create entity buffer
117 flatbuffers::FlatBufferBuilder metadataFbb;
118 auto metadataBuilder = Akonadi2::MetadataBuilder(metadataFbb);
119 metadataBuilder.add_revision(1);
120 metadataBuilder.add_processed(false);
121 auto metadataBuffer = metadataBuilder.Finish();
122 Akonadi2::FinishMetadataBuffer(metadataFbb, metadataBuffer);
123
124 flatbuffers::FlatBufferBuilder m_fbb;
125 auto summary = m_fbb.CreateString("summary1");
126 auto description = m_fbb.CreateString("description");
127 static uint8_t rawData[100];
128 auto attachment = m_fbb.CreateVector(rawData, 100);
129
130 auto builder = Akonadi2::Domain::Buffer::EventBuilder(m_fbb);
131 builder.add_summary(summary);
132 builder.add_description(description);
133 builder.add_attachment(attachment);
134 auto buffer = builder.Finish();
135 Akonadi2::Domain::Buffer::FinishEventBuffer(m_fbb, buffer);
136
137 flatbuffers::FlatBufferBuilder fbb;
138 Akonadi2::EntityBuffer::assembleEntityBuffer(fbb, metadataFbb.GetBufferPointer(), metadataFbb.GetSize(), m_fbb.GetBufferPointer(), m_fbb.GetSize(), m_fbb.GetBufferPointer(), m_fbb.GetSize());
139
140 //Extract entity buffer
141 {
142 std::string data(reinterpret_cast<const char*>(fbb.GetBufferPointer()), fbb.GetSize());
143 Akonadi2::EntityBuffer buffer((void*)(data.data()), data.size());
144
145 TestFactory factory;
146 auto adaptor = factory.createAdaptor(buffer.entity());
147 QCOMPARE(adaptor->getProperty("summary").toString(), QString("summary1"));
148 }
149 }
150
151};
152
153QTEST_MAIN(DomainAdaptorTest)
154#include "domainadaptortest.moc"
diff --git a/tests/dummyresourcetest.cpp b/tests/dummyresourcetest.cpp
index 8e60e90..b39b2b1 100644
--- a/tests/dummyresourcetest.cpp
+++ b/tests/dummyresourcetest.cpp
@@ -39,7 +39,7 @@ private Q_SLOTS:
39 result.exec(); 39 result.exec();
40 QVERIFY(!result.isEmpty()); 40 QVERIFY(!result.isEmpty());
41 auto value = result.first(); 41 auto value = result.first();
42 qDebug() << value->getProperty("summary"); 42 QVERIFY(!value->getProperty("summary").toString().isEmpty());
43 } 43 }
44 44
45}; 45};