From 49f08fa2fadb3ff1340af02be27045e92566dd58 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 15 Jun 2016 07:04:38 +0200 Subject: Fixed LocalStorageFacade. We can't make any assumptions about the lifetime of the facade, so make sure we have all we need in the lambda. --- common/resourcefacade.cpp | 24 ++++++++++++++++-------- common/resourcefacade.h | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'common') diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index ba04b2f..65ff05c 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -28,7 +28,7 @@ template ConfigNotifier LocalStorageFacade::sConfigNotifier; template -LocalStorageFacade::LocalStorageFacade(const QByteArray &identifier) : Sink::StoreFacade(), mConfigStore(identifier) +LocalStorageFacade::LocalStorageFacade(const QByteArray &identifier) : Sink::StoreFacade(), mConfigStore(identifier), mResourceInstanceIdentifier(identifier) { } @@ -38,17 +38,23 @@ LocalStorageFacade::~LocalStorageFacade() } template -typename DomainType::Ptr LocalStorageFacade::readFromConfig(const QByteArray &id, const QByteArray &type) +typename DomainType::Ptr LocalStorageFacade::readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) { auto object = DomainType::Ptr::create(id); object->setProperty("type", type); - const auto configurationValues = mConfigStore.get(id); + const auto configurationValues = configStore.get(id); for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { object->setProperty(it.key(), it.value()); } return object; } +template +typename DomainType::Ptr LocalStorageFacade::readFromConfig(const QByteArray &id, const QByteArray &type) +{ + return readFromConfig(mConfigStore, id, type); +} + template KAsync::Job LocalStorageFacade::create(const DomainType &domainObject) { @@ -132,9 +138,9 @@ QPair, typename Sink::ResultEmitter: QObject *guard = new QObject; auto resultProvider = new Sink::ResultProvider(); auto emitter = resultProvider->emitter(); - resultProvider->setFetcher([](const QSharedPointer &) {}); - resultProvider->onDone([=]() { delete resultProvider; delete guard; }); - auto job = KAsync::start([=]() { + auto identifier = mResourceInstanceIdentifier; + resultProvider->setFetcher([identifier, query, guard, resultProvider](const QSharedPointer &) { + ConfigStore mConfigStore(identifier); const auto entries = mConfigStore.getEntries(); for (const auto &res : entries.keys()) { const auto type = entries.value(res); @@ -152,7 +158,7 @@ QPair, typename Sink::ResultEmitter: continue; } Trace() << "Found match " << res; - resultProvider->add(readFromConfig(res, type)); + resultProvider->add(readFromConfig(mConfigStore, res, type)); } if (query.liveQuery) { QObject::connect(&sConfigNotifier, &ConfigNotifier::modified, guard, [resultProvider](const Sink::ApplicationDomain::ApplicationDomainType::Ptr &entry) { @@ -169,7 +175,9 @@ QPair, typename Sink::ResultEmitter: resultProvider->initialResultSetComplete(typename DomainType::Ptr()); resultProvider->complete(); }); - return qMakePair(job, emitter); + resultProvider->onDone([=]() { delete resultProvider; delete guard; }); + + return qMakePair(KAsync::null(), emitter); } diff --git a/common/resourcefacade.h b/common/resourcefacade.h index 7c9fd13..989375d 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -67,9 +67,11 @@ public: virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; private: typename DomainType::Ptr readFromConfig(const QByteArray &id, const QByteArray &type); + static typename DomainType::Ptr readFromConfig(ConfigStore &store, const QByteArray &id, const QByteArray &type); ConfigStore mConfigStore; static ConfigNotifier sConfigNotifier; + QByteArray mResourceInstanceIdentifier; }; class ResourceFacade : public LocalStorageFacade -- cgit v1.2.3