diff options
-rw-r--r-- | common/resourcefacade.cpp | 24 | ||||
-rw-r--r-- | common/resourcefacade.h | 2 | ||||
-rw-r--r-- | 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 <typename DomainType> | |||
28 | ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; | 28 | ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; |
29 | 29 | ||
30 | template <typename DomainType> | 30 | template <typename DomainType> |
31 | LocalStorageFacade<DomainType>::LocalStorageFacade(const QByteArray &identifier) : Sink::StoreFacade<DomainType>(), mConfigStore(identifier) | 31 | LocalStorageFacade<DomainType>::LocalStorageFacade(const QByteArray &identifier) : Sink::StoreFacade<DomainType>(), mConfigStore(identifier), mResourceInstanceIdentifier(identifier) |
32 | { | 32 | { |
33 | } | 33 | } |
34 | 34 | ||
@@ -38,11 +38,11 @@ LocalStorageFacade<DomainType>::~LocalStorageFacade() | |||
38 | } | 38 | } |
39 | 39 | ||
40 | template <typename DomainType> | 40 | template <typename DomainType> |
41 | typename DomainType::Ptr LocalStorageFacade<DomainType>::readFromConfig(const QByteArray &id, const QByteArray &type) | 41 | typename DomainType::Ptr LocalStorageFacade<DomainType>::readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) |
42 | { | 42 | { |
43 | auto object = DomainType::Ptr::create(id); | 43 | auto object = DomainType::Ptr::create(id); |
44 | object->setProperty("type", type); | 44 | object->setProperty("type", type); |
45 | const auto configurationValues = mConfigStore.get(id); | 45 | const auto configurationValues = configStore.get(id); |
46 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { | 46 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { |
47 | object->setProperty(it.key(), it.value()); | 47 | object->setProperty(it.key(), it.value()); |
48 | } | 48 | } |
@@ -50,6 +50,12 @@ typename DomainType::Ptr LocalStorageFacade<DomainType>::readFromConfig(const QB | |||
50 | } | 50 | } |
51 | 51 | ||
52 | template <typename DomainType> | 52 | template <typename DomainType> |
53 | typename DomainType::Ptr LocalStorageFacade<DomainType>::readFromConfig(const QByteArray &id, const QByteArray &type) | ||
54 | { | ||
55 | return readFromConfig(mConfigStore, id, type); | ||
56 | } | ||
57 | |||
58 | template <typename DomainType> | ||
53 | KAsync::Job<void> LocalStorageFacade<DomainType>::create(const DomainType &domainObject) | 59 | KAsync::Job<void> LocalStorageFacade<DomainType>::create(const DomainType &domainObject) |
54 | { | 60 | { |
55 | return KAsync::start<void>([domainObject, this]() { | 61 | return KAsync::start<void>([domainObject, this]() { |
@@ -132,9 +138,9 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename DomainType::Ptr>: | |||
132 | QObject *guard = new QObject; | 138 | QObject *guard = new QObject; |
133 | auto resultProvider = new Sink::ResultProvider<typename DomainType::Ptr>(); | 139 | auto resultProvider = new Sink::ResultProvider<typename DomainType::Ptr>(); |
134 | auto emitter = resultProvider->emitter(); | 140 | auto emitter = resultProvider->emitter(); |
135 | resultProvider->setFetcher([](const QSharedPointer<DomainType> &) {}); | 141 | auto identifier = mResourceInstanceIdentifier; |
136 | resultProvider->onDone([=]() { delete resultProvider; delete guard; }); | 142 | resultProvider->setFetcher([identifier, query, guard, resultProvider](const QSharedPointer<DomainType> &) { |
137 | auto job = KAsync::start<void>([=]() { | 143 | ConfigStore mConfigStore(identifier); |
138 | const auto entries = mConfigStore.getEntries(); | 144 | const auto entries = mConfigStore.getEntries(); |
139 | for (const auto &res : entries.keys()) { | 145 | for (const auto &res : entries.keys()) { |
140 | const auto type = entries.value(res); | 146 | const auto type = entries.value(res); |
@@ -152,7 +158,7 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename DomainType::Ptr>: | |||
152 | continue; | 158 | continue; |
153 | } | 159 | } |
154 | Trace() << "Found match " << res; | 160 | Trace() << "Found match " << res; |
155 | resultProvider->add(readFromConfig(res, type)); | 161 | resultProvider->add(readFromConfig(mConfigStore, res, type)); |
156 | } | 162 | } |
157 | if (query.liveQuery) { | 163 | if (query.liveQuery) { |
158 | QObject::connect(&sConfigNotifier, &ConfigNotifier::modified, guard, [resultProvider](const Sink::ApplicationDomain::ApplicationDomainType::Ptr &entry) { | 164 | QObject::connect(&sConfigNotifier, &ConfigNotifier::modified, guard, [resultProvider](const Sink::ApplicationDomain::ApplicationDomainType::Ptr &entry) { |
@@ -169,7 +175,9 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename DomainType::Ptr>: | |||
169 | resultProvider->initialResultSetComplete(typename DomainType::Ptr()); | 175 | resultProvider->initialResultSetComplete(typename DomainType::Ptr()); |
170 | resultProvider->complete(); | 176 | resultProvider->complete(); |
171 | }); | 177 | }); |
172 | return qMakePair(job, emitter); | 178 | resultProvider->onDone([=]() { delete resultProvider; delete guard; }); |
179 | |||
180 | return qMakePair(KAsync::null<void>(), emitter); | ||
173 | } | 181 | } |
174 | 182 | ||
175 | 183 | ||
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: | |||
67 | virtual QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename DomainType::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; | 67 | virtual QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename DomainType::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; |
68 | private: | 68 | private: |
69 | typename DomainType::Ptr readFromConfig(const QByteArray &id, const QByteArray &type); | 69 | typename DomainType::Ptr readFromConfig(const QByteArray &id, const QByteArray &type); |
70 | static typename DomainType::Ptr readFromConfig(ConfigStore &store, const QByteArray &id, const QByteArray &type); | ||
70 | 71 | ||
71 | ConfigStore mConfigStore; | 72 | ConfigStore mConfigStore; |
72 | static ConfigNotifier sConfigNotifier; | 73 | static ConfigNotifier sConfigNotifier; |
74 | QByteArray mResourceInstanceIdentifier; | ||
73 | }; | 75 | }; |
74 | 76 | ||
75 | class ResourceFacade : public LocalStorageFacade<Sink::ApplicationDomain::SinkResource> | 77 | class ResourceFacade : public LocalStorageFacade<Sink::ApplicationDomain::SinkResource> |
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: | |||
101 | Query query; | 101 | Query query; |
102 | query.liveQuery = true; | 102 | query.liveQuery = true; |
103 | auto model = Store::loadModel<SinkAccount>(query); | 103 | auto model = Store::loadModel<SinkAccount>(query); |
104 | QSignalSpy spy(model.data(), &QAbstractItemModel::rowsInserted); | 104 | QTRY_COMPARE(model->rowCount(QModelIndex()), 1); |
105 | QTRY_COMPARE(spy.count(), 1); | ||
106 | 105 | ||
107 | auto account2 = ApplicationDomainType::createEntity<SinkAccount>(); | 106 | auto account2 = ApplicationDomainType::createEntity<SinkAccount>(); |
108 | account2.setProperty("type", "maildir"); | 107 | account2.setProperty("type", "maildir"); |
109 | account2.setProperty("name", "name"); | 108 | account2.setProperty("name", "name"); |
110 | Store::create(account2).exec().waitForFinished(); | 109 | Store::create(account2).exec().waitForFinished(); |
111 | QTRY_COMPARE(spy.count(), 2); | 110 | QTRY_COMPARE(model->rowCount(QModelIndex()), 2); |
112 | 111 | ||
113 | //Ensure the notifier only affects one type | 112 | //Ensure the notifier only affects one type |
114 | auto resource = ApplicationDomainType::createEntity<SinkResource>(); | 113 | auto resource = ApplicationDomainType::createEntity<SinkResource>(); |
115 | resource.setProperty("type", "org.kde.mailtransport"); | 114 | resource.setProperty("type", "org.kde.mailtransport"); |
116 | Store::create(resource).exec().waitForFinished(); | 115 | Store::create(resource).exec().waitForFinished(); |
117 | QTRY_COMPARE(spy.count(), 2); | 116 | QTRY_COMPARE(model->rowCount(QModelIndex()), 2); |
118 | } | 117 | } |
119 | 118 | ||
120 | }; | 119 | }; |