summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-04-16 00:58:06 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-04-16 00:58:06 +0200
commit90f0623b46794af59346b662bc5e823195a0eeff (patch)
tree5d613e4a636d3fbc266cba4117749c770a66f85b
parent54e450f7c117e3cbced5773eb732808338b40c0d (diff)
downloadsink-90f0623b46794af59346b662bc5e823195a0eeff.tar.gz
sink-90f0623b46794af59346b662bc5e823195a0eeff.zip
Cleanup in DummyResourceFacade::load
We avoid capturing resultProvider or queryRunner so they don't live forever.
-rw-r--r--dummyresource/facade.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp
index 1e0f20a..da2a27a 100644
--- a/dummyresource/facade.cpp
+++ b/dummyresource/facade.cpp
@@ -150,14 +150,20 @@ void DummyResourceFacade::readValue(QSharedPointer<Akonadi2::Storage> storage, c
150Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > &resultProvider) 150Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > &resultProvider)
151{ 151{
152 auto runner = QSharedPointer<QueryRunner>::create(query); 152 auto runner = QSharedPointer<QueryRunner>::create(query);
153 //The runner only lives as long as the resultProvider 153 QWeakPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > weakResultProvider = resultProvider;
154 resultProvider->setQueryRunner(runner); 154 runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision, qint64 newRevision) -> Async::Job<qint64> {
155 runner->setQuery([this, resultProvider, query](qint64 oldRevision, qint64 newRevision) -> Async::Job<qint64> { 155 return Async::start<qint64>([this, weakResultProvider, query](Async::Future<qint64> &future) {
156 return Async::start<qint64>([this, resultProvider, query](Async::Future<qint64> &future) { 156 auto resultProvider = weakResultProvider.toStrongRef();
157 if (!resultProvider) {
158 Warning() << "Tried executing query after result provider is already gone";
159 future.setError(0, QString());
160 future.setFinished();
161 return;
162 }
157 //TODO only emit changes and don't replace everything 163 //TODO only emit changes and don't replace everything
158 resultProvider->clear(); 164 resultProvider->clear();
159 //rerun query 165 //rerun query
160 std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> addCallback = std::bind(&Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr>::add, resultProvider, std::placeholders::_1); 166 auto addCallback = std::bind(&Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr>::add, resultProvider, std::placeholders::_1);
161 load(query, addCallback).then<void, qint64>([resultProvider, &future](qint64 queriedRevision) { 167 load(query, addCallback).then<void, qint64>([resultProvider, &future](qint64 queriedRevision) {
162 //TODO set revision in result provider? 168 //TODO set revision in result provider?
163 //TODO update all existing results with new revision 169 //TODO update all existing results with new revision
@@ -168,15 +174,14 @@ Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const Q
168 }); 174 });
169 }); 175 });
170 176
171 auto resourceAccess = mResourceAccess; 177 //In case of a live query we keep the runner for as long alive as the result provider exists
172 //TODO we need to somehow disconnect this 178 if (query.liveQuery) {
173 QObject::connect(resourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, [runner](qint64 newRevision) { 179 resultProvider->setQueryRunner(runner);
174 runner->revisionChanged(newRevision); 180 QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged);
175 }); 181 }
176 182
177 return Async::start<void>([runner](Async::Future<void> &future) { 183 return Async::start<void>([runner](Async::Future<void> &future) {
178 runner->run().then<void>([&future]() { 184 runner->run().then<void>([&future]() {
179 //TODO if not live query, destroy runner.
180 future.setFinished(); 185 future.setFinished();
181 }).exec(); 186 }).exec();
182 }); 187 });