summaryrefslogtreecommitdiffstats
path: root/dummyresource/facade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dummyresource/facade.cpp')
-rw-r--r--dummyresource/facade.cpp138
1 files changed, 66 insertions, 72 deletions
diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp
index d3974e9..c167297 100644
--- a/dummyresource/facade.cpp
+++ b/dummyresource/facade.cpp
@@ -33,44 +33,87 @@
33using namespace DummyCalendar; 33using namespace DummyCalendar;
34using namespace flatbuffers; 34using namespace flatbuffers;
35 35
36/** 36//This will become a generic implementation that simply takes the resource buffer and local buffer pointer
37 * The property mapper holds accessor functions for all properties. 37class DummyEventAdaptor : public Akonadi2::Domain::BufferAdaptor
38 *
39 * It is by default initialized with accessors that access the local-only buffer,
40 * and resource simply have to overwrite those accessors.
41 */
42template<typename BufferType>
43class PropertyMapper
44{ 38{
45public: 39public:
46 void setProperty(const QString &key, const QVariant &value, BufferType *buffer) 40 DummyEventAdaptor()
41 : BufferAdaptor()
47 { 42 {
48 if (mWriteAccessors.contains(key)) { 43
49 auto accessor = mWriteAccessors.value(key); 44 }
50 return accessor(value, buffer); 45
46 void setProperty(const QString &key, const QVariant &value)
47 {
48 if (mResourceMapper->mWriteAccessors.contains(key)) {
49 // mResourceMapper.setProperty(key, value, mResourceBuffer);
50 } else {
51 // mLocalMapper.;
51 } 52 }
52 } 53 }
53 54
54 virtual QVariant getProperty(const QString &key, BufferType const *buffer) const 55 virtual QVariant getProperty(const QString &key) const
55 { 56 {
56 if (mReadAccessors.contains(key)) { 57 if (mResourceBuffer && mResourceMapper->mReadAccessors.contains(key)) {
57 auto accessor = mReadAccessors.value(key); 58 return mResourceMapper->getProperty(key, mResourceBuffer);
58 return accessor(buffer); 59 } else if (mLocalBuffer) {
60 return mLocalMapper->getProperty(key, mLocalBuffer);
59 } 61 }
60 return QVariant(); 62 return QVariant();
61 } 63 }
62 QHash<QString, std::function<QVariant(BufferType const *)> > mReadAccessors; 64
63 QHash<QString, std::function<void(const QVariant &, BufferType*)> > mWriteAccessors; 65 Akonadi2::Domain::Buffer::Event const *mLocalBuffer;
66 DummyEvent const *mResourceBuffer;
67
68 QSharedPointer<PropertyMapper<Akonadi2::Domain::Buffer::Event> > mLocalMapper;
69 QSharedPointer<PropertyMapper<DummyEvent> > mResourceMapper;
64}; 70};
65 71
72template<>
73QSharedPointer<Akonadi2::Domain::BufferAdaptor> DomainTypeAdaptorFactory<typename Akonadi2::Domain::Event, typename Akonadi2::Domain::Buffer::Event, DummyEvent>::createAdaptor(const Akonadi2::Entity &entity)
74{
75 DummyEvent const *resourceBuffer = 0;
76 if (auto resourceData = entity.resource()) {
77 flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size());
78 if (VerifyDummyEventBuffer(verifyer)) {
79 resourceBuffer = GetDummyEvent(resourceData);
80 }
81 }
82
83 Akonadi2::Metadata const *metadataBuffer = 0;
84 if (auto metadataData = entity.metadata()) {
85 flatbuffers::Verifier verifyer(metadataData->Data(), metadataData->size());
86 if (Akonadi2::VerifyMetadataBuffer(verifyer)) {
87 metadataBuffer = Akonadi2::GetMetadata(metadataData);
88 }
89 }
90
91 Akonadi2::Domain::Buffer::Event const *localBuffer = 0;
92 if (auto localData = entity.local()) {
93 flatbuffers::Verifier verifyer(localData->Data(), localData->size());
94 if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) {
95 localBuffer = Akonadi2::Domain::Buffer::GetEvent(localData);
96 }
97 }
98
99 auto adaptor = QSharedPointer<DummyEventAdaptor>::create();
100 adaptor->mLocalBuffer = localBuffer;
101 adaptor->mResourceBuffer = resourceBuffer;
102 adaptor->mResourceMapper = mResourceMapper;
103 adaptor->mLocalMapper = mLocalMapper;
104 return adaptor;
105}
106
66DummyResourceFacade::DummyResourceFacade() 107DummyResourceFacade::DummyResourceFacade()
67 : Akonadi2::StoreFacade<Akonadi2::Domain::Event>(), 108 : Akonadi2::StoreFacade<Akonadi2::Domain::Event>(),
68 mResourceAccess(new Akonadi2::ResourceAccess("org.kde.dummy")) 109 mResourceAccess(new Akonadi2::ResourceAccess("org.kde.dummy")),
110 mFactory(new DomainTypeAdaptorFactory<Akonadi2::Domain::Event, Akonadi2::Domain::Buffer::Event, DummyCalendar::DummyEvent>())
69{ 111{
70 PropertyMapper<DummyEvent> mapper; 112 auto mapper = QSharedPointer<PropertyMapper<DummyEvent> >::create();
71 mapper.mReadAccessors.insert("summary", [](DummyEvent const *buffer) -> QVariant { 113 mapper->mReadAccessors.insert("summary", [](DummyEvent const *buffer) -> QVariant {
72 return QString::fromStdString(buffer->summary()->c_str()); 114 return QString::fromStdString(buffer->summary()->c_str());
73 }); 115 });
116 mFactory->mResourceMapper = mapper;
74} 117}
75 118
76DummyResourceFacade::~DummyResourceFacade() 119DummyResourceFacade::~DummyResourceFacade()
@@ -105,45 +148,6 @@ void DummyResourceFacade::remove(const Akonadi2::Domain::Event &domainObject)
105// 148//
106 149
107 150
108//This will become a generic implementation that simply takes the resource buffer and local buffer pointer
109class DummyEventAdaptor : public Akonadi2::Domain::BufferAdaptor
110{
111public:
112 DummyEventAdaptor()
113 : BufferAdaptor()
114 {
115
116 }
117
118 void setProperty(const QString &key, const QVariant &value)
119 {
120 if (mResourceMapper.mWriteAccessors.contains(key)) {
121 // mResourceMapper.setProperty(key, value, mResourceBuffer);
122 } else {
123 // mLocalMapper.;
124 }
125 }
126
127 virtual QVariant getProperty(const QString &key) const
128 {
129 if (mResourceBuffer && mResourceMapper.mReadAccessors.contains(key)) {
130 return mResourceMapper.getProperty(key, mResourceBuffer);
131 } else if (mLocalBuffer) {
132 return mLocalMapper.getProperty(key, mLocalBuffer);
133 }
134 return QVariant();
135 }
136
137 Akonadi2::Domain::Buffer::Event const *mLocalBuffer;
138 DummyEvent const *mResourceBuffer;
139
140 PropertyMapper<Akonadi2::Domain::Buffer::Event> mLocalMapper;
141 PropertyMapper<DummyEvent> mResourceMapper;
142
143 //Keep query alive so values remain valid
144 QSharedPointer<Akonadi2::Storage> storage;
145};
146
147static std::function<bool(const std::string &key, DummyEvent const *buffer)> prepareQuery(const Akonadi2::Query &query) 151static std::function<bool(const std::string &key, DummyEvent const *buffer)> prepareQuery(const Akonadi2::Query &query)
148{ 152{
149 //Compose some functions to make query matching fast. 153 //Compose some functions to make query matching fast.
@@ -225,26 +229,16 @@ void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function
225 } 229 }
226 } 230 }
227 231
228 Akonadi2::Domain::Buffer::Event const *localBuffer = 0;
229 if (auto localData = buffer.localBuffer()) {
230 flatbuffers::Verifier verifyer(localData->Data(), localData->size());
231 if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) {
232 localBuffer = Akonadi2::Domain::Buffer::GetEvent(localData);
233 }
234 }
235
236 if (!resourceBuffer || !metadataBuffer) { 232 if (!resourceBuffer || !metadataBuffer) {
237 qWarning() << "invalid buffer " << QString::fromStdString(std::string(static_cast<char*>(keyValue), keySize)); 233 qWarning() << "invalid buffer " << QString::fromStdString(std::string(static_cast<char*>(keyValue), keySize));
238 return true; 234 return true;
239 } 235 }
240 236
241 //We probably only want to create all buffers after the scan 237 //We probably only want to create all buffers after the scan
238 //TODO use adapter for query and scan?
242 if (preparedQuery && preparedQuery(std::string(static_cast<char*>(keyValue), keySize), resourceBuffer)) { 239 if (preparedQuery && preparedQuery(std::string(static_cast<char*>(keyValue), keySize), resourceBuffer)) {
243 qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1; 240 qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1;
244 auto adaptor = QSharedPointer<DummyEventAdaptor>::create(); 241 auto adaptor = mFactory->createAdaptor(buffer.entity());
245 adaptor->mLocalBuffer = localBuffer;
246 adaptor->mResourceBuffer = resourceBuffer;
247 adaptor->storage = storage;
248 auto event = QSharedPointer<Akonadi2::Domain::Event>::create("org.kde.dummy", QString::fromUtf8(static_cast<char*>(keyValue), keySize), revision, adaptor); 242 auto event = QSharedPointer<Akonadi2::Domain::Event>::create("org.kde.dummy", QString::fromUtf8(static_cast<char*>(keyValue), keySize), revision, adaptor);
249 resultCallback(event); 243 resultCallback(event);
250 } 244 }