From e2857def8e67c3a95656f9d4737beba93a38c53a Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 18 Apr 2015 10:26:47 +0200 Subject: Moved generic part of load to GenericFacade --- common/clientapi.h | 2 +- common/facade.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ dummyresource/facade.cpp | 42 +----------------------------------------- dummyresource/facade.h | 1 - 4 files changed, 47 insertions(+), 43 deletions(-) diff --git a/common/clientapi.h b/common/clientapi.h index c2b9493..88bc38c 100644 --- a/common/clientapi.h +++ b/common/clientapi.h @@ -365,7 +365,7 @@ public: virtual Async::Job modify(const DomainType &domainObject) = 0; virtual Async::Job remove(const DomainType &domainObject) = 0; //TODO remove from public API - virtual Async::Job load(const Query &query, const std::function &resultCallback) = 0; + // virtual Async::Job load(const Query &query, const std::function &resultCallback) = 0; virtual Async::Job load(const Query &query, const QSharedPointer > &resultProvider) { return Async::null(); }; }; diff --git a/common/facade.h b/common/facade.h index f9b5a83..6c1ad67 100644 --- a/common/facade.h +++ b/common/facade.h @@ -29,6 +29,7 @@ #include "createentity_generated.h" #include "domainadaptor.h" #include "entitybuffer.h" +#include "log.h" /** * A QueryRunner runs a query and updates the corresponding result set. @@ -98,6 +99,48 @@ public: { } + //TODO JOBAPI return job from sync continuation to execute it as subjob? + Async::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE + { + auto runner = QSharedPointer::create(query); + QWeakPointer > weakResultProvider = resultProvider; + runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision, qint64 newRevision) -> Async::Job { + return Async::start([this, weakResultProvider, query](Async::Future &future) { + auto resultProvider = weakResultProvider.toStrongRef(); + if (!resultProvider) { + Warning() << "Tried executing query after result provider is already gone"; + future.setError(0, QString()); + future.setFinished(); + return; + } + //TODO only emit changes and don't replace everything + resultProvider->clear(); + //rerun query + auto addCallback = std::bind(&Akonadi2::ResultProvider::add, resultProvider, std::placeholders::_1); + load(query, addCallback).template then([resultProvider, &future](qint64 queriedRevision) { + //TODO set revision in result provider? + //TODO update all existing results with new revision + resultProvider->complete(); + future.setValue(queriedRevision); + future.setFinished(); + }).exec(); + }); + }); + + //In case of a live query we keep the runner for as long alive as the result provider exists + if (query.liveQuery) { + resultProvider->setQueryRunner(runner); + QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged); + } + + //We have to capture the runner to keep it alive + return synchronizeResource(query.syncOnDemand, query.processAll).template then([runner](Async::Future &future) { + runner->run().then([&future]() { + future.setFinished(); + }).exec(); + }); + } + protected: Async::Job sendCreateCommand(const QByteArray &t, const QByteArray &buffer) { @@ -129,6 +172,8 @@ protected: return Async::null(); } + virtual Async::Job load(const Akonadi2::Query &query, const std::function &resultCallback) { return Async::null(); }; + protected: //TODO use one resource access instance per application => make static QSharedPointer mResourceAccess; diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp index da2a27a..e50e4f3 100644 --- a/dummyresource/facade.cpp +++ b/dummyresource/facade.cpp @@ -147,49 +147,9 @@ void DummyResourceFacade::readValue(QSharedPointer storage, c }); } -Async::Job DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) -{ - auto runner = QSharedPointer::create(query); - QWeakPointer > weakResultProvider = resultProvider; - runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision, qint64 newRevision) -> Async::Job { - return Async::start([this, weakResultProvider, query](Async::Future &future) { - auto resultProvider = weakResultProvider.toStrongRef(); - if (!resultProvider) { - Warning() << "Tried executing query after result provider is already gone"; - future.setError(0, QString()); - future.setFinished(); - return; - } - //TODO only emit changes and don't replace everything - resultProvider->clear(); - //rerun query - auto addCallback = std::bind(&Akonadi2::ResultProvider::add, resultProvider, std::placeholders::_1); - load(query, addCallback).then([resultProvider, &future](qint64 queriedRevision) { - //TODO set revision in result provider? - //TODO update all existing results with new revision - resultProvider->complete(); - future.setValue(queriedRevision); - future.setFinished(); - }).exec(); - }); - }); - - //In case of a live query we keep the runner for as long alive as the result provider exists - if (query.liveQuery) { - resultProvider->setQueryRunner(runner); - QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged); - } - - return Async::start([runner](Async::Future &future) { - runner->run().then([&future]() { - future.setFinished(); - }).exec(); - }); -} - Async::Job DummyResourceFacade::load(const Akonadi2::Query &query, const std::function &resultCallback) { - return synchronizeResource(query.syncOnDemand, query.processAll).then([=](Async::Future &future) { + return Async::start([=](Async::Future &future) { //Now that the sync is complete we can execute the query const auto preparedQuery = prepareQuery(query); diff --git a/dummyresource/facade.h b/dummyresource/facade.h index 3ddfe15..91ae351 100644 --- a/dummyresource/facade.h +++ b/dummyresource/facade.h @@ -38,7 +38,6 @@ public: Async::Job modify(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE; Async::Job remove(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE; Async::Job load(const Akonadi2::Query &query, const std::function &resultCallback) Q_DECL_OVERRIDE; - Async::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE; private: void readValue(QSharedPointer storage, const QByteArray &key, const std::function &resultCallback, std::function); -- cgit v1.2.3