From b25c71e0a42b18b02764719d32714f07ca241b3f Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 25 May 2015 23:54:36 +0200 Subject: Moved ApplicationDomainType and BufferAdaptor to separate files --- common/bufferadaptor.h | 67 +++++++++++++++ common/clientapi.h | 152 +--------------------------------- common/domain/applicationdomaintype.h | 134 ++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 151 deletions(-) create mode 100644 common/bufferadaptor.h create mode 100644 common/domain/applicationdomaintype.h (limited to 'common') diff --git a/common/bufferadaptor.h b/common/bufferadaptor.h new file mode 100644 index 0000000..121ef9d --- /dev/null +++ b/common/bufferadaptor.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2014 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 + +namespace Akonadi2 { + +namespace ApplicationDomain { + +/** + * This class has to be implemented by resources and can be used as generic interface to access the buffer properties + */ +class BufferAdaptor { +public: + virtual ~BufferAdaptor() {} + virtual QVariant getProperty(const QByteArray &key) const { return QVariant(); } + virtual void setProperty(const QByteArray &key, const QVariant &value) {} + virtual QList availableProperties() const { return QList(); } +}; + +class MemoryBufferAdaptor : public BufferAdaptor { +public: + MemoryBufferAdaptor() + : BufferAdaptor() + { + } + + MemoryBufferAdaptor(const BufferAdaptor &buffer) + : BufferAdaptor() + { + for(const auto &property : buffer.availableProperties()) { + mValues.insert(property, buffer.getProperty(property)); + } + } + + virtual ~MemoryBufferAdaptor() {} + + virtual QVariant getProperty(const QByteArray &key) const { return mValues.value(key); } + virtual void setProperty(const QByteArray &key, const QVariant &value) { mValues.insert(key, value); } + virtual QByteArrayList availableProperties() const { return mValues.keys(); } + +private: + QHash mValues; +}; + +} +} diff --git a/common/clientapi.h b/common/clientapi.h index d26a2ad..38ec1ee 100644 --- a/common/clientapi.h +++ b/common/clientapi.h @@ -33,6 +33,7 @@ #include "threadboundary.h" #include "resultprovider.h" +#include "domain/applicationdomaintype.h" namespace async { //This should abstract if we execute from eventloop or in thread. @@ -42,157 +43,6 @@ namespace async { namespace Akonadi2 { -/** - * Standardized Application Domain Types - * - * They don't adhere to any standard and can be freely extended - * Their sole purpose is providing a standardized interface to access data. - * - * This is necessary to decouple resource-backends from application domain containers (otherwise each resource would have to provide a faceade for each application domain container). - * - * These types will be frequently modified (for every new feature that should be exposed to the any client) - */ -namespace ApplicationDomain { - -/** - * This class has to be implemented by resources and can be used as generic interface to access the buffer properties - */ -class BufferAdaptor { -public: - virtual ~BufferAdaptor() {} - virtual QVariant getProperty(const QByteArray &key) const { return QVariant(); } - virtual void setProperty(const QByteArray &key, const QVariant &value) {} - virtual QList availableProperties() const { return QList(); } -}; - -class MemoryBufferAdaptor : public BufferAdaptor { -public: - MemoryBufferAdaptor() - : BufferAdaptor() - { - } - - MemoryBufferAdaptor(const BufferAdaptor &buffer) - : BufferAdaptor() - { - for(const auto &property : buffer.availableProperties()) { - mValues.insert(property, buffer.getProperty(property)); - } - } - - virtual ~MemoryBufferAdaptor() {} - - virtual QVariant getProperty(const QByteArray &key) const { return mValues.value(key); } - virtual void setProperty(const QByteArray &key, const QVariant &value) { mValues.insert(key, value); } - virtual QByteArrayList availableProperties() const { return mValues.keys(); } - -private: - QHash mValues; -}; - -/** - * The domain type interface has two purposes: - * * provide a unified interface to read buffers (for zero-copy reading) - * * record changes to generate changesets for modifications - */ -class ApplicationDomainType { -public: - typedef QSharedPointer Ptr; - - ApplicationDomainType() - :mAdaptor(new MemoryBufferAdaptor()) - { - - } - - ApplicationDomainType(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier, qint64 revision, const QSharedPointer &adaptor) - : mAdaptor(adaptor), - mResourceInstanceIdentifier(resourceInstanceIdentifier), - mIdentifier(identifier), - mRevision(revision) - { - } - - template - static typename DomainType::Ptr getInMemoryRepresentation(const ApplicationDomainType::Ptr &domainType) - { - //TODO only copy requested properties - auto memoryAdaptor = QSharedPointer::create(*(domainType->mAdaptor)); - return QSharedPointer::create(domainType->mResourceInstanceIdentifier, domainType->mIdentifier, domainType->mRevision, memoryAdaptor); - } - - virtual ~ApplicationDomainType() {} - - 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; } - QByteArray resourceInstanceIdentifier() const { return mResourceInstanceIdentifier; } - QByteArray identifier() const { return mIdentifier; } - -private: - QSharedPointer mAdaptor; - QHash mChangeSet; - /* - * Each domain object needs to store the resource, identifier, revision triple so we can link back to the storage location. - */ - QByteArray mResourceInstanceIdentifier; - QByteArray mIdentifier; - qint64 mRevision; -}; - -struct Event : public ApplicationDomainType { - typedef QSharedPointer Ptr; - using ApplicationDomainType::ApplicationDomainType; -}; - -struct Todo : public ApplicationDomainType { - typedef QSharedPointer Ptr; - using ApplicationDomainType::ApplicationDomainType; -}; - -struct Calendar : public ApplicationDomainType { - typedef QSharedPointer Ptr; - using ApplicationDomainType::ApplicationDomainType; -}; - -class Mail : public ApplicationDomainType { -}; - -class Folder : public ApplicationDomainType { -}; - -/** - * Represents an akonadi resource. - * - * This type is used for configuration of resources, - * and for creating and removing resource instances. - */ -struct AkonadiResource : public ApplicationDomainType { - typedef QSharedPointer Ptr; - using ApplicationDomainType::ApplicationDomainType; -}; - -/** - * All types need to be registered here an MUST return a different name. - * - * Do not store these types to disk, they may change over time. - */ - -template -QByteArray getTypeName(); - -template<> -QByteArray getTypeName(); - -template<> -QByteArray getTypeName(); - -template<> -QByteArray getTypeName(); - -} - using namespace async; /** diff --git a/common/domain/applicationdomaintype.h b/common/domain/applicationdomaintype.h new file mode 100644 index 0000000..2de1460 --- /dev/null +++ b/common/domain/applicationdomaintype.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2014 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 "../bufferadaptor.h" + +namespace Akonadi2 { + +namespace ApplicationDomain { + +/** + * The domain type interface has two purposes: + * * provide a unified interface to read buffers (for zero-copy reading) + * * record changes to generate changesets for modifications + * + * ApplicationDomainTypes don't adhere to any standard and are meant to be extended frequently (hence the non-typesafe interface). + */ +class ApplicationDomainType { +public: + typedef QSharedPointer Ptr; + + ApplicationDomainType() + :mAdaptor(new MemoryBufferAdaptor()) + { + + } + + ApplicationDomainType(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier, qint64 revision, const QSharedPointer &adaptor) + : mAdaptor(adaptor), + mResourceInstanceIdentifier(resourceInstanceIdentifier), + mIdentifier(identifier), + mRevision(revision) + { + } + + template + static typename DomainType::Ptr getInMemoryRepresentation(const ApplicationDomainType::Ptr &domainType) + { + //TODO only copy requested properties + auto memoryAdaptor = QSharedPointer::create(*(domainType->mAdaptor)); + return QSharedPointer::create(domainType->mResourceInstanceIdentifier, domainType->mIdentifier, domainType->mRevision, memoryAdaptor); + } + + virtual ~ApplicationDomainType() {} + + 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; } + QByteArray resourceInstanceIdentifier() const { return mResourceInstanceIdentifier; } + QByteArray identifier() const { return mIdentifier; } + +private: + QSharedPointer mAdaptor; + QHash mChangeSet; + /* + * Each domain object needs to store the resource, identifier, revision triple so we can link back to the storage location. + */ + QByteArray mResourceInstanceIdentifier; + QByteArray mIdentifier; + qint64 mRevision; +}; + +struct Event : public ApplicationDomainType { + typedef QSharedPointer Ptr; + using ApplicationDomainType::ApplicationDomainType; +}; + +struct Todo : public ApplicationDomainType { + typedef QSharedPointer Ptr; + using ApplicationDomainType::ApplicationDomainType; +}; + +struct Calendar : public ApplicationDomainType { + typedef QSharedPointer Ptr; + using ApplicationDomainType::ApplicationDomainType; +}; + +class Mail : public ApplicationDomainType { +}; + +class Folder : public ApplicationDomainType { +}; + +/** + * Represents an akonadi resource. + * + * This type is used for configuration of resources, + * and for creating and removing resource instances. + */ +struct AkonadiResource : public ApplicationDomainType { + typedef QSharedPointer Ptr; + using ApplicationDomainType::ApplicationDomainType; +}; + +/** + * All types need to be registered here an MUST return a different name. + * + * Do not store these types to disk, they may change over time. + */ +template +QByteArray getTypeName(); + +template<> +QByteArray getTypeName(); + +template<> +QByteArray getTypeName(); + +template<> +QByteArray getTypeName(); + +} +} -- cgit v1.2.3