diff options
-rw-r--r-- | common/clientapi.h | 21 | ||||
-rw-r--r-- | common/entitybuffer.cpp | 18 | ||||
-rw-r--r-- | common/entitybuffer.h | 8 | ||||
-rw-r--r-- | dummyresource/domainadaptor.cpp | 11 | ||||
-rw-r--r-- | dummyresource/facade.cpp | 8 | ||||
-rw-r--r-- | dummyresource/resourcefactory.cpp | 6 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/domainadaptortest.cpp | 154 | ||||
-rw-r--r-- | tests/dummyresourcetest.cpp | 2 |
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 | */ |
179 | class BufferAdaptor { | 179 | class BufferAdaptor { |
180 | public: | 180 | public: |
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 | |||
186 | class MemoryBufferAdaptor : public BufferAdaptor { | ||
187 | public: | ||
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 | |||
200 | private: | ||
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 | ||
26 | const flatbuffers::Vector<uint8_t>* EntityBuffer::resourceBuffer() | 26 | const 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 | ||
35 | const flatbuffers::Vector<uint8_t>* EntityBuffer::metadataBuffer() | 35 | const 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 | ||
43 | const flatbuffers::Vector<uint8_t>* EntityBuffer::localBuffer() | 43 | const 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 | ||
51 | void EntityBuffer::extractResourceBuffer(void *dataValue, int dataSize, const std::function<void(const flatbuffers::Vector<uint8_t> *)> &handler) | 51 | void 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; | |||
9 | class EntityBuffer { | 9 | class EntityBuffer { |
10 | public: | 10 | public: |
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 | ||
20 | private: | 20 | private: |
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? | ||
68 | QSharedPointer<Akonadi2::Domain::BufferAdaptor> DummyEventAdaptorFactory::createAdaptor(const Akonadi2::Entity &entity) | 77 | QSharedPointer<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 | ||
22 | target_link_libraries(dummyresourcetest akonadi2_resource_dummy) | 23 | target_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 | |||
16 | class TestEventAdaptor : public Akonadi2::Domain::BufferAdaptor | ||
17 | { | ||
18 | public: | ||
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 | |||
50 | class TestFactory : public DomainTypeAdaptorFactory<Akonadi2::Domain::Event, Akonadi2::Domain::Buffer::Event, Akonadi2::Domain::Buffer::Event> | ||
51 | { | ||
52 | public: | ||
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 | |||
102 | class DomainAdaptorTest : public QObject | ||
103 | { | ||
104 | Q_OBJECT | ||
105 | private 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 | |||
153 | QTEST_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 | }; |