diff options
Diffstat (limited to 'common/resourcefacade.cpp')
-rw-r--r-- | common/resourcefacade.cpp | 68 |
1 files changed, 36 insertions, 32 deletions
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index 4a8037d..dee0711 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp | |||
@@ -34,33 +34,42 @@ SINK_DEBUG_AREA("ResourceFacade") | |||
34 | template<typename DomainType> | 34 | template<typename DomainType> |
35 | ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; | 35 | ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; |
36 | 36 | ||
37 | static void applyConfig(ConfigStore &configStore, const QByteArray &id, ApplicationDomain::ApplicationDomainType &object) | 37 | static void applyConfig(ConfigStore &configStore, const QByteArray &id, ApplicationDomain::ApplicationDomainType &object, const QByteArrayList &requestedProperties) |
38 | { | 38 | { |
39 | const auto configurationValues = configStore.get(id); | 39 | const auto configurationValues = configStore.get(id); |
40 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { | 40 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { |
41 | object.setProperty(it.key(), it.value()); | 41 | object.setProperty(it.key(), it.value()); |
42 | } | 42 | } |
43 | //Populate the object with dummy values for non-available but requested properties. | ||
44 | //This avoid a warning about non-existing properties in bufferadaptor.h | ||
45 | if (!requestedProperties.isEmpty()) { | ||
46 | for (const auto &requested: requestedProperties) { | ||
47 | if (!object.hasProperty(requested)) { | ||
48 | object.setProperty(requested, QVariant{}); | ||
49 | } | ||
50 | } | ||
51 | } | ||
43 | } | 52 | } |
44 | 53 | ||
45 | template <typename DomainType> | 54 | template <typename DomainType> |
46 | static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) | 55 | static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type, const QByteArrayList &requestedProperties) |
47 | { | 56 | { |
48 | auto object = DomainType::Ptr::create(id); | 57 | auto object = DomainType::Ptr::create(id); |
49 | applyConfig(configStore, id, *object); | 58 | applyConfig(configStore, id, *object, requestedProperties); |
50 | return object; | 59 | return object; |
51 | } | 60 | } |
52 | 61 | ||
53 | template <> | 62 | template <> |
54 | typename ApplicationDomain::SinkAccount::Ptr readFromConfig<ApplicationDomain::SinkAccount>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) | 63 | typename ApplicationDomain::SinkAccount::Ptr readFromConfig<ApplicationDomain::SinkAccount>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type, const QByteArrayList &requestedProperties) |
55 | { | 64 | { |
56 | auto object = ApplicationDomain::SinkAccount::Ptr::create(id); | 65 | auto object = ApplicationDomain::SinkAccount::Ptr::create(id); |
57 | object->setProperty(ApplicationDomain::SinkAccount::AccountType::name, type); | 66 | object->setProperty(ApplicationDomain::SinkAccount::AccountType::name, type); |
58 | applyConfig(configStore, id, *object); | 67 | applyConfig(configStore, id, *object, requestedProperties); |
59 | return object; | 68 | return object; |
60 | } | 69 | } |
61 | 70 | ||
62 | template <> | 71 | template <> |
63 | typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain::SinkResource>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) | 72 | typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain::SinkResource>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type, const QByteArrayList &requestedProperties) |
64 | { | 73 | { |
65 | auto object = ApplicationDomain::SinkResource::Ptr::create(id); | 74 | auto object = ApplicationDomain::SinkResource::Ptr::create(id); |
66 | object->setProperty(ApplicationDomain::SinkResource::ResourceType::name, type); | 75 | object->setProperty(ApplicationDomain::SinkResource::ResourceType::name, type); |
@@ -70,7 +79,7 @@ typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain:: | |||
70 | object->setCapabilities(res->capabilities()); | 79 | object->setCapabilities(res->capabilities()); |
71 | } | 80 | } |
72 | } | 81 | } |
73 | applyConfig(configStore, id, *object); | 82 | applyConfig(configStore, id, *object, requestedProperties); |
74 | return object; | 83 | return object; |
75 | } | 84 | } |
76 | 85 | ||
@@ -104,7 +113,7 @@ LocalStorageQueryRunner<DomainType>::LocalStorageQueryRunner(const Query &query, | |||
104 | if (!query.ids().isEmpty() && !query.ids().contains(res)) { | 113 | if (!query.ids().isEmpty() && !query.ids().contains(res)) { |
105 | continue; | 114 | continue; |
106 | } | 115 | } |
107 | auto entity = readFromConfig<DomainType>(mConfigStore, res, type); | 116 | auto entity = readFromConfig<DomainType>(mConfigStore, res, type, query.requestedProperties); |
108 | if (!matchesFilter(query.getBaseFilters(), *entity)){ | 117 | if (!matchesFilter(query.getBaseFilters(), *entity)){ |
109 | SinkTraceCtx(mLogCtx) << "Skipping due to filter." << res; | 118 | SinkTraceCtx(mLogCtx) << "Skipping due to filter." << res; |
110 | continue; | 119 | continue; |
@@ -169,7 +178,7 @@ template<typename DomainType> | |||
169 | void LocalStorageQueryRunner<DomainType>::statusChanged(const QByteArray &identifier) | 178 | void LocalStorageQueryRunner<DomainType>::statusChanged(const QByteArray &identifier) |
170 | { | 179 | { |
171 | SinkTraceCtx(mLogCtx) << "Status changed " << identifier; | 180 | SinkTraceCtx(mLogCtx) << "Status changed " << identifier; |
172 | auto entity = readFromConfig<DomainType>(mConfigStore, identifier, ApplicationDomain::getTypeName<DomainType>()); | 181 | auto entity = readFromConfig<DomainType>(mConfigStore, identifier, ApplicationDomain::getTypeName<DomainType>(), QByteArrayList{}); |
173 | updateStatus(*entity); | 182 | updateStatus(*entity); |
174 | mResultProvider->modify(entity); | 183 | mResultProvider->modify(entity); |
175 | } | 184 | } |
@@ -213,7 +222,7 @@ KAsync::Job<void> LocalStorageFacade<DomainType>::create(const DomainType &domai | |||
213 | } | 222 | } |
214 | configStore.modify(identifier, configurationValues); | 223 | configStore.modify(identifier, configurationValues); |
215 | } | 224 | } |
216 | sConfigNotifier.add(::readFromConfig<DomainType>(configStore, identifier, type)); | 225 | sConfigNotifier.add(::readFromConfig<DomainType>(configStore, identifier, type, QByteArrayList{})); |
217 | }); | 226 | }); |
218 | } | 227 | } |
219 | 228 | ||
@@ -242,7 +251,7 @@ KAsync::Job<void> LocalStorageFacade<DomainType>::modify(const DomainType &domai | |||
242 | } | 251 | } |
243 | 252 | ||
244 | const auto type = configStore.getEntries().value(identifier); | 253 | const auto type = configStore.getEntries().value(identifier); |
245 | sConfigNotifier.modify(::readFromConfig<DomainType>(configStore, identifier, type)); | 254 | sConfigNotifier.modify(::readFromConfig<DomainType>(configStore, identifier, type, QByteArrayList{})); |
246 | }); | 255 | }); |
247 | } | 256 | } |
248 | 257 | ||
@@ -337,10 +346,12 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename ApplicationDomain | |||
337 | runner->setStatusUpdater([runner, monitoredResources, ctx](ApplicationDomain::SinkAccount &account) { | 346 | runner->setStatusUpdater([runner, monitoredResources, ctx](ApplicationDomain::SinkAccount &account) { |
338 | Query query; | 347 | Query query; |
339 | query.filter<ApplicationDomain::SinkResource::Account>(account.identifier()); | 348 | query.filter<ApplicationDomain::SinkResource::Account>(account.identifier()); |
349 | query.request<ApplicationDomain::SinkResource::Account>() | ||
350 | .request<ApplicationDomain::SinkResource::Capabilities>(); | ||
340 | const auto resources = Store::read<ApplicationDomain::SinkResource>(query); | 351 | const auto resources = Store::read<ApplicationDomain::SinkResource>(query); |
341 | SinkTraceCtx(ctx) << "Found resource belonging to the account " << account.identifier() << " : " << resources; | 352 | SinkTraceCtx(ctx) << "Found resource belonging to the account " << account.identifier() << " : " << resources; |
342 | auto accountIdentifier = account.identifier(); | 353 | auto accountIdentifier = account.identifier(); |
343 | ApplicationDomain::Status status = ApplicationDomain::ConnectedStatus; | 354 | QList<int> states; |
344 | for (const auto &resource : resources) { | 355 | for (const auto &resource : resources) { |
345 | auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource.identifier(), ResourceConfig::getResourceType(resource.identifier())); | 356 | auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource.identifier(), ResourceConfig::getResourceType(resource.identifier())); |
346 | if (!monitoredResources->contains(resource.identifier())) { | 357 | if (!monitoredResources->contains(resource.identifier())) { |
@@ -353,27 +364,20 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename ApplicationDomain | |||
353 | Q_ASSERT(ret); | 364 | Q_ASSERT(ret); |
354 | monitoredResources->insert(resource.identifier()); | 365 | monitoredResources->insert(resource.identifier()); |
355 | } | 366 | } |
356 | 367 | states << resourceAccess->getResourceStatus(); | |
357 | //Figure out overall status | ||
358 | auto s = resourceAccess->getResourceStatus(); | ||
359 | switch (s) { | ||
360 | case ApplicationDomain::ErrorStatus: | ||
361 | status = ApplicationDomain::ErrorStatus; | ||
362 | break; | ||
363 | case ApplicationDomain::OfflineStatus: | ||
364 | if (status == ApplicationDomain::ConnectedStatus) { | ||
365 | status = ApplicationDomain::OfflineStatus; | ||
366 | } | ||
367 | break; | ||
368 | case ApplicationDomain::ConnectedStatus: | ||
369 | break; | ||
370 | case ApplicationDomain::BusyStatus: | ||
371 | if (status != ApplicationDomain::ErrorStatus) { | ||
372 | status = ApplicationDomain::BusyStatus; | ||
373 | } | ||
374 | break; | ||
375 | } | ||
376 | } | 368 | } |
369 | const auto status = [&] { | ||
370 | if (states.contains(ApplicationDomain::ErrorStatus)) { | ||
371 | return ApplicationDomain::ErrorStatus; | ||
372 | } | ||
373 | if (states.contains(ApplicationDomain::BusyStatus)) { | ||
374 | return ApplicationDomain::BusyStatus; | ||
375 | } | ||
376 | if (states.contains(ApplicationDomain::ConnectedStatus)) { | ||
377 | return ApplicationDomain::ConnectedStatus; | ||
378 | } | ||
379 | return ApplicationDomain::OfflineStatus; | ||
380 | }(); | ||
377 | account.setStatusStatus(status); | 381 | account.setStatusStatus(status); |
378 | }); | 382 | }); |
379 | return qMakePair(KAsync::null<void>(), runner->emitter()); | 383 | return qMakePair(KAsync::null<void>(), runner->emitter()); |