diff options
Diffstat (limited to 'dummyresource/domainadaptor.cpp')
-rw-r--r-- | dummyresource/domainadaptor.cpp | 135 |
1 files changed, 24 insertions, 111 deletions
diff --git a/dummyresource/domainadaptor.cpp b/dummyresource/domainadaptor.cpp index 2182f9a..fa00bbc 100644 --- a/dummyresource/domainadaptor.cpp +++ b/dummyresource/domainadaptor.cpp | |||
@@ -9,142 +9,55 @@ | |||
9 | #include "entity_generated.h" | 9 | #include "entity_generated.h" |
10 | #include "metadata_generated.h" | 10 | #include "metadata_generated.h" |
11 | #include "domainadaptor.h" | 11 | #include "domainadaptor.h" |
12 | #include "log.h" | ||
12 | #include <common/entitybuffer.h> | 13 | #include <common/entitybuffer.h> |
13 | 14 | ||
14 | using namespace DummyCalendar; | 15 | using namespace DummyCalendar; |
15 | using namespace flatbuffers; | 16 | using namespace flatbuffers; |
16 | 17 | ||
17 | using namespace DummyCalendar; | ||
18 | using namespace flatbuffers; | ||
19 | |||
20 | //This will become a generic implementation that simply takes the resource buffer and local buffer pointer | ||
21 | class DummyEventAdaptor : public Akonadi2::Domain::BufferAdaptor | ||
22 | { | ||
23 | public: | ||
24 | DummyEventAdaptor() | ||
25 | : BufferAdaptor() | ||
26 | { | ||
27 | |||
28 | } | ||
29 | |||
30 | void setProperty(const QString &key, const QVariant &value) | ||
31 | { | ||
32 | if (mResourceMapper && mResourceMapper->mWriteAccessors.contains(key)) { | ||
33 | // mResourceMapper->setProperty(key, value, mResourceBuffer); | ||
34 | } else { | ||
35 | // mLocalMapper.; | ||
36 | } | ||
37 | } | ||
38 | 18 | ||
39 | virtual QVariant getProperty(const QString &key) const | ||
40 | { | ||
41 | if (mResourceBuffer && mResourceMapper->mReadAccessors.contains(key)) { | ||
42 | return mResourceMapper->getProperty(key, mResourceBuffer); | ||
43 | } else if (mLocalBuffer && mLocalMapper->mReadAccessors.contains(key)) { | ||
44 | return mLocalMapper->getProperty(key, mLocalBuffer); | ||
45 | } | ||
46 | qWarning() << "no mapping available for key " << key; | ||
47 | return QVariant(); | ||
48 | } | ||
49 | |||
50 | virtual QStringList availableProperties() const | ||
51 | { | ||
52 | QStringList props; | ||
53 | props << mResourceMapper->mReadAccessors.keys(); | ||
54 | props << mLocalMapper->mReadAccessors.keys(); | ||
55 | return props; | ||
56 | } | ||
57 | |||
58 | Akonadi2::Domain::Buffer::Event const *mLocalBuffer; | ||
59 | DummyEvent const *mResourceBuffer; | ||
60 | |||
61 | QSharedPointer<PropertyMapper<Akonadi2::Domain::Buffer::Event> > mLocalMapper; | ||
62 | QSharedPointer<PropertyMapper<DummyEvent> > mResourceMapper; | ||
63 | }; | ||
64 | 19 | ||
65 | 20 | ||
66 | DummyEventAdaptorFactory::DummyEventAdaptorFactory() | 21 | DummyEventAdaptorFactory::DummyEventAdaptorFactory() |
67 | : DomainTypeAdaptorFactory() | 22 | : DomainTypeAdaptorFactory() |
68 | { | 23 | { |
69 | mResourceMapper = QSharedPointer<PropertyMapper<DummyEvent> >::create(); | 24 | //TODO turn this into initializeReadPropertyMapper as well? |
70 | mResourceMapper->mReadAccessors.insert("summary", [](DummyEvent const *buffer) -> QVariant { | 25 | mResourceMapper->addMapping("summary", [](DummyEvent const *buffer) -> QVariant { |
71 | if (buffer->summary()) { | ||
72 | return QString::fromStdString(buffer->summary()->c_str()); | ||
73 | } | ||
74 | return QVariant(); | ||
75 | }); | ||
76 | mLocalMapper = QSharedPointer<PropertyMapper<Akonadi2::Domain::Buffer::Event> >::create(); | ||
77 | mLocalMapper->mReadAccessors.insert("summary", [](Akonadi2::Domain::Buffer::Event const *buffer) -> QVariant { | ||
78 | if (buffer->summary()) { | 26 | if (buffer->summary()) { |
79 | return QString::fromStdString(buffer->summary()->c_str()); | 27 | return QString::fromStdString(buffer->summary()->c_str()); |
80 | } | 28 | } |
81 | return QVariant(); | 29 | return QVariant(); |
82 | }); | 30 | }); |
83 | mLocalMapper->mReadAccessors.insert("uid", [](Akonadi2::Domain::Buffer::Event const *buffer) -> QVariant { | ||
84 | if (buffer->uid()) { | ||
85 | return QString::fromStdString(buffer->uid()->c_str()); | ||
86 | } | ||
87 | return QVariant(); | ||
88 | }); | ||
89 | 31 | ||
32 | mResourceWriteMapper->addMapping("summary", [](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(DummyEventBuilder &)> { | ||
33 | auto offset = extractProperty<QString>(value, fbb); | ||
34 | return [offset](DummyEventBuilder &builder) { builder.add_summary(offset); }; | ||
35 | }); | ||
90 | } | 36 | } |
91 | 37 | ||
92 | //TODO pass EntityBuffer instead? | 38 | |
93 | QSharedPointer<Akonadi2::Domain::BufferAdaptor> DummyEventAdaptorFactory::createAdaptor(const Akonadi2::Entity &entity) | 39 | void DummyEventAdaptorFactory::createBuffer(const Akonadi2::ApplicationDomain::Event &event, flatbuffers::FlatBufferBuilder &fbb) |
94 | { | 40 | { |
95 | DummyEvent const *resourceBuffer = 0; | 41 | flatbuffers::FlatBufferBuilder localFbb; |
96 | if (auto resourceData = entity.resource()) { | 42 | if (mLocalWriteMapper) { |
97 | flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size()); | 43 | auto pos = createBufferPart<Akonadi2::ApplicationDomain::Buffer::EventBuilder, Akonadi2::ApplicationDomain::Buffer::Event>(event, localFbb, *mLocalWriteMapper); |
98 | if (VerifyDummyEventBuffer(verifyer)) { | 44 | Akonadi2::ApplicationDomain::Buffer::FinishEventBuffer(localFbb, pos); |
99 | resourceBuffer = GetDummyEvent(resourceData->Data()); | 45 | flatbuffers::Verifier verifier(localFbb.GetBufferPointer(), localFbb.GetSize()); |
46 | if (!verifier.VerifyBuffer<Akonadi2::ApplicationDomain::Buffer::Event>()) { | ||
47 | Warning() << "Created invalid local buffer"; | ||
100 | } | 48 | } |
101 | } | 49 | } |
102 | 50 | ||
103 | // Akonadi2::Metadata const *metadataBuffer = 0; | 51 | flatbuffers::FlatBufferBuilder resFbb; |
104 | // if (auto metadataData = entity.metadata()) { | 52 | if (mResourceWriteMapper) { |
105 | // flatbuffers::Verifier verifyer(metadataData->Data(), metadataData->size()); | 53 | auto pos = createBufferPart<DummyEventBuilder, DummyEvent>(event, resFbb, *mResourceWriteMapper); |
106 | // if (Akonadi2::VerifyMetadataBuffer(verifyer)) { | 54 | DummyCalendar::FinishDummyEventBuffer(resFbb, pos); |
107 | // metadataBuffer = Akonadi2::GetMetadata(metadataData->Data()); | 55 | flatbuffers::Verifier verifier(resFbb.GetBufferPointer(), resFbb.GetSize()); |
108 | // } | 56 | if (!verifier.VerifyBuffer<DummyEvent>()) { |
109 | // } | 57 | Warning() << "Created invalid resource buffer"; |
110 | |||
111 | Akonadi2::Domain::Buffer::Event const *localBuffer = 0; | ||
112 | if (auto localData = entity.local()) { | ||
113 | flatbuffers::Verifier verifyer(localData->Data(), localData->size()); | ||
114 | if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) { | ||
115 | localBuffer = Akonadi2::Domain::Buffer::GetEvent(localData->Data()); | ||
116 | } | 58 | } |
117 | } | 59 | } |
118 | 60 | ||
119 | auto adaptor = QSharedPointer<DummyEventAdaptor>::create(); | 61 | Akonadi2::EntityBuffer::assembleEntityBuffer(fbb, 0, 0, resFbb.GetBufferPointer(), resFbb.GetSize(), localFbb.GetBufferPointer(), localFbb.GetSize()); |
120 | adaptor->mLocalBuffer = localBuffer; | ||
121 | adaptor->mLocalMapper = mLocalMapper; | ||
122 | adaptor->mResourceBuffer = resourceBuffer; | ||
123 | adaptor->mResourceMapper = mResourceMapper; | ||
124 | return adaptor; | ||
125 | } | ||
126 | |||
127 | void DummyEventAdaptorFactory::createBuffer(const Akonadi2::Domain::Event &event, flatbuffers::FlatBufferBuilder &fbb) | ||
128 | { | ||
129 | flatbuffers::FlatBufferBuilder eventFbb; | ||
130 | eventFbb.Clear(); | ||
131 | { | ||
132 | auto summary = eventFbb.CreateString(event.getProperty("summary").toString().toStdString()); | ||
133 | DummyCalendar::DummyEventBuilder eventBuilder(eventFbb); | ||
134 | eventBuilder.add_summary(summary); | ||
135 | auto eventLocation = eventBuilder.Finish(); | ||
136 | DummyCalendar::FinishDummyEventBuffer(eventFbb, eventLocation); | ||
137 | } | ||
138 | |||
139 | flatbuffers::FlatBufferBuilder localFbb; | ||
140 | { | ||
141 | auto uid = localFbb.CreateString(event.getProperty("uid").toString().toStdString()); | ||
142 | auto localBuilder = Akonadi2::Domain::Buffer::EventBuilder(localFbb); | ||
143 | localBuilder.add_uid(uid); | ||
144 | auto location = localBuilder.Finish(); | ||
145 | Akonadi2::Domain::Buffer::FinishEventBuffer(localFbb, location); | ||
146 | } | ||
147 | |||
148 | Akonadi2::EntityBuffer::assembleEntityBuffer(fbb, 0, 0, eventFbb.GetBufferPointer(), eventFbb.GetSize(), localFbb.GetBufferPointer(), localFbb.GetSize()); | ||
149 | } | 62 | } |
150 | 63 | ||