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 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) (limited to 'common') 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; -- cgit v1.2.3