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 +++++++++++++++++++++++++++++++++++++++++++++++ common/resourcefacade.h | 1 + tests/accountstest.cpp | 30 +++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) 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") { } diff --git a/common/resourcefacade.h b/common/resourcefacade.h index 64e082f..23c453a 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -107,6 +107,7 @@ class AccountFacade : public LocalStorageFacade, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; }; class IdentityFacade : public LocalStorageFacade diff --git a/tests/accountstest.cpp b/tests/accountstest.cpp index 8d0f2e6..4be8bd6 100644 --- a/tests/accountstest.cpp +++ b/tests/accountstest.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "testutils.h" class AccountsTest : public QObject { @@ -115,6 +116,35 @@ private slots: QTRY_COMPARE(model->rowCount(QModelIndex()), 2); } + void testLoadAccountStatus() + { + using namespace Sink; + using namespace Sink::ApplicationDomain; + + auto account = ApplicationDomainType::createEntity(); + account.setAccountType("dummy"); + account.setName("name"); + VERIFYEXEC(Store::create(account)); + + auto res = Sink::ApplicationDomain::DummyResource::create(account.identifier()); + VERIFYEXEC(Sink::Store::create(res)); + { + Sink::Query query; + query.liveQuery = true; + query.request(); + + auto model = Sink::Store::loadModel(query); + QTRY_COMPARE(model->rowCount(QModelIndex()), 1); + auto account = model->data(model->index(0, 0, QModelIndex()), Sink::Store::DomainObjectRole).value(); + QCOMPARE(account->getStatus(), static_cast(Sink::ApplicationDomain::OfflineStatus)); + + //Synchronize to connect + VERIFYEXEC(Sink::Store::synchronize(Query::ResourceFilter(res))); + + QTRY_COMPARE_WITH_TIMEOUT(model->data(model->index(0, 0, QModelIndex()), Sink::Store::DomainObjectRole).value()->getStatus(), static_cast(Sink::ApplicationDomain::ConnectedStatus), 1000); + } + } + }; QTEST_GUILESS_MAIN(AccountsTest) -- cgit v1.2.3