From c83c2ef64b5a1e4b1dc0102df36687caebb96ff0 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 24 Dec 2014 02:15:41 +0100 Subject: unifying buffer, and a better way to implement domain object adapters. --- common/pipeline.cpp | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) (limited to 'common/pipeline.cpp') diff --git a/common/pipeline.cpp b/common/pipeline.cpp index 739909d..5ca8b95 100644 --- a/common/pipeline.cpp +++ b/common/pipeline.cpp @@ -23,6 +23,9 @@ #include #include #include +#include +#include "entitybuffer_generated.h" +#include "metadata_generated.h" namespace Akonadi2 { @@ -69,11 +72,40 @@ void Pipeline::null() state.step(); } -void Pipeline::newEntity(const QByteArray &key, flatbuffers::FlatBufferBuilder &entity) +void Pipeline::newEntity(const QByteArray &key, void *resourceBufferData, size_t size) { const qint64 newRevision = storage().maxRevision() + 1; - //FIXME this should go into a preprocessor - storage().write(key, key.size(), reinterpret_cast(entity.GetBufferPointer()), entity.GetSize()); + + flatbuffers::FlatBufferBuilder fbb; + auto builder = Akonadi2::EntityBufferBuilder(fbb); + + //Add metadata buffer + { + flatbuffers::FlatBufferBuilder metadataFbb; + auto metadataBuilder = Akonadi2::MetadataBuilder(metadataFbb); + metadataBuilder.add_revision(newRevision); + auto metadataBuffer = metadataBuilder.Finish(); + Akonadi2::FinishMetadataBuffer(fbb, metadataBuffer); + //TODO use memcpy + auto metadata = fbb.CreateVector(metadataFbb.GetBufferPointer(), metadataFbb.GetSize()); + builder.add_metadata(metadata); + } + + //Add resource buffer + { + //TODO use memcpy + auto resource = fbb.CreateVector(static_cast(resourceBufferData), size); + builder.add_resource(resource); + } + + //We don't have a local buffer yet + // builder.add_local(); + + auto buffer = builder.Finish(); + Akonadi2::FinishEntityBufferBuffer(fbb, buffer); + + qDebug() << "writing new entity" << key; + storage().write(key.data(), key.size(), fbb.GetBufferPointer(), fbb.GetSize()); storage().setMaxRevision(newRevision); PipelineState state(this, NewPipeline, key, d->newPipeline); @@ -81,7 +113,7 @@ void Pipeline::newEntity(const QByteArray &key, flatbuffers::FlatBufferBuilder & state.step(); } -void Pipeline::modifiedEntity(const QByteArray &key, flatbuffers::FlatBufferBuilder &entityDelta) +void Pipeline::modifiedEntity(const QByteArray &key, void *data, size_t size) { PipelineState state(this, ModifiedPipeline, key, d->modifiedPipeline); d->activePipelines << state; -- cgit v1.2.3