From ea348c62fdebe1d9c6531fc4491d3316a1e941df Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 10 Apr 2015 12:32:03 +0200 Subject: checkpoint --- common/clientapi.h | 2 + common/domainadaptor.cpp | 8 ++-- common/domainadaptor.h | 112 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 93 insertions(+), 29 deletions(-) (limited to 'common') diff --git a/common/clientapi.h b/common/clientapi.h index 5182547..22448b3 100644 --- a/common/clientapi.h +++ b/common/clientapi.h @@ -234,6 +234,8 @@ public: virtual QVariant getProperty(const QByteArray &key) const { return mAdaptor->getProperty(key); } virtual void setProperty(const QByteArray &key, const QVariant &value){ mChangeSet.insert(key, value); mAdaptor->setProperty(key, value); } + virtual QByteArrayList changedProperties() const { return mChangeSet.keys(); } + qint64 revision() const { return mRevision; } private: QSharedPointer mAdaptor; diff --git a/common/domainadaptor.cpp b/common/domainadaptor.cpp index 5b7c427..5e6f062 100644 --- a/common/domainadaptor.cpp +++ b/common/domainadaptor.cpp @@ -20,16 +20,16 @@ #include "domainadaptor.h" template <> -QSharedPointer > initializePropertyMapper() +QSharedPointer > initializeReadPropertyMapper() { - auto propertyMapper = QSharedPointer >::create(); - propertyMapper->mReadAccessors.insert("summary", [](Akonadi2::ApplicationDomain::Buffer::Event const *buffer) -> QVariant { + auto propertyMapper = QSharedPointer >::create(); + propertyMapper->addMapping("summary", [](Akonadi2::ApplicationDomain::Buffer::Event const *buffer) -> QVariant { if (buffer->summary()) { return QString::fromStdString(buffer->summary()->c_str()); } return QVariant(); }); - propertyMapper->mReadAccessors.insert("uid", [](Akonadi2::ApplicationDomain::Buffer::Event const *buffer) -> QVariant { + propertyMapper->addMapping("uid", [](Akonadi2::ApplicationDomain::Buffer::Event const *buffer) -> QVariant { if (buffer->uid()) { return QString::fromStdString(buffer->uid()->c_str()); } diff --git a/common/domainadaptor.h b/common/domainadaptor.h index 15e3067..5d9574b 100644 --- a/common/domainadaptor.h +++ b/common/domainadaptor.h @@ -38,17 +38,9 @@ * that extract the properties from resource types. */ template -class PropertyMapper +class ReadPropertyMapper { public: - void setProperty(const QByteArray &key, const QVariant &value, BufferType *buffer) - { - if (mWriteAccessors.contains(key)) { - auto accessor = mWriteAccessors.value(key); - return accessor(value, buffer); - } - } - virtual QVariant getProperty(const QByteArray &key, BufferType const *buffer) const { if (mReadAccessors.contains(key)) { @@ -57,12 +49,38 @@ public: } return QVariant(); } + bool hasMapping(const QByteArray &key) const { return mReadAccessors.contains(key); } + QList availableProperties() const { return mReadAccessors.keys(); } + void addMapping(const QByteArray &property, const std::function &mapping) { + mReadAccessors.insert(property, mapping); + } +private: QHash > mReadAccessors; - QHash > mWriteAccessors; +}; + +template +class WritePropertyMapper +{ +public: + virtual void setProperty(const QByteArray &key, const QVariant &value, QList > &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const + { + if (mWriteAccessors.contains(key)) { + auto accessor = mWriteAccessors.value(key); + builderCalls << accessor(value, fbb); + } + } + bool hasMapping(const QByteArray &key) const { return mWriteAccessors.contains(key); } + void addMapping(const QByteArray &property, const std::function(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) { + mWriteAccessors.insert(property, mapping); + } +private: + QHash(const QVariant &, flatbuffers::FlatBufferBuilder &)> > mWriteAccessors; }; /** * A generic adaptor implementation that uses a property mapper to read/write values. + * + * TODO: this is the read-only part. Create a write only equivalent */ template class GenericBufferAdaptor : public Akonadi2::ApplicationDomain::BufferAdaptor @@ -74,20 +92,21 @@ public: } + //TODO remove void setProperty(const QByteArray &key, const QVariant &value) { - if (mResourceMapper && mResourceMapper->mWriteAccessors.contains(key)) { - // mResourceMapper->setProperty(key, value, mResourceBuffer); - } else { - // mLocalMapper.; - } + // if (mResourceMapper && mResourceMapper->hasMapping(key)) { + // // mResourceMapper->setProperty(key, value, mResourceBuffer); + // } else { + // // mLocalMapper.; + // } } virtual QVariant getProperty(const QByteArray &key) const { - if (mResourceBuffer && mResourceMapper->mReadAccessors.contains(key)) { + if (mResourceBuffer && mResourceMapper->hasMapping(key)) { return mResourceMapper->getProperty(key, mResourceBuffer); - } else if (mLocalBuffer && mLocalMapper->mReadAccessors.contains(key)) { + } else if (mLocalBuffer && mLocalMapper->hasMapping(key)) { return mLocalMapper->getProperty(key, mLocalBuffer); } qWarning() << "no mapping available for key " << key; @@ -97,15 +116,58 @@ public: virtual QList availableProperties() const { QList props; - props << mResourceMapper->mReadAccessors.keys(); - props << mLocalMapper->mReadAccessors.keys(); + props << mResourceMapper->availableProperties(); + props << mLocalMapper->availableProperties(); return props; } LocalBuffer const *mLocalBuffer; ResourceBuffer const *mResourceBuffer; - QSharedPointer > mLocalMapper; - QSharedPointer > mResourceMapper; + QSharedPointer > mLocalMapper; + QSharedPointer > mResourceMapper; +}; + +/** + * A generic adaptor implementation that uses a property mapper to read/write values. + */ +template +class GenericWriteBufferAdaptor : public Akonadi2::ApplicationDomain::BufferAdaptor +{ +public: + GenericWriteBufferAdaptor(const BufferAdaptor &buffer) + : BufferAdaptor() + { + for(const auto &property : buffer.availableProperties()) { + setProperty(property, buffer.getProperty(property)); + } + } + + void setProperty(const QByteArray &key, const QVariant &value) + { + // if (mResourceMapper && mResourceMapper->hasMapping(key)) { + // // mResourceMapper->setProperty(key, value, mResourceBuffer); + // } else { + // // mLocalMapper.; + // } + } + + //TODO remove + virtual QVariant getProperty(const QByteArray &key) const + { + Q_ASSERT(false); + } + + virtual QList availableProperties() const + { + Q_ASSERT(false); + QList props; + return props; + } + + // LocalBuffer const *mLocalBuffer; + // ResourceBuffer const *mResourceBuffer; + QSharedPointer > mLocalMapper; + QSharedPointer > mResourceMapper; }; /** @@ -114,7 +176,7 @@ public: * Provide an implementation for each application domain type. */ template -QSharedPointer > initializePropertyMapper(); +QSharedPointer > initializeReadPropertyMapper(); /** * The factory should define how to go from an entitybuffer (local + resource buffer), to a domain type adapter. @@ -125,7 +187,7 @@ template class DomainTypeAdaptorFactory { public: - DomainTypeAdaptorFactory() : mLocalMapper(initializePropertyMapper()) {}; + DomainTypeAdaptorFactory() : mLocalMapper(initializeReadPropertyMapper()) {}; virtual ~DomainTypeAdaptorFactory() {}; /** @@ -150,8 +212,8 @@ public: virtual void createBuffer(const Akonadi2::ApplicationDomain::Event &event, flatbuffers::FlatBufferBuilder &fbb) {}; protected: - QSharedPointer > mLocalMapper; - QSharedPointer > mResourceMapper; + QSharedPointer > mLocalMapper; + QSharedPointer > mResourceMapper; }; -- cgit v1.2.3