From db8f328bde01d24bf9271638f8295fc70c68cdd4 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 8 Jul 2016 14:30:37 +0200 Subject: Account status --- common/resourcefacade.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'common/resourcefacade.cpp') diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index bdb5841..583d6ec 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -283,6 +283,55 @@ AccountFacade::~AccountFacade() { } +QPair, typename Sink::ResultEmitter::Ptr> AccountFacade::load(const Sink::Query &query) +{ + auto runner = new LocalStorageQueryRunner(query, mIdentifier, sConfigNotifier); + auto monitoredResources = QSharedPointer>::create(); + runner->setStatusUpdater([runner, monitoredResources](ApplicationDomain::SinkAccount &account) { + Query query; + query.filter(account.identifier()); + const auto resources = Store::read(query); + SinkTrace() << "Found resource belonging to the account " << account.identifier() << " : " << resources; + auto accountIdentifier = account.identifier(); + ApplicationDomain::Status status = ApplicationDomain::ConnectedStatus; + for (const auto &resource : resources) { + auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource.identifier(), ResourceConfig::getResourceType(resource.identifier())); + if (!monitoredResources->contains(resource.identifier())) { + auto ret = QObject::connect(resourceAccess.data(), &ResourceAccess::notification, runner->guard(), [resource, runner, resourceAccess, accountIdentifier](const Notification ¬ification) { + SinkTrace() << "Received notification in facade: " << notification.type; + if (notification.type == Notification::Status) { + runner->statusChanged(accountIdentifier); + } + }); + Q_ASSERT(ret); + monitoredResources->insert(resource.identifier()); + } + + //Figure out overall status + auto s = resourceAccess->getResourceStatus(); + switch (s) { + case ApplicationDomain::ErrorStatus: + status = ApplicationDomain::ErrorStatus; + break; + case ApplicationDomain::OfflineStatus: + if (status == ApplicationDomain::ConnectedStatus) { + status = ApplicationDomain::OfflineStatus; + } + break; + case ApplicationDomain::ConnectedStatus: + break; + case ApplicationDomain::BusyStatus: + if (status != ApplicationDomain::ErrorStatus) { + status = ApplicationDomain::BusyStatus; + } + break; + } + } + account.setStatusStatus(status); + }); + return qMakePair(KAsync::null(), runner->emitter()); +} + IdentityFacade::IdentityFacade() : LocalStorageFacade("identities") { } -- cgit v1.2.3