File indexing completed on 2024-05-12 05:26:04
0001 /* 0002 * Copyright (C) 2014 Christian Mollekopf <chrigi_1@fastmail.fm> 0003 * 0004 * This program is free software; you can redistribute it and/or modify 0005 * it under the terms of the GNU General Public License as published by 0006 * the Free Software Foundation; either version 2 of the License, or 0007 * (at your option) any later version. 0008 * 0009 * This program is distributed in the hope that it will be useful, 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0012 * GNU General Public License for more details. 0013 * 0014 * You should have received a copy of the GNU General Public License 0015 * along with this program; if not, write to the 0016 * Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 0018 */ 0019 0020 #pragma once 0021 0022 #include "common/facadeinterface.h" 0023 0024 #include <KAsync/Async> 0025 #include "common/resultprovider.h" 0026 #include "common/domain/applicationdomaintype.h" 0027 #include "common/configstore.h" 0028 #include "common/log.h" 0029 0030 namespace Sink { 0031 class Query; 0032 class Inspection; 0033 } 0034 0035 class ConfigNotifier : public QObject 0036 { 0037 Q_OBJECT 0038 public: 0039 void add(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type) 0040 { 0041 emit added(account, type); 0042 } 0043 0044 void remove(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type) 0045 { 0046 emit removed(account, type); 0047 } 0048 0049 void modify(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type) 0050 { 0051 emit modified(account, type); 0052 } 0053 signals: 0054 void added(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type); 0055 void removed(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type); 0056 void modified(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type); 0057 }; 0058 0059 template <typename DomainType> 0060 class LocalStorageQueryRunner 0061 { 0062 public: 0063 LocalStorageQueryRunner(const Sink::Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier, const Sink::Log::Context &); 0064 typename Sink::ResultEmitter<typename DomainType::Ptr>::Ptr emitter(); 0065 void setStatusUpdater(const std::function<void(DomainType &)> &); 0066 void statusChanged(const QByteArray &identifier); 0067 QObject *guard() const; 0068 QMap<QByteArray, QSharedPointer<Sink::ResultEmitter<QSharedPointer<Sink::ApplicationDomain::SinkResource> > > > mResourceEmitter; 0069 0070 private: 0071 void updateStatus(DomainType &entity); 0072 std::function<void(DomainType &)> mStatusUpdater; 0073 QSharedPointer<Sink::ResultProvider<typename DomainType::Ptr>> mResultProvider; 0074 ConfigStore mConfigStore; 0075 std::unique_ptr<QObject> mGuard; 0076 Sink::Log::Context mLogCtx; 0077 }; 0078 0079 template <typename DomainType> 0080 class LocalStorageFacade : public Sink::StoreFacade<DomainType> 0081 { 0082 public: 0083 LocalStorageFacade(const QByteArray &instanceIdentifier, const QByteArray &typeName); 0084 virtual ~LocalStorageFacade() Q_DECL_OVERRIDE; 0085 virtual KAsync::Job<void> create(const DomainType &resource) Q_DECL_OVERRIDE; 0086 virtual KAsync::Job<void> modify(const DomainType &resource) Q_DECL_OVERRIDE; 0087 virtual KAsync::Job<void> move(const DomainType &resource, const QByteArray &) Q_DECL_OVERRIDE; 0088 virtual KAsync::Job<void> copy(const DomainType &resource, const QByteArray &) Q_DECL_OVERRIDE; 0089 virtual KAsync::Job<void> remove(const DomainType &resource) Q_DECL_OVERRIDE; 0090 virtual QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename DomainType::Ptr>::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE; 0091 0092 protected: 0093 QByteArray mIdentifier; 0094 QByteArray mTypeName; 0095 static ConfigNotifier sConfigNotifier; 0096 }; 0097 0098 class ResourceFacade : public LocalStorageFacade<Sink::ApplicationDomain::SinkResource> 0099 { 0100 public: 0101 ResourceFacade(); 0102 virtual ~ResourceFacade() Q_DECL_OVERRIDE; 0103 virtual KAsync::Job<void> remove(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; 0104 virtual QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename Sink::ApplicationDomain::SinkResource::Ptr>::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE; 0105 }; 0106 0107 class AccountFacade : public LocalStorageFacade<Sink::ApplicationDomain::SinkAccount> 0108 { 0109 public: 0110 AccountFacade(); 0111 virtual ~AccountFacade() Q_DECL_OVERRIDE; 0112 virtual KAsync::Job<void> remove(const Sink::ApplicationDomain::SinkAccount &resource) Q_DECL_OVERRIDE; 0113 virtual QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename Sink::ApplicationDomain::SinkAccount::Ptr>::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE; 0114 }; 0115 0116 class IdentityFacade : public LocalStorageFacade<Sink::ApplicationDomain::Identity> 0117 { 0118 public: 0119 IdentityFacade(); 0120 virtual ~IdentityFacade() Q_DECL_OVERRIDE; 0121 }; 0122