diff options
Diffstat (limited to 'common/resourcefacade.cpp')
-rw-r--r-- | common/resourcefacade.cpp | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index aa2f84a..7d42f47 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp | |||
@@ -128,6 +128,22 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::S | |||
128 | } | 128 | } |
129 | 129 | ||
130 | 130 | ||
131 | |||
132 | Q_GLOBAL_STATIC(ConfigNotifier, sConfig); | ||
133 | |||
134 | static Sink::ApplicationDomain::SinkAccount::Ptr readAccountFromConfig(const QByteArray &id, const QByteArray &type) | ||
135 | { | ||
136 | auto account = Sink::ApplicationDomain::SinkAccount::Ptr::create(id); | ||
137 | |||
138 | account->setProperty("type", type); | ||
139 | const auto configurationValues = AccountConfig::getConfiguration(id); | ||
140 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { | ||
141 | account->setProperty(it.key(), it.value()); | ||
142 | } | ||
143 | return account; | ||
144 | } | ||
145 | |||
146 | |||
131 | AccountFacade::AccountFacade(const QByteArray &) : Sink::StoreFacade<Sink::ApplicationDomain::SinkAccount>() | 147 | AccountFacade::AccountFacade(const QByteArray &) : Sink::StoreFacade<Sink::ApplicationDomain::SinkAccount>() |
132 | { | 148 | { |
133 | } | 149 | } |
@@ -155,6 +171,7 @@ KAsync::Job<void> AccountFacade::create(const Sink::ApplicationDomain::SinkAccou | |||
155 | } | 171 | } |
156 | AccountConfig::configureAccount(identifier, configurationValues); | 172 | AccountConfig::configureAccount(identifier, configurationValues); |
157 | } | 173 | } |
174 | sConfig->add(readAccountFromConfig(identifier, type)); | ||
158 | }); | 175 | }); |
159 | } | 176 | } |
160 | 177 | ||
@@ -177,6 +194,9 @@ KAsync::Job<void> AccountFacade::modify(const Sink::ApplicationDomain::SinkAccou | |||
177 | } | 194 | } |
178 | AccountConfig::configureAccount(identifier, configurationValues); | 195 | AccountConfig::configureAccount(identifier, configurationValues); |
179 | } | 196 | } |
197 | |||
198 | const auto type = AccountConfig::getAccounts().value(identifier); | ||
199 | sConfig->modify(readAccountFromConfig(identifier, type)); | ||
180 | }); | 200 | }); |
181 | } | 201 | } |
182 | 202 | ||
@@ -189,16 +209,18 @@ KAsync::Job<void> AccountFacade::remove(const Sink::ApplicationDomain::SinkAccou | |||
189 | return; | 209 | return; |
190 | } | 210 | } |
191 | AccountConfig::removeAccount(identifier); | 211 | AccountConfig::removeAccount(identifier); |
212 | sConfig->remove(Sink::ApplicationDomain::SinkAccount::Ptr::create(account)); | ||
192 | }); | 213 | }); |
193 | } | 214 | } |
194 | 215 | ||
195 | QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::SinkAccount::Ptr>::Ptr> AccountFacade::load(const Sink::Query &query) | 216 | QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::SinkAccount::Ptr>::Ptr> AccountFacade::load(const Sink::Query &query) |
196 | { | 217 | { |
218 | QObject *guard = new QObject; | ||
197 | auto resultProvider = new Sink::ResultProvider<typename Sink::ApplicationDomain::SinkAccount::Ptr>(); | 219 | auto resultProvider = new Sink::ResultProvider<typename Sink::ApplicationDomain::SinkAccount::Ptr>(); |
198 | auto emitter = resultProvider->emitter(); | 220 | auto emitter = resultProvider->emitter(); |
199 | resultProvider->setFetcher([](const QSharedPointer<Sink::ApplicationDomain::SinkAccount> &) {}); | 221 | resultProvider->setFetcher([](const QSharedPointer<Sink::ApplicationDomain::SinkAccount> &) {}); |
200 | resultProvider->onDone([resultProvider]() { delete resultProvider; }); | 222 | resultProvider->onDone([=]() { delete resultProvider; delete guard; }); |
201 | auto job = KAsync::start<void>([query, resultProvider]() { | 223 | auto job = KAsync::start<void>([=]() { |
202 | const auto configuredAccounts = AccountConfig::getAccounts(); | 224 | const auto configuredAccounts = AccountConfig::getAccounts(); |
203 | for (const auto &res : configuredAccounts.keys()) { | 225 | for (const auto &res : configuredAccounts.keys()) { |
204 | const auto type = configuredAccounts.value(res); | 226 | const auto type = configuredAccounts.value(res); |
@@ -206,15 +228,18 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::S | |||
206 | continue; | 228 | continue; |
207 | } | 229 | } |
208 | 230 | ||
209 | auto account = Sink::ApplicationDomain::SinkAccount::Ptr::create("", res, 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); | 231 | resultProvider->add(readAccountFromConfig(res, type)); |
210 | account->setProperty("type", type); | 232 | } |
211 | 233 | if (query.liveQuery) { | |
212 | const auto configurationValues = AccountConfig::getConfiguration(res); | 234 | QObject::connect(sConfig, &ConfigNotifier::modified, guard, [resultProvider](const Sink::ApplicationDomain::SinkAccount::Ptr &account) { |
213 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { | 235 | resultProvider->modify(account); |
214 | account->setProperty(it.key(), it.value()); | 236 | }); |
215 | } | 237 | QObject::connect(sConfig, &ConfigNotifier::added, guard, [resultProvider](const Sink::ApplicationDomain::SinkAccount::Ptr &account) { |
216 | 238 | resultProvider->add(account); | |
217 | resultProvider->add(account); | 239 | }); |
240 | QObject::connect(sConfig, &ConfigNotifier::removed, guard,[resultProvider](const Sink::ApplicationDomain::SinkAccount::Ptr &account) { | ||
241 | resultProvider->remove(account); | ||
242 | }); | ||
218 | } | 243 | } |
219 | // TODO initialResultSetComplete should be implicit | 244 | // TODO initialResultSetComplete should be implicit |
220 | resultProvider->initialResultSetComplete(Sink::ApplicationDomain::SinkAccount::Ptr()); | 245 | resultProvider->initialResultSetComplete(Sink::ApplicationDomain::SinkAccount::Ptr()); |