From f66c216df8e2b31d696a36c0716194959a31ae26 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 17 Mar 2016 20:55:49 +0100 Subject: Live queries for accounts --- common/resourcefacade.cpp | 47 ++++++++++++++++++++++++++++++++++++----------- common/resourcefacade.h | 24 ++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 11 deletions(-) (limited to 'common') diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index aa2f84a..7d42f47 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -128,6 +128,22 @@ QPair, typename Sink::ResultEmittersetProperty("type", type); + const auto configurationValues = AccountConfig::getConfiguration(id); + for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { + account->setProperty(it.key(), it.value()); + } + return account; +} + + AccountFacade::AccountFacade(const QByteArray &) : Sink::StoreFacade() { } @@ -155,6 +171,7 @@ KAsync::Job AccountFacade::create(const Sink::ApplicationDomain::SinkAccou } AccountConfig::configureAccount(identifier, configurationValues); } + sConfig->add(readAccountFromConfig(identifier, type)); }); } @@ -177,6 +194,9 @@ KAsync::Job AccountFacade::modify(const Sink::ApplicationDomain::SinkAccou } AccountConfig::configureAccount(identifier, configurationValues); } + + const auto type = AccountConfig::getAccounts().value(identifier); + sConfig->modify(readAccountFromConfig(identifier, type)); }); } @@ -189,16 +209,18 @@ KAsync::Job AccountFacade::remove(const Sink::ApplicationDomain::SinkAccou return; } AccountConfig::removeAccount(identifier); + sConfig->remove(Sink::ApplicationDomain::SinkAccount::Ptr::create(account)); }); } QPair, typename Sink::ResultEmitter::Ptr> AccountFacade::load(const Sink::Query &query) { + QObject *guard = new QObject; auto resultProvider = new Sink::ResultProvider(); auto emitter = resultProvider->emitter(); resultProvider->setFetcher([](const QSharedPointer &) {}); - resultProvider->onDone([resultProvider]() { delete resultProvider; }); - auto job = KAsync::start([query, resultProvider]() { + resultProvider->onDone([=]() { delete resultProvider; delete guard; }); + auto job = KAsync::start([=]() { const auto configuredAccounts = AccountConfig::getAccounts(); for (const auto &res : configuredAccounts.keys()) { const auto type = configuredAccounts.value(res); @@ -206,15 +228,18 @@ QPair, typename Sink::ResultEmitter::create()); - account->setProperty("type", type); - - const auto configurationValues = AccountConfig::getConfiguration(res); - for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { - account->setProperty(it.key(), it.value()); - } - - resultProvider->add(account); + resultProvider->add(readAccountFromConfig(res, type)); + } + if (query.liveQuery) { + QObject::connect(sConfig, &ConfigNotifier::modified, guard, [resultProvider](const Sink::ApplicationDomain::SinkAccount::Ptr &account) { + resultProvider->modify(account); + }); + QObject::connect(sConfig, &ConfigNotifier::added, guard, [resultProvider](const Sink::ApplicationDomain::SinkAccount::Ptr &account) { + resultProvider->add(account); + }); + QObject::connect(sConfig, &ConfigNotifier::removed, guard,[resultProvider](const Sink::ApplicationDomain::SinkAccount::Ptr &account) { + resultProvider->remove(account); + }); } // TODO initialResultSetComplete should be implicit resultProvider->initialResultSetComplete(Sink::ApplicationDomain::SinkAccount::Ptr()); diff --git a/common/resourcefacade.h b/common/resourcefacade.h index 48ff2a5..4d0e597 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -51,3 +51,27 @@ public: KAsync::Job remove(const Sink::ApplicationDomain::SinkAccount &resource) Q_DECL_OVERRIDE; QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; }; + +class ConfigNotifier : public QObject +{ + Q_OBJECT +public: + void add(const Sink::ApplicationDomain::SinkAccount::Ptr &account) + { + emit added(account); + } + + void remove(const Sink::ApplicationDomain::SinkAccount::Ptr &account) + { + emit removed(account); + } + + void modify(const Sink::ApplicationDomain::SinkAccount::Ptr &account) + { + emit modified(account); + } +signals: + void added(const Sink::ApplicationDomain::SinkAccount::Ptr &account); + void removed(const Sink::ApplicationDomain::SinkAccount::Ptr &account); + void modified(const Sink::ApplicationDomain::SinkAccount::Ptr &account); +}; -- cgit v1.2.3