From e85967518b9041e9943ec5f1765c6694bb153840 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 12 Apr 2015 16:02:10 +0200 Subject: More generic domainadpator code. This should cover read and write for entites that have a 1:1 mapping to the resource buffers. --- dummyresource/domainadaptor.cpp | 91 ++++++----------------------------------- 1 file changed, 13 insertions(+), 78 deletions(-) (limited to 'dummyresource/domainadaptor.cpp') diff --git a/dummyresource/domainadaptor.cpp b/dummyresource/domainadaptor.cpp index 00af3fe..fa00bbc 100644 --- a/dummyresource/domainadaptor.cpp +++ b/dummyresource/domainadaptor.cpp @@ -9,49 +9,12 @@ #include "entity_generated.h" #include "metadata_generated.h" #include "domainadaptor.h" +#include "log.h" #include using namespace DummyCalendar; using namespace flatbuffers; -/** - * Defines how to convert qt primitives to flatbuffer ones - * TODO: rename to createProperty or so? - */ -template -uoffset_t extractProperty(const QVariant &, flatbuffers::FlatBufferBuilder &fbb); - -template <> -uoffset_t extractProperty(const QVariant &property, flatbuffers::FlatBufferBuilder &fbb) -{ - if (property.isValid()) { - return fbb.CreateString(property.toString().toStdString()).o; - } - return 0; -} - -/** - * Create a buffer from a domain object using the provided mappings - */ -template -void createBufferPart(const Akonadi2::ApplicationDomain::ApplicationDomainType &domainObject, flatbuffers::FlatBufferBuilder &fbb, const WritePropertyMapper &mapper) -{ - //First create a primitives such as strings using the mappings - QList > propertiesToAddToResource; - for (const auto &property : domainObject.changedProperties()) { - const auto value = domainObject.getProperty(property); - if (mapper.hasMapping(property)) { - mapper.setProperty(property, domainObject.getProperty(property), propertiesToAddToResource, fbb); - } - } - - //Then create all porperties using the above generated builderCalls - Builder builder(fbb); - for (auto propertyBuilder : propertiesToAddToResource) { - propertyBuilder(builder); - } - builder.Finish(); -} @@ -59,7 +22,6 @@ DummyEventAdaptorFactory::DummyEventAdaptorFactory() : DomainTypeAdaptorFactory() { //TODO turn this into initializeReadPropertyMapper as well? - mResourceMapper = QSharedPointer >::create(); mResourceMapper->addMapping("summary", [](DummyEvent const *buffer) -> QVariant { if (buffer->summary()) { return QString::fromStdString(buffer->summary()->c_str()); @@ -76,51 +38,24 @@ DummyEventAdaptorFactory::DummyEventAdaptorFactory() void DummyEventAdaptorFactory::createBuffer(const Akonadi2::ApplicationDomain::Event &event, flatbuffers::FlatBufferBuilder &fbb) { - // flatbuffers::FlatBufferBuilder resFbb; - // flatbuffers::FlatBufferBuilder localFbb; - - // QList > propertiesToAddToResource; - // QList > propertiesToAddToLocal; - // for (const auto &property : event.changedProperties()) { - // const auto value = event.getProperty(property); - // if (mResourceWriteMapper && mResourceWriteMapper->hasMapping(property)) { - // mResourceWriteMapper->setProperty(property, value, propertiesToAddToResource, resFbb); - // } if (mLocalWriteMapper && mLocalWriteMapper->hasMapping(property)) { - // mLocalWriteMapper->setProperty(property, value, propertiesToAddToLocal, localFbb); - // } - // } - - // DummyEventBuilder resBuilder(resFbb); - // for (auto propertyBuilder : propertiesToAddToResource) { - // propertyBuilder(resBuilder); - // } - // resBuilder.Finish(); - - // DummyEventBuilder localBuilder(localFbb); - // for (auto propertyBuilder : propertiesToAddToResource) { - // propertyBuilder(localBuilder); - // } - // localBuilder.Finish(); - - // TODO: how does a resource specify what goes to a local buffer and what it stores separately? - // flatbuffers::FlatBufferBuilder eventFbb; - // { - // auto summary = extractProperty(event.getProperty("summary"), fbb); - // DummyCalendar::DummyEventBuilder eventBuilder(eventFbb); - // eventBuilder.add_summary(summary); - // auto eventLocation = eventBuilder.Finish(); - // DummyCalendar::FinishDummyEventBuffer(eventFbb, eventLocation); - // } - - //TODO we should only copy values into the local buffer that haven't already been copied by the resource buffer flatbuffers::FlatBufferBuilder localFbb; if (mLocalWriteMapper) { - createBufferPart(event, localFbb, *mLocalWriteMapper); + auto pos = createBufferPart(event, localFbb, *mLocalWriteMapper); + Akonadi2::ApplicationDomain::Buffer::FinishEventBuffer(localFbb, pos); + flatbuffers::Verifier verifier(localFbb.GetBufferPointer(), localFbb.GetSize()); + if (!verifier.VerifyBuffer()) { + Warning() << "Created invalid local buffer"; + } } flatbuffers::FlatBufferBuilder resFbb; if (mResourceWriteMapper) { - createBufferPart(event, resFbb, *mResourceWriteMapper); + auto pos = createBufferPart(event, resFbb, *mResourceWriteMapper); + DummyCalendar::FinishDummyEventBuffer(resFbb, pos); + flatbuffers::Verifier verifier(resFbb.GetBufferPointer(), resFbb.GetSize()); + if (!verifier.VerifyBuffer()) { + Warning() << "Created invalid resource buffer"; + } } Akonadi2::EntityBuffer::assembleEntityBuffer(fbb, 0, 0, resFbb.GetBufferPointer(), resFbb.GetSize(), localFbb.GetBufferPointer(), localFbb.GetSize()); -- cgit v1.2.3