From 529db49c496f4f668cec3f7c59d2d0ec78c50c9a Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 27 Sep 2016 16:13:47 +0200 Subject: Don't hardcode the type property. --- common/configstore.cpp | 7 ++--- common/configstore.h | 3 ++- common/domain/applicationdomaintype.cpp | 24 +++++++++--------- common/domain/applicationdomaintype.h | 2 +- common/resourceaccess.cpp | 4 +++ common/resourceconfig.cpp | 5 ++-- common/resourcefacade.cpp | 45 ++++++++++++++++++--------------- common/resourcefacade.h | 5 ++-- common/store.cpp | 2 +- 9 files changed, 54 insertions(+), 43 deletions(-) (limited to 'common') diff --git a/common/configstore.cpp b/common/configstore.cpp index 9a68662..ff5ba3d 100644 --- a/common/configstore.cpp +++ b/common/configstore.cpp @@ -31,8 +31,9 @@ static QSharedPointer getConfig(const QByteArray &identifier) return QSharedPointer::create(Sink::configLocation() + "/" + identifier + ".ini", QSettings::IniFormat); } -ConfigStore::ConfigStore(const QByteArray &identifier) +ConfigStore::ConfigStore(const QByteArray &identifier, const QByteArray &typeName) : mIdentifier(identifier), + mTypeName(typeName), mConfig(getConfig(identifier)) { @@ -43,7 +44,7 @@ QMap ConfigStore::getEntries() QMap resources; for (const auto &identifier : mConfig->childGroups()) { mConfig->beginGroup(identifier); - const auto type = mConfig->value("type").toByteArray(); + const auto type = mConfig->value(mTypeName).toByteArray(); resources.insert(identifier.toLatin1(), type); mConfig->endGroup(); } @@ -54,7 +55,7 @@ void ConfigStore::add(const QByteArray &identifier, const QByteArray &type) { SinkTrace() << "Adding " << identifier; mConfig->beginGroup(QString::fromLatin1(identifier)); - mConfig->setValue("type", type); + mConfig->setValue(mTypeName, type); mConfig->endGroup(); mConfig->sync(); } diff --git a/common/configstore.h b/common/configstore.h index 2f51f63..514bc01 100644 --- a/common/configstore.h +++ b/common/configstore.h @@ -30,7 +30,7 @@ class SINK_EXPORT ConfigStore { public: - ConfigStore(const QByteArray &identifier); + ConfigStore(const QByteArray &identifier, const QByteArray &typeName); /** * Returns all entries with their type. @@ -64,5 +64,6 @@ public: private: QByteArray mIdentifier; + QByteArray mTypeName; QSharedPointer mConfig; }; diff --git a/common/domain/applicationdomaintype.cpp b/common/domain/applicationdomaintype.cpp index 2f7c32b..5474708 100644 --- a/common/domain/applicationdomaintype.cpp +++ b/common/domain/applicationdomaintype.cpp @@ -254,9 +254,9 @@ Identity::~Identity() SinkResource DummyResource::create(const QByteArray &account) { auto &&resource = ApplicationDomainType::createEntity(); - resource.setProperty("type", "sink.dummy"); - resource.setProperty("account", account); - resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << "-folder.rename")); + resource.setResourceType("sink.dummy"); + resource.setAccount(account); + resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::storage << "-folder.rename"); // resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << "-folder.rename" << ResourceCapabilities::Mail::trash)); return resource; } @@ -264,27 +264,27 @@ SinkResource DummyResource::create(const QByteArray &account) SinkResource MaildirResource::create(const QByteArray &account) { auto &&resource = ApplicationDomainType::createEntity(); - resource.setProperty("type", "sink.maildir"); - resource.setProperty("account", account); - resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << "-folder.rename" << ResourceCapabilities::Mail::trash)); + resource.setResourceType("sink.maildir"); + resource.setAccount(account); + resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << "-folder.rename" << ResourceCapabilities::Mail::trash); return resource; } SinkResource MailtransportResource::create(const QByteArray &account) { auto &&resource = ApplicationDomainType::createEntity(); - resource.setProperty("type", "sink.mailtransport"); - resource.setProperty("account", account); - resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::transport)); + resource.setResourceType("sink.mailtransport"); + resource.setAccount(account); + resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::transport); return resource; } SinkResource ImapResource::create(const QByteArray &account) { auto &&resource = ApplicationDomainType::createEntity(); - resource.setProperty("type", "sink.imap"); - resource.setProperty("account", account); - resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << ResourceCapabilities::Mail::folderhierarchy << ResourceCapabilities::Mail::trash)); + resource.setResourceType("sink.imap"); + resource.setAccount(account); + resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << ResourceCapabilities::Mail::folderhierarchy << ResourceCapabilities::Mail::trash); return resource; } diff --git a/common/domain/applicationdomaintype.h b/common/domain/applicationdomaintype.h index c824251..8b96758 100644 --- a/common/domain/applicationdomaintype.h +++ b/common/domain/applicationdomaintype.h @@ -295,7 +295,7 @@ struct SINK_EXPORT SinkResource : public ApplicationDomainType { virtual ~SinkResource(); SINK_REFERENCE_PROPERTY(SinkAccount, Account, account); - SINK_PROPERTY(QString, ResourceType, resourceType); + SINK_PROPERTY(QByteArray, ResourceType, resourceType); SINK_PROPERTY(QByteArrayList, Capabilities, capabilities); SINK_STATUS_PROPERTY(int, Status, status); SINK_STATUS_PROPERTY(ApplicationDomain::Error, Error, error); diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp index 364616c..e509292 100644 --- a/common/resourceaccess.cpp +++ b/common/resourceaccess.cpp @@ -199,6 +199,10 @@ KAsync::Job ResourceAccess::Private::initializeSocket() if (Sink::Test::testModeEnabled()) { args << "--test"; } + if (resourceName.isEmpty()) { + SinkWarning() << "No resource type given"; + return KAsync::error(); + } args << resourceInstanceIdentifier << resourceName; qint64 pid = 0; if (QProcess::startDetached("sink_synchronizer", args, QDir::homePath(), &pid)) { diff --git a/common/resourceconfig.cpp b/common/resourceconfig.cpp index 39f9ddb..68ac0bc 100644 --- a/common/resourceconfig.cpp +++ b/common/resourceconfig.cpp @@ -23,6 +23,7 @@ #include #include #include +#include static QSharedPointer getConfig(const QByteArray &identifier) { @@ -43,7 +44,7 @@ void ResourceConfig::addResource(const QByteArray &identifier, const QByteArray { auto settings = getConfig("resources"); settings->beginGroup(QString::fromLatin1(identifier)); - settings->setValue("type", type); + settings->setValue(Sink::ApplicationDomain::SinkResource::ResourceType::name, type); settings->endGroup(); settings->sync(); } @@ -64,7 +65,7 @@ QMap ResourceConfig::getResources() auto settings = getConfig("resources"); for (const auto &identifier : settings->childGroups()) { settings->beginGroup(identifier); - const auto type = settings->value("type").toByteArray(); + const auto type = settings->value(Sink::ApplicationDomain::SinkResource::ResourceType::name).toByteArray(); resources.insert(identifier.toLatin1(), type); settings->endGroup(); } diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index 391b1d1..aee5706 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -37,7 +37,7 @@ template static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) { auto object = DomainType::Ptr::create(id); - object->setProperty("type", type); + object->setProperty(ApplicationDomain::SinkResource::ResourceType::name, type); const auto configurationValues = configStore.get(id); for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { object->setProperty(it.key(), it.value()); @@ -48,7 +48,7 @@ static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const Q static bool matchesFilter(const QHash &filter, const QMap &properties) { for (const auto &filterProperty : filter.keys()) { - if (filterProperty == "type") { + if (filterProperty == ApplicationDomain::SinkResource::ResourceType::name) { continue; } if (!filter.value(filterProperty).matches(properties.value(filterProperty))) { @@ -59,8 +59,8 @@ static bool matchesFilter(const QHash &filter, co } template -LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, const QByteArray &identifier, ConfigNotifier &configNotifier) - : mResultProvider(new ResultProvider), mConfigStore(identifier), mGuard(new QObject) +LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier) + : mResultProvider(new ResultProvider), mConfigStore(identifier, typeName), mGuard(new QObject) { QObject *guard = new QObject; mResultProvider->setFetcher([this, query, guard, &configNotifier](const QSharedPointer &) { @@ -68,7 +68,7 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, for (const auto &res : entries.keys()) { const auto type = entries.value(res); - if (query.hasFilter("type") && query.getFilter("type").value.toByteArray() != type) { + if (query.hasFilter(ApplicationDomain::SinkResource::ResourceType::name) && query.getFilter(ApplicationDomain::SinkResource::ResourceType::name).value.toByteArray() != type) { SinkTrace() << "Skipping due to type."; continue; } @@ -154,7 +154,7 @@ typename Sink::ResultEmitter::Ptr LocalStorageQueryRun template -LocalStorageFacade::LocalStorageFacade(const QByteArray &identifier) : StoreFacade(), mIdentifier(identifier) +LocalStorageFacade::LocalStorageFacade(const QByteArray &identifier, const QByteArray &typeName) : StoreFacade(), mIdentifier(identifier), mTypeName(typeName) { } @@ -167,15 +167,16 @@ template KAsync::Job LocalStorageFacade::create(const DomainType &domainObject) { auto configStoreIdentifier = mIdentifier; - return KAsync::syncStart([domainObject, configStoreIdentifier]() { - const QByteArray type = domainObject.getProperty("type").toByteArray(); + auto typeName = mTypeName; + return KAsync::syncStart([domainObject, configStoreIdentifier, typeName]() { + const QByteArray type = domainObject.getProperty(typeName).toByteArray(); const QByteArray providedIdentifier = domainObject.identifier().isEmpty() ? domainObject.getProperty("identifier").toByteArray() : domainObject.identifier(); const QByteArray identifier = providedIdentifier.isEmpty() ? ResourceConfig::newIdentifier(type) : providedIdentifier; - auto configStore = ConfigStore(configStoreIdentifier); + auto configStore = ConfigStore(configStoreIdentifier, typeName); configStore.add(identifier, type); auto changedProperties = domainObject.changedProperties(); changedProperties.removeOne("identifier"); - changedProperties.removeOne("type"); + changedProperties.removeOne(typeName); if (!changedProperties.isEmpty()) { // We have some configuration values QMap configurationValues; @@ -192,7 +193,8 @@ template KAsync::Job LocalStorageFacade::modify(const DomainType &domainObject) { auto configStoreIdentifier = mIdentifier; - return KAsync::syncStart([domainObject, configStoreIdentifier]() { + auto typeName = mTypeName; + return KAsync::syncStart([domainObject, configStoreIdentifier, typeName]() { const QByteArray identifier = domainObject.identifier(); if (identifier.isEmpty()) { SinkWarning() << "We need an \"identifier\" property to identify the entity to configure."; @@ -200,8 +202,8 @@ KAsync::Job LocalStorageFacade::modify(const DomainType &domai } auto changedProperties = domainObject.changedProperties(); changedProperties.removeOne("identifier"); - changedProperties.removeOne("type"); - auto configStore = ConfigStore(configStoreIdentifier); + changedProperties.removeOne(typeName); + auto configStore = ConfigStore(configStoreIdentifier, typeName); if (!changedProperties.isEmpty()) { // We have some configuration values QMap configurationValues; @@ -220,14 +222,15 @@ template KAsync::Job LocalStorageFacade::remove(const DomainType &domainObject) { auto configStoreIdentifier = mIdentifier; - return KAsync::syncStart([domainObject, configStoreIdentifier]() { + auto typeName = mTypeName; + return KAsync::syncStart([domainObject, configStoreIdentifier, typeName]() { const QByteArray identifier = domainObject.identifier(); if (identifier.isEmpty()) { SinkWarning() << "We need an \"identifier\" property to identify the entity to configure"; return; } SinkTrace() << "Removing: " << identifier; - auto configStore = ConfigStore(configStoreIdentifier); + auto configStore = ConfigStore(configStoreIdentifier, typeName); configStore.remove(identifier); sConfigNotifier.remove(QSharedPointer::create(domainObject)); }); @@ -236,11 +239,11 @@ KAsync::Job LocalStorageFacade::remove(const DomainType &domai template QPair, typename ResultEmitter::Ptr> LocalStorageFacade::load(const Query &query) { - auto runner = new LocalStorageQueryRunner(query, mIdentifier, sConfigNotifier); + auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier); return qMakePair(KAsync::null(), runner->emitter()); } -ResourceFacade::ResourceFacade() : LocalStorageFacade("resources") +ResourceFacade::ResourceFacade() : LocalStorageFacade("resources", Sink::ApplicationDomain::SinkResource::ResourceType::name) { } @@ -256,7 +259,7 @@ KAsync::Job ResourceFacade::remove(const Sink::ApplicationDomain::SinkReso QPair, typename Sink::ResultEmitter::Ptr> ResourceFacade::load(const Sink::Query &query) { - auto runner = new LocalStorageQueryRunner(query, mIdentifier, sConfigNotifier); + auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier); auto monitoredResources = QSharedPointer>::create(); runner->setStatusUpdater([runner, monitoredResources](ApplicationDomain::SinkResource &resource) { auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource.identifier(), ResourceConfig::getResourceType(resource.identifier())); @@ -276,7 +279,7 @@ QPair, typename Sink::ResultEmitter("accounts") +AccountFacade::AccountFacade() : LocalStorageFacade("accounts", "type") { } @@ -286,7 +289,7 @@ AccountFacade::~AccountFacade() QPair, typename Sink::ResultEmitter::Ptr> AccountFacade::load(const Sink::Query &query) { - auto runner = new LocalStorageQueryRunner(query, mIdentifier, sConfigNotifier); + auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier); auto monitoredResources = QSharedPointer>::create(); runner->setStatusUpdater([runner, monitoredResources](ApplicationDomain::SinkAccount &account) { Query query; @@ -333,7 +336,7 @@ QPair, typename Sink::ResultEmitter(), runner->emitter()); } -IdentityFacade::IdentityFacade() : LocalStorageFacade("identities") +IdentityFacade::IdentityFacade() : LocalStorageFacade("identities", "type") { } diff --git a/common/resourcefacade.h b/common/resourcefacade.h index b87a396..d259d4f 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -59,7 +59,7 @@ template class LocalStorageQueryRunner { public: - LocalStorageQueryRunner(const Sink::Query &query, const QByteArray &identifier, ConfigNotifier &configNotifier); + LocalStorageQueryRunner(const Sink::Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier); typename Sink::ResultEmitter::Ptr emitter(); void setStatusUpdater(const std::function &); void statusChanged(const QByteArray &identifier); @@ -77,7 +77,7 @@ template class LocalStorageFacade : public Sink::StoreFacade { public: - LocalStorageFacade(const QByteArray &instanceIdentifier); + LocalStorageFacade(const QByteArray &instanceIdentifier, const QByteArray &typeName); virtual ~LocalStorageFacade(); virtual KAsync::Job create(const DomainType &resource) Q_DECL_OVERRIDE; virtual KAsync::Job modify(const DomainType &resource) Q_DECL_OVERRIDE; @@ -86,6 +86,7 @@ public: protected: QByteArray mIdentifier; + QByteArray mTypeName; static ConfigNotifier sConfigNotifier; }; diff --git a/common/store.cpp b/common/store.cpp index c01d220..f5a7774 100644 --- a/common/store.cpp +++ b/common/store.cpp @@ -360,7 +360,7 @@ QList Store::read(const Sink::Query &q) }); for (const auto &resourceInstanceIdentifier : resources.keys()) { const auto resourceType = resources.value(resourceInstanceIdentifier); - SinkTrace() << "Looking for " << resourceType << resourceInstanceIdentifier; + SinkTrace() << "Querying resource: " << resourceType << resourceInstanceIdentifier; auto facade = FacadeFactory::instance().getFacade(resourceType, resourceInstanceIdentifier); if (facade) { SinkTrace() << "Trying to fetch from resource " << resourceInstanceIdentifier; -- cgit v1.2.3