From 9e002cca99ad176fd9168123955cc0779a4e1237 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 10 May 2016 14:26:33 +0200 Subject: Property definitions Instead of hardcoding assumptions all over the place we create typesafe setters and getters for all properties. --- common/domain/applicationdomaintype.h | 94 ++++++++++++++++++++++++++++------- common/domain/event.cpp | 16 +++--- common/domain/folder.cpp | 16 +++--- common/domain/mail.cpp | 41 +++++++-------- common/propertymapper.h | 50 +++++++++---------- 5 files changed, 138 insertions(+), 79 deletions(-) (limited to 'common') diff --git a/common/domain/applicationdomaintype.h b/common/domain/applicationdomaintype.h index eadad00..4eec4a3 100644 --- a/common/domain/applicationdomaintype.h +++ b/common/domain/applicationdomaintype.h @@ -23,12 +23,56 @@ #include #include #include +#include #include #include #include "bufferadaptor.h" -namespace Sink { +#define SINK_ENTITY(TYPE) \ + typedef QSharedPointer Ptr; \ + using Entity::Entity; \ + virtual ~TYPE(); \ + + +#define SINK_PROPERTY(TYPE, NAME, LOWERCASENAME) \ + struct NAME { \ + static constexpr const char *name = #LOWERCASENAME; \ + typedef TYPE Type; \ + }; \ + void set##NAME(const TYPE &value) { setProperty(NAME::name, QVariant::fromValue(value)); } \ + TYPE get##NAME() const { return getProperty(NAME::name).value(); } \ + + +#define SINK_EXTRACTED_PROPERTY(TYPE, NAME, LOWERCASENAME) \ + struct NAME { \ + static constexpr const char *name = #LOWERCASENAME; \ + typedef TYPE Type; \ + }; \ + void setExtracted##NAME(const TYPE &value) { setProperty(NAME::name, QVariant::fromValue(value)); } \ + TYPE get##NAME() const { return getProperty(NAME::name).value(); } \ + + +#define SINK_BLOB_PROPERTY(NAME, LOWERCASENAME) \ + struct NAME { \ + static constexpr const char *name = #LOWERCASENAME; \ + typedef QString Type; \ + }; \ + void set##NAME(const QByteArray &value) { setBlobProperty(NAME::name, value); } \ + void set##NAME##Path(const QString &path) { setProperty(NAME::name, QVariant::fromValue(path)); } \ + QByteArray get##NAME() const { return getBlobProperty(NAME::name); } \ + QString get##NAME##Path() const { return getProperty(NAME::name).value(); } \ + +#define SINK_REFERENCE_PROPERTY(TYPE, NAME, LOWERCASENAME) \ + struct NAME { \ + static constexpr const char *name = #LOWERCASENAME; \ + typedef QByteArray Type; \ + }; \ + void set##NAME(const ApplicationDomain::TYPE &value) { setProperty(NAME::name, value); } \ + void set##NAME(const QByteArray &value) { setProperty(NAME::name, QVariant::fromValue(value)); } \ + QByteArray get##NAME() const { return getProperty(NAME::name).value(); } \ + +namespace Sink { namespace ApplicationDomain { /** @@ -128,33 +172,41 @@ struct SINK_EXPORT Entity : public ApplicationDomainType { }; struct SINK_EXPORT Event : public Entity { - typedef QSharedPointer Ptr; - using Entity::Entity; - virtual ~Event(); + SINK_ENTITY(Event); + SINK_PROPERTY(QString, Uid, uid); + SINK_PROPERTY(QString, Summary, summary); + SINK_PROPERTY(QString, Description, description); + SINK_PROPERTY(QByteArray, Attachment, attachment); }; struct SINK_EXPORT Todo : public Entity { - typedef QSharedPointer Ptr; - using Entity::Entity; - virtual ~Todo(); + SINK_ENTITY(Todo); }; struct SINK_EXPORT Calendar : public Entity { - typedef QSharedPointer Ptr; - using Entity::Entity; - virtual ~Calendar(); + SINK_ENTITY(Calendar); }; -struct SINK_EXPORT Mail : public Entity { - typedef QSharedPointer Ptr; - using Entity::Entity; - virtual ~Mail(); +struct SINK_EXPORT Folder : public Entity { + SINK_ENTITY(Folder); + SINK_REFERENCE_PROPERTY(Folder, Parent, parent); + SINK_PROPERTY(QString, Name, name); + SINK_PROPERTY(QByteArray, Icon, icon); + SINK_PROPERTY(QByteArrayList, SpecialPurpose, specialpurpose); }; -struct SINK_EXPORT Folder : public Entity { - typedef QSharedPointer Ptr; - using Entity::Entity; - virtual ~Folder(); +struct SINK_EXPORT Mail : public Entity { + SINK_ENTITY(Mail); + SINK_PROPERTY(QString, Uid, uid); + SINK_EXTRACTED_PROPERTY(QString, Sender, sender); + SINK_EXTRACTED_PROPERTY(QString, SenderName, senderName); + SINK_EXTRACTED_PROPERTY(QString, Subject, subject); + SINK_EXTRACTED_PROPERTY(QDateTime, Date, date); + SINK_PROPERTY(bool, Unread, unread); + SINK_PROPERTY(bool, Important, important); + SINK_REFERENCE_PROPERTY(Folder, Folder, folder); + SINK_BLOB_PROPERTY(MimeMessage, mimeMessage); + SINK_PROPERTY(bool, Draft, draft); }; /** @@ -235,6 +287,12 @@ class SINK_EXPORT TypeImplementation; } } +#undef SINK_ENTITY +#undef SINK_PROPERTY +#undef SINK_EXTRACTED_PROPERTY +#undef SINK_BLOB_PROPERTY +#undef SINK_REFERENCE_PROPERTY + Q_DECLARE_METATYPE(Sink::ApplicationDomain::ApplicationDomainType) Q_DECLARE_METATYPE(Sink::ApplicationDomain::ApplicationDomainType::Ptr) Q_DECLARE_METATYPE(Sink::ApplicationDomain::Entity) diff --git a/common/domain/event.cpp b/common/domain/event.cpp index 96e2d44..0909bf1 100644 --- a/common/domain/event.cpp +++ b/common/domain/event.cpp @@ -68,19 +68,19 @@ void TypeImplementation::removeIndex(const QByteArray &identifier, const QSharedPointer::Buffer> > TypeImplementation::initializeReadPropertyMapper() { auto propertyMapper = QSharedPointer >::create(); - propertyMapper->addMapping("summary", &Buffer::summary); - propertyMapper->addMapping("description", &Buffer::description); - propertyMapper->addMapping("uid", &Buffer::uid); - propertyMapper->addMapping("attachment", &Buffer::attachment); + propertyMapper->addMapping(&Buffer::summary); + propertyMapper->addMapping(&Buffer::description); + propertyMapper->addMapping(&Buffer::uid); + propertyMapper->addMapping(&Buffer::attachment); return propertyMapper; } QSharedPointer::BufferBuilder> > TypeImplementation::initializeWritePropertyMapper() { auto propertyMapper = QSharedPointer >::create(); - propertyMapper->addMapping("summary", &BufferBuilder::add_summary); - propertyMapper->addMapping("description", &BufferBuilder::add_description); - propertyMapper->addMapping("uid", &BufferBuilder::add_uid); - propertyMapper->addMapping("attachment", &BufferBuilder::add_attachment); + propertyMapper->addMapping(&BufferBuilder::add_summary); + propertyMapper->addMapping(&BufferBuilder::add_description); + propertyMapper->addMapping(&BufferBuilder::add_uid); + propertyMapper->addMapping(&BufferBuilder::add_attachment); return propertyMapper; } diff --git a/common/domain/folder.cpp b/common/domain/folder.cpp index faad5a9..309ca3f 100644 --- a/common/domain/folder.cpp +++ b/common/domain/folder.cpp @@ -70,19 +70,19 @@ void TypeImplementation::removeIndex(const QByteArray &identifier, const QSharedPointer::Buffer> > TypeImplementation::initializeReadPropertyMapper() { auto propertyMapper = QSharedPointer >::create(); - propertyMapper->addMapping("parent", &Buffer::parent); - propertyMapper->addMapping("name", &Buffer::name); - propertyMapper->addMapping("icon", &Buffer::icon); - propertyMapper->addMapping("specialpurpose", &Buffer::specialpurpose); + propertyMapper->addMapping(&Buffer::parent); + propertyMapper->addMapping(&Buffer::name); + propertyMapper->addMapping(&Buffer::icon); + propertyMapper->addMapping(&Buffer::specialpurpose); return propertyMapper; } QSharedPointer::BufferBuilder> > TypeImplementation::initializeWritePropertyMapper() { auto propertyMapper = QSharedPointer >::create(); - propertyMapper->addMapping("parent", &BufferBuilder::add_parent); - propertyMapper->addMapping("name", &BufferBuilder::add_name); - propertyMapper->addMapping("icon", &BufferBuilder::add_icon); - propertyMapper->addMapping("specialpurpose", &BufferBuilder::add_specialpurpose); + propertyMapper->addMapping(&BufferBuilder::add_parent); + propertyMapper->addMapping(&BufferBuilder::add_name); + propertyMapper->addMapping(&BufferBuilder::add_icon); + propertyMapper->addMapping(&BufferBuilder::add_specialpurpose); return propertyMapper; } diff --git a/common/domain/mail.cpp b/common/domain/mail.cpp index 2f3973a..706e410 100644 --- a/common/domain/mail.cpp +++ b/common/domain/mail.cpp @@ -75,31 +75,32 @@ void TypeImplementation::removeIndex(const QByteArray &identifier, const B QSharedPointer::Buffer> > TypeImplementation::initializeReadPropertyMapper() { auto propertyMapper = QSharedPointer >::create(); - propertyMapper->addMapping("uid", &Buffer::uid); - propertyMapper->addMapping("sender", &Buffer::sender); - propertyMapper->addMapping("senderName", &Buffer::senderName); - propertyMapper->addMapping("subject", &Buffer::subject); - propertyMapper->addMapping("date", &Buffer::date); - propertyMapper->addMapping("unread", &Buffer::unread); - propertyMapper->addMapping("important", &Buffer::important); - propertyMapper->addMapping("folder", &Buffer::folder); - propertyMapper->addMapping("mimeMessage", &Buffer::mimeMessage); - propertyMapper->addMapping("draft", &Buffer::draft); + propertyMapper->addMapping(&Buffer::uid); + propertyMapper->addMapping(&Buffer::sender); + propertyMapper->addMapping(&Buffer::senderName); + propertyMapper->addMapping(&Buffer::subject); + propertyMapper->addMapping(&Buffer::date); + propertyMapper->addMapping(&Buffer::unread); + propertyMapper->addMapping(&Buffer::important); + propertyMapper->addMapping(&Buffer::folder); + propertyMapper->addMapping(&Buffer::mimeMessage); + propertyMapper->addMapping(&Buffer::draft); return propertyMapper; } QSharedPointer::BufferBuilder> > TypeImplementation::initializeWritePropertyMapper() { auto propertyMapper = QSharedPointer >::create(); - propertyMapper->addMapping("uid", &BufferBuilder::add_uid); - propertyMapper->addMapping("sender", &BufferBuilder::add_sender); - propertyMapper->addMapping("senderName", &BufferBuilder::add_senderName); - propertyMapper->addMapping("subject", &BufferBuilder::add_subject); - propertyMapper->addMapping("date", &BufferBuilder::add_date); - propertyMapper->addMapping("unread", &BufferBuilder::add_unread); - propertyMapper->addMapping("important", &BufferBuilder::add_important); - propertyMapper->addMapping("folder", &BufferBuilder::add_folder); - propertyMapper->addMapping("mimeMessage", &BufferBuilder::add_mimeMessage); - propertyMapper->addMapping("draft", &BufferBuilder::add_draft); + + propertyMapper->addMapping(&BufferBuilder::add_uid); + propertyMapper->addMapping(&BufferBuilder::add_sender); + propertyMapper->addMapping(&BufferBuilder::add_senderName); + propertyMapper->addMapping(&BufferBuilder::add_subject); + propertyMapper->addMapping(&BufferBuilder::add_date); + propertyMapper->addMapping(&BufferBuilder::add_unread); + propertyMapper->addMapping(&BufferBuilder::add_important); + propertyMapper->addMapping(&BufferBuilder::add_folder); + propertyMapper->addMapping(&BufferBuilder::add_mimeMessage); + propertyMapper->addMapping(&BufferBuilder::add_draft); return propertyMapper; } diff --git a/common/propertymapper.h b/common/propertymapper.h index edbc7f1..8227940 100644 --- a/common/propertymapper.h +++ b/common/propertymapper.h @@ -78,33 +78,33 @@ public: } template - void addMapping(const QByteArray &name, const flatbuffers::String *(Buffer::*f)() const) + void addMapping(const flatbuffers::String *(Buffer::*f)() const) { - addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } template - void addMapping(const QByteArray &name, uint8_t (Buffer::*f)() const) + void addMapping(uint8_t (Buffer::*f)() const) { - addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } template - void addMapping(const QByteArray &name, bool (Buffer::*f)() const) + void addMapping(bool (Buffer::*f)() const) { - addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } template - void addMapping(const QByteArray &name, const flatbuffers::Vector *(Buffer::*f)() const) + void addMapping(const flatbuffers::Vector *(Buffer::*f)() const) { - addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } template - void addMapping(const QByteArray &name, const flatbuffers::Vector> *(Buffer::*f)() const) + void addMapping(const flatbuffers::Vector> *(Buffer::*f)() const) { - addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } private: @@ -134,44 +134,44 @@ public: } template - void addMapping(const QByteArray &name, void (BufferBuilder::*f)(uint8_t)) + void addMapping(void (BufferBuilder::*f)(uint8_t)) { - addMapping(name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { - return [value, f](BufferBuilder &builder) { (builder.*f)(value.value()); }; + addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + return [value, f](BufferBuilder &builder) { (builder.*f)(value.value()); }; }); } template - void addMapping(const QByteArray &name, void (BufferBuilder::*f)(bool)) + void addMapping(void (BufferBuilder::*f)(bool)) { - addMapping(name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { - return [value, f](BufferBuilder &builder) { (builder.*f)(value.value()); }; + addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + return [value, f](BufferBuilder &builder) { (builder.*f)(value.value()); }; }); } template - void addMapping(const QByteArray &name, void (BufferBuilder::*f)(flatbuffers::Offset)) + void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset)) { - addMapping(name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { - auto offset = variantToProperty(value, fbb); + addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + auto offset = variantToProperty(value, fbb); return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); }; }); } template - void addMapping(const QByteArray &name, void (BufferBuilder::*f)(flatbuffers::Offset>)) + void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset>)) { - addMapping(name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { - auto offset = variantToProperty(value, fbb); + addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + auto offset = variantToProperty(value, fbb); return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); }; }); } template - void addMapping(const QByteArray &name, void (BufferBuilder::*f)(flatbuffers::Offset>>)) + void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset>>)) { - addMapping(name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { - auto offset = variantToProperty(value, fbb); + addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + auto offset = variantToProperty(value, fbb); return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); }; }); } -- cgit v1.2.3