From d5b28efe4d7fc2a984243417d923ff5727234e94 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 19 Jan 2016 12:39:45 +0100 Subject: Added bufferutils.h --- common/bufferutils.h | 26 ++++++++++++++++++++++++++ common/facade.cpp | 5 +++-- common/genericresource.cpp | 18 ++++++++++-------- common/pipeline.cpp | 5 +++-- common/resourceaccess.cpp | 5 +++-- 5 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 common/bufferutils.h (limited to 'common') diff --git a/common/bufferutils.h b/common/bufferutils.h new file mode 100644 index 0000000..b0fb75a --- /dev/null +++ b/common/bufferutils.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +namespace Akonadi2 { +namespace BufferUtils { + template + static QByteArray extractBuffer(const T *data) + { + return QByteArray::fromRawData(reinterpret_cast(data->Data()), data->size()); + } + + template + static QByteArray extractBufferCopy(const T *data) + { + return QByteArray(reinterpret_cast(data->Data()), data->size()); + } + + static QByteArray extractBuffer(const flatbuffers::FlatBufferBuilder &fbb) + { + return QByteArray::fromRawData(reinterpret_cast(fbb.GetBufferPointer()), fbb.GetSize()); + } +} +} + diff --git a/common/facade.cpp b/common/facade.cpp index 22ef84a..91021db 100644 --- a/common/facade.cpp +++ b/common/facade.cpp @@ -25,6 +25,7 @@ #include "definitions.h" #include "domainadaptor.h" #include "queryrunner.h" +#include "bufferutils.h" using namespace Akonadi2; @@ -113,7 +114,7 @@ KAsync::Job GenericFacade::create(const DomainType &domainObje } flatbuffers::FlatBufferBuilder entityFbb; mDomainTypeAdaptorFactory->createBuffer(domainObject, entityFbb); - return mResourceAccess->sendCreateCommand(bufferTypeForDomainType(), QByteArray::fromRawData(reinterpret_cast(entityFbb.GetBufferPointer()), entityFbb.GetSize())); + return mResourceAccess->sendCreateCommand(bufferTypeForDomainType(), BufferUtils::extractBuffer(entityFbb)); } template @@ -125,7 +126,7 @@ KAsync::Job GenericFacade::modify(const DomainType &domainObje } flatbuffers::FlatBufferBuilder entityFbb; mDomainTypeAdaptorFactory->createBuffer(domainObject, entityFbb); - return mResourceAccess->sendModifyCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType(), QByteArrayList(), QByteArray::fromRawData(reinterpret_cast(entityFbb.GetBufferPointer()), entityFbb.GetSize())); + return mResourceAccess->sendModifyCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType(), QByteArrayList(), BufferUtils::extractBuffer(entityFbb)); } template diff --git a/common/genericresource.cpp b/common/genericresource.cpp index 892c3db..40e3add 100644 --- a/common/genericresource.cpp +++ b/common/genericresource.cpp @@ -12,6 +12,7 @@ #include "index.h" #include "log.h" #include "definitions.h" +#include "bufferutils.h" #include #include @@ -301,11 +302,12 @@ GenericResource::GenericResource(const QByteArray &resourceInstanceIdentifier, c if (Akonadi2::Commands::VerifyInspectionBuffer(verifier)) { auto buffer = Akonadi2::Commands::GetInspection(command); int inspectionType = buffer->type(); - QByteArray inspectionId = QByteArray::fromRawData(reinterpret_cast(buffer->id()->Data()), buffer->id()->size()); - QByteArray entityId = QByteArray::fromRawData(reinterpret_cast(buffer->entityId()->Data()), buffer->entityId()->size()); - QByteArray domainType = QByteArray::fromRawData(reinterpret_cast(buffer->domainType()->Data()), buffer->domainType()->size()); - QByteArray property = QByteArray::fromRawData(reinterpret_cast(buffer->property()->Data()), buffer->property()->size()); - QByteArray expectedValueString = QByteArray::fromRawData(reinterpret_cast(buffer->expectedValue()->Data()), buffer->expectedValue()->size()); + + QByteArray inspectionId = BufferUtils::extractBuffer(buffer->id()); + QByteArray entityId = BufferUtils::extractBuffer(buffer->entityId()); + QByteArray domainType = BufferUtils::extractBuffer(buffer->domainType()); + QByteArray property = BufferUtils::extractBuffer(buffer->property()); + QByteArray expectedValueString = BufferUtils::extractBuffer(buffer->expectedValue()); QDataStream s(expectedValueString); QVariant expectedValue; s >> expectedValue; @@ -518,7 +520,7 @@ void GenericResource::createEntity(const QByteArray &akonadiId, const QByteArray auto delta = Akonadi2::EntityBuffer::appendAsVector(fbb, entityFbb.GetBufferPointer(), entityFbb.GetSize()); auto location = Akonadi2::Commands::CreateCreateEntity(fbb, entityId, type, delta, replayToSource); Akonadi2::Commands::FinishCreateEntityBuffer(fbb, location); - callback(QByteArray::fromRawData(reinterpret_cast(fbb.GetBufferPointer()), fbb.GetSize())); + callback(BufferUtils::extractBuffer(fbb)); } void GenericResource::modifyEntity(const QByteArray &akonadiId, qint64 revision, const QByteArray &bufferType, const Akonadi2::ApplicationDomain::ApplicationDomainType &domainObject, DomainTypeAdaptorFactoryInterface &adaptorFactory, std::function callback) @@ -535,7 +537,7 @@ void GenericResource::modifyEntity(const QByteArray &akonadiId, qint64 revision, //TODO removals auto location = Akonadi2::Commands::CreateModifyEntity(fbb, revision, entityId, 0, type, delta, replayToSource); Akonadi2::Commands::FinishModifyEntityBuffer(fbb, location); - callback(QByteArray::fromRawData(reinterpret_cast(fbb.GetBufferPointer()), fbb.GetSize())); + callback(BufferUtils::extractBuffer(fbb)); } void GenericResource::deleteEntity(const QByteArray &akonadiId, qint64 revision, const QByteArray &bufferType, std::function callback) @@ -548,7 +550,7 @@ void GenericResource::deleteEntity(const QByteArray &akonadiId, qint64 revision, auto type = fbb.CreateString(bufferType.toStdString()); auto location = Akonadi2::Commands::CreateDeleteEntity(fbb, revision, entityId, type, replayToSource); Akonadi2::Commands::FinishDeleteEntityBuffer(fbb, location); - callback(QByteArray::fromRawData(reinterpret_cast(fbb.GetBufferPointer()), fbb.GetSize())); + callback(BufferUtils::extractBuffer(fbb)); } void GenericResource::recordRemoteId(const QByteArray &bufferType, const QByteArray &localId, const QByteArray &remoteId, Akonadi2::Storage::Transaction &transaction) diff --git a/common/pipeline.cpp b/common/pipeline.cpp index 06d8114..a087def 100644 --- a/common/pipeline.cpp +++ b/common/pipeline.cpp @@ -34,6 +34,7 @@ #include "log.h" #include "domain/applicationdomaintype.h" #include "definitions.h" +#include "bufferutils.h" namespace Akonadi2 { @@ -119,7 +120,7 @@ Storage &Pipeline::storage() const void Pipeline::storeNewRevision(qint64 newRevision, const flatbuffers::FlatBufferBuilder &fbb, const QByteArray &bufferType, const QByteArray &uid) { - d->transaction.openDatabase(bufferType + ".main").write(Akonadi2::Storage::assembleKey(uid, newRevision), QByteArray::fromRawData(reinterpret_cast(fbb.GetBufferPointer()), fbb.GetSize()), + d->transaction.openDatabase(bufferType + ".main").write(Akonadi2::Storage::assembleKey(uid, newRevision), BufferUtils::extractBuffer(fbb), [](const Akonadi2::Storage::Error &error) { Warning() << "Failed to write entity"; } @@ -285,7 +286,7 @@ KAsync::Job Pipeline::modifiedEntity(void const *command, size_t size) //Remove deletions if (modifyEntity->deletions()) { for (const auto &property : *modifyEntity->deletions()) { - newObject->setProperty(QByteArray::fromRawData(property->data(), property->size()), QVariant()); + newObject->setProperty(BufferUtils::extractBuffer(property), QVariant()); } } diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp index d2aa969..6540e98 100644 --- a/common/resourceaccess.cpp +++ b/common/resourceaccess.cpp @@ -32,6 +32,7 @@ #include "common/revisionreplayed_generated.h" #include "common/inspection_generated.h" #include "common/entitybuffer.h" +#include "common/bufferutils.h" #include "log.h" #include @@ -551,11 +552,11 @@ bool ResourceAccess::processMessageBuffer() ResourceNotification n; if (buffer->identifier()) { //Don't use fromRawData, the buffer is gone once we invoke emit notification - n.id = QByteArray(reinterpret_cast(buffer->identifier()->Data()), buffer->identifier()->size()); + n.id = BufferUtils::extractBufferCopy(buffer->identifier()); } if (buffer->message()) { //Don't use fromRawData, the buffer is gone once we invoke emit notification - n.message = QByteArray(reinterpret_cast(buffer->message()->Data()), buffer->message()->size()); + n.message = BufferUtils::extractBufferCopy(buffer->message()); } n.type = buffer->type(); n.code = buffer->code(); -- cgit v1.2.3