diff options
Diffstat (limited to 'dummyresource/facade.cpp')
-rw-r--r-- | dummyresource/facade.cpp | 138 |
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 @@ | |||
33 | using namespace DummyCalendar; | 33 | using namespace DummyCalendar; |
34 | using namespace flatbuffers; | 34 | using 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. | 37 | class 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 | */ | ||
42 | template<typename BufferType> | ||
43 | class PropertyMapper | ||
44 | { | 38 | { |
45 | public: | 39 | public: |
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 | ||
72 | template<> | ||
73 | QSharedPointer<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 | |||
66 | DummyResourceFacade::DummyResourceFacade() | 107 | DummyResourceFacade::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 | ||
76 | DummyResourceFacade::~DummyResourceFacade() | 119 | DummyResourceFacade::~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 | ||
109 | class DummyEventAdaptor : public Akonadi2::Domain::BufferAdaptor | ||
110 | { | ||
111 | public: | ||
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 | |||
147 | static std::function<bool(const std::string &key, DummyEvent const *buffer)> prepareQuery(const Akonadi2::Query &query) | 151 | static 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 | } |