From 73ef798bf849a01418895c2e88300e1c6730b665 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 15 Feb 2017 16:17:26 +0100 Subject: PropertyRegistry for runtime information about properties. A first usecase is parsing different property types. --- common/domain/applicationdomaintype.cpp | 35 +++++++++- common/domain/propertyregistry.cpp | 112 ++++++++++++++++++++++++++++++++ common/domain/propertyregistry.h | 87 +++++++++++++++++++++++++ 3 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 common/domain/propertyregistry.cpp create mode 100644 common/domain/propertyregistry.h (limited to 'common') diff --git a/common/domain/applicationdomaintype.cpp b/common/domain/applicationdomaintype.cpp index 29b50b9..4bd17fe 100644 --- a/common/domain/applicationdomaintype.cpp +++ b/common/domain/applicationdomaintype.cpp @@ -21,16 +21,47 @@ #include "log.h" #include "../bufferadaptor.h" #include "definitions.h" +#include "propertyregistry.h" #include "storage.h" //for generateUid() #include SINK_DEBUG_AREA("applicationdomaintype"); +template +int registerProperty() { + Sink::Private::PropertyRegistry::instance().registerProperty(Sink::ApplicationDomain::getTypeName()); + return 0; +} + +#define SINK_REGISTER_PROPERTY(ENTITYTYPE, PROPERTY) \ + constexpr const char *ENTITYTYPE::PROPERTY::name; \ + static int foo##ENTITYTYPE##PROPERTY = registerProperty(); + namespace Sink { namespace ApplicationDomain { -constexpr const char *Mail::ThreadId::name; -constexpr const char *Mail::Folder::name; +SINK_REGISTER_PROPERTY(Mail, Sender); +SINK_REGISTER_PROPERTY(Mail, To); +SINK_REGISTER_PROPERTY(Mail, Cc); +SINK_REGISTER_PROPERTY(Mail, Bcc); +SINK_REGISTER_PROPERTY(Mail, Subject); +SINK_REGISTER_PROPERTY(Mail, Date); +SINK_REGISTER_PROPERTY(Mail, Unread); +SINK_REGISTER_PROPERTY(Mail, Important); +SINK_REGISTER_PROPERTY(Mail, Folder); +SINK_REGISTER_PROPERTY(Mail, MimeMessage); +SINK_REGISTER_PROPERTY(Mail, FullPayloadAvailable); +SINK_REGISTER_PROPERTY(Mail, Draft); +SINK_REGISTER_PROPERTY(Mail, Trash); +SINK_REGISTER_PROPERTY(Mail, Sent); +SINK_REGISTER_PROPERTY(Mail, MessageId); +SINK_REGISTER_PROPERTY(Mail, ParentMessageId); +SINK_REGISTER_PROPERTY(Mail, ThreadId); + +SINK_REGISTER_PROPERTY(Folder, Name); +SINK_REGISTER_PROPERTY(Folder, Icon); +SINK_REGISTER_PROPERTY(Folder, SpecialPurpose); +SINK_REGISTER_PROPERTY(Folder, Enabled); static const int foo = [] { QMetaType::registerEqualsComparator(); diff --git a/common/domain/propertyregistry.cpp b/common/domain/propertyregistry.cpp new file mode 100644 index 0000000..2208193 --- /dev/null +++ b/common/domain/propertyregistry.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2017 Christian Mollekopf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#include "propertyregistry.h" + +#include + +namespace Sink { +namespace Private { + +template +QVariant parseString(const QString &); + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(s); +} + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(s.toUtf8()); +} + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(Sink::ApplicationDomain::Reference{s.toLatin1()}); +} + +template <> +QVariant parseString(const QString &s) +{ + //TODO copy path + // return QVariant::fromValue(Sink::ApplicationDomain::BLOB{s.toLatin1()}); + Q_ASSERT(false); + return QVariant{}; +} + +template <> +QVariant parseString(const QString &s) +{ + if (s == "true") { + return QVariant::fromValue(true); + } + return QVariant::fromValue(false); +} + +template <> +QVariant parseString>(const QString &s) +{ + auto list = s.split(','); + QList result; + std::transform(list.constBegin(), list.constEnd(), std::back_inserter(result), [] (const QString &s) { return s.toUtf8(); }); + return QVariant::fromValue(result); +} + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(QDateTime::fromString(s)); +} + +template <> +QVariant parseString(const QString &s) +{ + Q_ASSERT(false); + return QVariant{}; +} + +template <> +QVariant parseString>(const QString &s) +{ + Q_ASSERT(false); + return QVariant{}; +} + +PropertyRegistry &PropertyRegistry::instance() +{ + static PropertyRegistry instance; + return instance; +} + +QVariant PropertyRegistry::parse(const QByteArray &type, const QByteArray &property, const QString &value) +{ + auto parser = registry[type].properties[property].parser; + if (parser) { + return parser(value); + } + SinkWarningCtx(Sink::Log::Context{"PropertyRegistry"}) << "Couldn't find a parser for " << type << property; + return QVariant{}; +} + + } +} diff --git a/common/domain/propertyregistry.h b/common/domain/propertyregistry.h new file mode 100644 index 0000000..16df23b --- /dev/null +++ b/common/domain/propertyregistry.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2017 Christian Mollekopf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#pragma once + +#include +#include +#include +#include + +#include "applicationdomaintype.h" + +namespace Sink { +namespace Private { + +template +QVariant parseString(const QString &); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString>(const QString &s); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString(const QString &s); + +template <> +QVariant parseString>(const QString &s); + +class PropertyRegistry +{ +public: + struct Type { + struct Property { + std::function parser; + }; + QHash properties; + }; + + QHash registry; + + static PropertyRegistry &instance(); + + template + void registerProperty(const QByteArray &entityType) { + registry[entityType].properties[PropertyType::name].parser = Sink::Private::parseString; + } + + QVariant parse(const QByteArray &type, const QByteArray &property, const QString &value); +}; + + } +} + -- cgit v1.2.3