From 91d915a09b7d52c10edb1d4c1298fc2885b8a257 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 2 Jan 2015 22:39:25 +0100 Subject: DomainTypeAdaptor factory, per type preprocessor pipeline configuration. --- dummyresource/facade.cpp | 138 +++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 72 deletions(-) (limited to 'dummyresource/facade.cpp') 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 @@ using namespace DummyCalendar; using namespace flatbuffers; -/** - * The property mapper holds accessor functions for all properties. - * - * It is by default initialized with accessors that access the local-only buffer, - * and resource simply have to overwrite those accessors. - */ -template -class PropertyMapper +//This will become a generic implementation that simply takes the resource buffer and local buffer pointer +class DummyEventAdaptor : public Akonadi2::Domain::BufferAdaptor { public: - void setProperty(const QString &key, const QVariant &value, BufferType *buffer) + DummyEventAdaptor() + : BufferAdaptor() { - if (mWriteAccessors.contains(key)) { - auto accessor = mWriteAccessors.value(key); - return accessor(value, buffer); + + } + + void setProperty(const QString &key, const QVariant &value) + { + if (mResourceMapper->mWriteAccessors.contains(key)) { + // mResourceMapper.setProperty(key, value, mResourceBuffer); + } else { + // mLocalMapper.; } } - virtual QVariant getProperty(const QString &key, BufferType const *buffer) const + virtual QVariant getProperty(const QString &key) const { - if (mReadAccessors.contains(key)) { - auto accessor = mReadAccessors.value(key); - return accessor(buffer); + if (mResourceBuffer && mResourceMapper->mReadAccessors.contains(key)) { + return mResourceMapper->getProperty(key, mResourceBuffer); + } else if (mLocalBuffer) { + return mLocalMapper->getProperty(key, mLocalBuffer); } return QVariant(); } - QHash > mReadAccessors; - QHash > mWriteAccessors; + + Akonadi2::Domain::Buffer::Event const *mLocalBuffer; + DummyEvent const *mResourceBuffer; + + QSharedPointer > mLocalMapper; + QSharedPointer > mResourceMapper; }; +template<> +QSharedPointer DomainTypeAdaptorFactory::createAdaptor(const Akonadi2::Entity &entity) +{ + DummyEvent const *resourceBuffer = 0; + if (auto resourceData = entity.resource()) { + flatbuffers::Verifier verifyer(resourceData->Data(), resourceData->size()); + if (VerifyDummyEventBuffer(verifyer)) { + resourceBuffer = GetDummyEvent(resourceData); + } + } + + Akonadi2::Metadata const *metadataBuffer = 0; + if (auto metadataData = entity.metadata()) { + flatbuffers::Verifier verifyer(metadataData->Data(), metadataData->size()); + if (Akonadi2::VerifyMetadataBuffer(verifyer)) { + metadataBuffer = Akonadi2::GetMetadata(metadataData); + } + } + + Akonadi2::Domain::Buffer::Event const *localBuffer = 0; + if (auto localData = entity.local()) { + flatbuffers::Verifier verifyer(localData->Data(), localData->size()); + if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) { + localBuffer = Akonadi2::Domain::Buffer::GetEvent(localData); + } + } + + auto adaptor = QSharedPointer::create(); + adaptor->mLocalBuffer = localBuffer; + adaptor->mResourceBuffer = resourceBuffer; + adaptor->mResourceMapper = mResourceMapper; + adaptor->mLocalMapper = mLocalMapper; + return adaptor; +} + DummyResourceFacade::DummyResourceFacade() : Akonadi2::StoreFacade(), - mResourceAccess(new Akonadi2::ResourceAccess("org.kde.dummy")) + mResourceAccess(new Akonadi2::ResourceAccess("org.kde.dummy")), + mFactory(new DomainTypeAdaptorFactory()) { - PropertyMapper mapper; - mapper.mReadAccessors.insert("summary", [](DummyEvent const *buffer) -> QVariant { + auto mapper = QSharedPointer >::create(); + mapper->mReadAccessors.insert("summary", [](DummyEvent const *buffer) -> QVariant { return QString::fromStdString(buffer->summary()->c_str()); }); + mFactory->mResourceMapper = mapper; } DummyResourceFacade::~DummyResourceFacade() @@ -105,45 +148,6 @@ void DummyResourceFacade::remove(const Akonadi2::Domain::Event &domainObject) // -//This will become a generic implementation that simply takes the resource buffer and local buffer pointer -class DummyEventAdaptor : public Akonadi2::Domain::BufferAdaptor -{ -public: - DummyEventAdaptor() - : BufferAdaptor() - { - - } - - void setProperty(const QString &key, const QVariant &value) - { - if (mResourceMapper.mWriteAccessors.contains(key)) { - // mResourceMapper.setProperty(key, value, mResourceBuffer); - } else { - // mLocalMapper.; - } - } - - virtual QVariant getProperty(const QString &key) const - { - if (mResourceBuffer && mResourceMapper.mReadAccessors.contains(key)) { - return mResourceMapper.getProperty(key, mResourceBuffer); - } else if (mLocalBuffer) { - return mLocalMapper.getProperty(key, mLocalBuffer); - } - return QVariant(); - } - - Akonadi2::Domain::Buffer::Event const *mLocalBuffer; - DummyEvent const *mResourceBuffer; - - PropertyMapper mLocalMapper; - PropertyMapper mResourceMapper; - - //Keep query alive so values remain valid - QSharedPointer storage; -}; - static std::function prepareQuery(const Akonadi2::Query &query) { //Compose some functions to make query matching fast. @@ -225,26 +229,16 @@ void DummyResourceFacade::load(const Akonadi2::Query &query, const std::function } } - Akonadi2::Domain::Buffer::Event const *localBuffer = 0; - if (auto localData = buffer.localBuffer()) { - flatbuffers::Verifier verifyer(localData->Data(), localData->size()); - if (Akonadi2::Domain::Buffer::VerifyEventBuffer(verifyer)) { - localBuffer = Akonadi2::Domain::Buffer::GetEvent(localData); - } - } - if (!resourceBuffer || !metadataBuffer) { qWarning() << "invalid buffer " << QString::fromStdString(std::string(static_cast(keyValue), keySize)); return true; } //We probably only want to create all buffers after the scan + //TODO use adapter for query and scan? if (preparedQuery && preparedQuery(std::string(static_cast(keyValue), keySize), resourceBuffer)) { qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1; - auto adaptor = QSharedPointer::create(); - adaptor->mLocalBuffer = localBuffer; - adaptor->mResourceBuffer = resourceBuffer; - adaptor->storage = storage; + auto adaptor = mFactory->createAdaptor(buffer.entity()); auto event = QSharedPointer::create("org.kde.dummy", QString::fromUtf8(static_cast(keyValue), keySize), revision, adaptor); resultCallback(event); } -- cgit v1.2.3