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 ++ tests/accountstest.cpp | 7 +++---- 3 files changed, 21 insertions(+), 12 deletions(-) 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 diff --git a/tests/accountstest.cpp b/tests/accountstest.cpp index 12e4685..5a63b31 100644 --- a/tests/accountstest.cpp +++ b/tests/accountstest.cpp @@ -101,20 +101,19 @@ private slots: Query query; query.liveQuery = true; auto model = Store::loadModel(query); - QSignalSpy spy(model.data(), &QAbstractItemModel::rowsInserted); - QTRY_COMPARE(spy.count(), 1); + QTRY_COMPARE(model->rowCount(QModelIndex()), 1); auto account2 = ApplicationDomainType::createEntity(); account2.setProperty("type", "maildir"); account2.setProperty("name", "name"); Store::create(account2).exec().waitForFinished(); - QTRY_COMPARE(spy.count(), 2); + QTRY_COMPARE(model->rowCount(QModelIndex()), 2); //Ensure the notifier only affects one type auto resource = ApplicationDomainType::createEntity(); resource.setProperty("type", "org.kde.mailtransport"); Store::create(resource).exec().waitForFinished(); - QTRY_COMPARE(spy.count(), 2); + QTRY_COMPARE(model->rowCount(QModelIndex()), 2); } }; -- cgit v1.2.3