summaryrefslogtreecommitdiffstats
path: root/common/resourcefacade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/resourcefacade.cpp')
-rw-r--r--common/resourcefacade.cpp68
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")
34template<typename DomainType> 34template<typename DomainType>
35ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; 35ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier;
36 36
37static void applyConfig(ConfigStore &configStore, const QByteArray &id, ApplicationDomain::ApplicationDomainType &object) 37static 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
45template <typename DomainType> 54template <typename DomainType>
46static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) 55static 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
53template <> 62template <>
54typename ApplicationDomain::SinkAccount::Ptr readFromConfig<ApplicationDomain::SinkAccount>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) 63typename 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
62template <> 71template <>
63typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain::SinkResource>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) 72typename 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>
169void LocalStorageQueryRunner<DomainType>::statusChanged(const QByteArray &identifier) 178void 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());