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