diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/domain/applicationdomaintype.cpp | 11 | ||||
-rw-r--r-- | common/domain/applicationdomaintype.h | 13 | ||||
-rw-r--r-- | common/resourceconfig.cpp | 93 | ||||
-rw-r--r-- | common/resourceconfig.h | 12 | ||||
-rw-r--r-- | common/resourcefacade.cpp | 99 | ||||
-rw-r--r-- | common/resourcefacade.h | 11 |
6 files changed, 227 insertions, 12 deletions
diff --git a/common/domain/applicationdomaintype.cpp b/common/domain/applicationdomaintype.cpp index df10327..462585e 100644 --- a/common/domain/applicationdomaintype.cpp +++ b/common/domain/applicationdomaintype.cpp | |||
@@ -141,6 +141,11 @@ SinkResource::~SinkResource() | |||
141 | 141 | ||
142 | } | 142 | } |
143 | 143 | ||
144 | SinkAccount::~SinkAccount() | ||
145 | { | ||
146 | |||
147 | } | ||
148 | |||
144 | template<> | 149 | template<> |
145 | QByteArray getTypeName<Event>() | 150 | QByteArray getTypeName<Event>() |
146 | { | 151 | { |
@@ -160,6 +165,12 @@ QByteArray getTypeName<SinkResource>() | |||
160 | } | 165 | } |
161 | 166 | ||
162 | template<> | 167 | template<> |
168 | QByteArray getTypeName<SinkAccount>() | ||
169 | { | ||
170 | return "sinkaccount"; | ||
171 | } | ||
172 | |||
173 | template<> | ||
163 | QByteArray getTypeName<Mail>() | 174 | QByteArray getTypeName<Mail>() |
164 | { | 175 | { |
165 | return "mail"; | 176 | return "mail"; |
diff --git a/common/domain/applicationdomaintype.h b/common/domain/applicationdomaintype.h index 32d8999..d17ad75 100644 --- a/common/domain/applicationdomaintype.h +++ b/common/domain/applicationdomaintype.h | |||
@@ -135,7 +135,7 @@ struct SINK_EXPORT Folder : public Entity { | |||
135 | 135 | ||
136 | /** | 136 | /** |
137 | * Represents an sink resource. | 137 | * Represents an sink resource. |
138 | * | 138 | * |
139 | * This type is used for configuration of resources, | 139 | * This type is used for configuration of resources, |
140 | * and for creating and removing resource instances. | 140 | * and for creating and removing resource instances. |
141 | */ | 141 | */ |
@@ -145,6 +145,12 @@ struct SINK_EXPORT SinkResource : public ApplicationDomainType { | |||
145 | virtual ~SinkResource(); | 145 | virtual ~SinkResource(); |
146 | }; | 146 | }; |
147 | 147 | ||
148 | struct SINK_EXPORT SinkAccount : public ApplicationDomainType { | ||
149 | typedef QSharedPointer<SinkAccount> Ptr; | ||
150 | using ApplicationDomainType::ApplicationDomainType; | ||
151 | virtual ~SinkAccount(); | ||
152 | }; | ||
153 | |||
148 | /** | 154 | /** |
149 | * All types need to be registered here an MUST return a different name. | 155 | * All types need to be registered here an MUST return a different name. |
150 | * | 156 | * |
@@ -163,6 +169,9 @@ template<> | |||
163 | QByteArray SINK_EXPORT getTypeName<SinkResource>(); | 169 | QByteArray SINK_EXPORT getTypeName<SinkResource>(); |
164 | 170 | ||
165 | template<> | 171 | template<> |
172 | QByteArray SINK_EXPORT getTypeName<SinkAccount>(); | ||
173 | |||
174 | template<> | ||
166 | QByteArray SINK_EXPORT getTypeName<Mail>(); | 175 | QByteArray SINK_EXPORT getTypeName<Mail>(); |
167 | 176 | ||
168 | template<> | 177 | template<> |
@@ -192,3 +201,5 @@ Q_DECLARE_METATYPE(Sink::ApplicationDomain::Folder) | |||
192 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::Folder::Ptr) | 201 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::Folder::Ptr) |
193 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::SinkResource) | 202 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::SinkResource) |
194 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::SinkResource::Ptr) | 203 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::SinkResource::Ptr) |
204 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::SinkAccount) | ||
205 | Q_DECLARE_METATYPE(Sink::ApplicationDomain::SinkAccount::Ptr) | ||
diff --git a/common/resourceconfig.cpp b/common/resourceconfig.cpp index b988718..4b33990 100644 --- a/common/resourceconfig.cpp +++ b/common/resourceconfig.cpp | |||
@@ -23,19 +23,20 @@ | |||
23 | #include <QStandardPaths> | 23 | #include <QStandardPaths> |
24 | #include <QFile> | 24 | #include <QFile> |
25 | 25 | ||
26 | static QSharedPointer<QSettings> getSettings() | 26 | static QSharedPointer<QSettings> getConfig(const QByteArray &identifier) |
27 | { | 27 | { |
28 | return QSharedPointer<QSettings>::create(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/sink/resources.ini", QSettings::IniFormat); | 28 | return QSharedPointer<QSettings>::create(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/sink/" + identifier + ".ini", QSettings::IniFormat); |
29 | } | 29 | } |
30 | 30 | ||
31 | static QSharedPointer<QSettings> getResourceConfig(const QByteArray &identifier) | 31 | static QSharedPointer<QSettings> getSettings() |
32 | { | 32 | { |
33 | return QSharedPointer<QSettings>::create(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/sink/" + identifier, QSettings::IniFormat); | 33 | return getConfig("resources"); |
34 | } | 34 | } |
35 | 35 | ||
36 | |||
36 | QByteArray ResourceConfig::newIdentifier(const QByteArray &type) | 37 | QByteArray ResourceConfig::newIdentifier(const QByteArray &type) |
37 | { | 38 | { |
38 | auto settings = getSettings(); | 39 | auto settings = getConfig("resources"); |
39 | const auto counter = settings->value("instanceCounter", 0).toInt() + 1; | 40 | const auto counter = settings->value("instanceCounter", 0).toInt() + 1; |
40 | const QByteArray identifier = type + ".instance" + QByteArray::number(counter); | 41 | const QByteArray identifier = type + ".instance" + QByteArray::number(counter); |
41 | settings->setValue("instanceCounter", counter); | 42 | settings->setValue("instanceCounter", counter); |
@@ -45,7 +46,7 @@ QByteArray ResourceConfig::newIdentifier(const QByteArray &type) | |||
45 | 46 | ||
46 | void ResourceConfig::addResource(const QByteArray &identifier, const QByteArray &type) | 47 | void ResourceConfig::addResource(const QByteArray &identifier, const QByteArray &type) |
47 | { | 48 | { |
48 | auto settings = getSettings(); | 49 | auto settings = getConfig("resources"); |
49 | settings->beginGroup(QString::fromLatin1(identifier)); | 50 | settings->beginGroup(QString::fromLatin1(identifier)); |
50 | settings->setValue("type", type); | 51 | settings->setValue("type", type); |
51 | settings->endGroup(); | 52 | settings->endGroup(); |
@@ -54,18 +55,18 @@ void ResourceConfig::addResource(const QByteArray &identifier, const QByteArray | |||
54 | 55 | ||
55 | void ResourceConfig::removeResource(const QByteArray &identifier) | 56 | void ResourceConfig::removeResource(const QByteArray &identifier) |
56 | { | 57 | { |
57 | auto settings = getSettings(); | 58 | auto settings = getConfig("resources"); |
58 | settings->beginGroup(QString::fromLatin1(identifier)); | 59 | settings->beginGroup(QString::fromLatin1(identifier)); |
59 | settings->remove(""); | 60 | settings->remove(""); |
60 | settings->endGroup(); | 61 | settings->endGroup(); |
61 | settings->sync(); | 62 | settings->sync(); |
62 | QFile::remove(getResourceConfig(identifier)->fileName()); | 63 | QFile::remove(getConfig(identifier)->fileName()); |
63 | } | 64 | } |
64 | 65 | ||
65 | QMap<QByteArray, QByteArray> ResourceConfig::getResources() | 66 | QMap<QByteArray, QByteArray> ResourceConfig::getResources() |
66 | { | 67 | { |
67 | QMap<QByteArray, QByteArray> resources; | 68 | QMap<QByteArray, QByteArray> resources; |
68 | auto settings = getSettings(); | 69 | auto settings = getConfig("resources"); |
69 | for (const auto &identifier : settings->childGroups()) { | 70 | for (const auto &identifier : settings->childGroups()) { |
70 | settings->beginGroup(identifier); | 71 | settings->beginGroup(identifier); |
71 | const auto type = settings->value("type").toByteArray(); | 72 | const auto type = settings->value("type").toByteArray(); |
@@ -84,7 +85,7 @@ void ResourceConfig::clear() | |||
84 | 85 | ||
85 | void ResourceConfig::configureResource(const QByteArray &identifier, const QMap<QByteArray, QVariant> &configuration) | 86 | void ResourceConfig::configureResource(const QByteArray &identifier, const QMap<QByteArray, QVariant> &configuration) |
86 | { | 87 | { |
87 | auto config = getResourceConfig(identifier); | 88 | auto config = getConfig(identifier); |
88 | config->clear(); | 89 | config->clear(); |
89 | for (const auto &key : configuration.keys()) { | 90 | for (const auto &key : configuration.keys()) { |
90 | config->setValue(key, configuration.value(key)); | 91 | config->setValue(key, configuration.value(key)); |
@@ -95,7 +96,77 @@ void ResourceConfig::configureResource(const QByteArray &identifier, const QMap< | |||
95 | QMap<QByteArray, QVariant> ResourceConfig::getConfiguration(const QByteArray &identifier) | 96 | QMap<QByteArray, QVariant> ResourceConfig::getConfiguration(const QByteArray &identifier) |
96 | { | 97 | { |
97 | QMap<QByteArray, QVariant> configuration; | 98 | QMap<QByteArray, QVariant> configuration; |
98 | auto config = getResourceConfig(identifier); | 99 | auto config = getConfig(identifier); |
100 | for (const auto &key : config->allKeys()) { | ||
101 | configuration.insert(key.toLatin1(), config->value(key)); | ||
102 | } | ||
103 | return configuration; | ||
104 | } | ||
105 | |||
106 | |||
107 | QByteArray AccountConfig::newIdentifier(const QByteArray &type) | ||
108 | { | ||
109 | auto settings = getConfig("accounts"); | ||
110 | const auto counter = settings->value("instanceCounter", 0).toInt() + 1; | ||
111 | const QByteArray identifier = type + ".instance" + QByteArray::number(counter); | ||
112 | settings->setValue("instanceCounter", counter); | ||
113 | settings->sync(); | ||
114 | return identifier; | ||
115 | } | ||
116 | |||
117 | void AccountConfig::addAccount(const QByteArray &identifier, const QByteArray &type) | ||
118 | { | ||
119 | auto settings = getConfig("accounts"); | ||
120 | settings->beginGroup(QString::fromLatin1(identifier)); | ||
121 | settings->setValue("type", type); | ||
122 | settings->endGroup(); | ||
123 | settings->sync(); | ||
124 | } | ||
125 | |||
126 | void AccountConfig::removeAccount(const QByteArray &identifier) | ||
127 | { | ||
128 | auto settings = getConfig("accounts"); | ||
129 | settings->beginGroup(QString::fromLatin1(identifier)); | ||
130 | settings->remove(""); | ||
131 | settings->endGroup(); | ||
132 | settings->sync(); | ||
133 | QFile::remove(getConfig(identifier)->fileName()); | ||
134 | } | ||
135 | |||
136 | QMap<QByteArray, QByteArray> AccountConfig::getAccounts() | ||
137 | { | ||
138 | QMap<QByteArray, QByteArray> accounts; | ||
139 | auto settings = getConfig("accounts"); | ||
140 | for (const auto &identifier : settings->childGroups()) { | ||
141 | settings->beginGroup(identifier); | ||
142 | const auto type = settings->value("type").toByteArray(); | ||
143 | accounts.insert(identifier.toLatin1(), type); | ||
144 | settings->endGroup(); | ||
145 | } | ||
146 | return accounts; | ||
147 | } | ||
148 | |||
149 | void AccountConfig::clear() | ||
150 | { | ||
151 | auto settings = getSettings(); | ||
152 | settings->clear(); | ||
153 | settings->sync(); | ||
154 | } | ||
155 | |||
156 | void AccountConfig::configureAccount(const QByteArray &identifier, const QMap<QByteArray, QVariant> &configuration) | ||
157 | { | ||
158 | auto config = getConfig(identifier); | ||
159 | config->clear(); | ||
160 | for (const auto &key : configuration.keys()) { | ||
161 | config->setValue(key, configuration.value(key)); | ||
162 | } | ||
163 | config->sync(); | ||
164 | } | ||
165 | |||
166 | QMap<QByteArray, QVariant> AccountConfig::getConfiguration(const QByteArray &identifier) | ||
167 | { | ||
168 | QMap<QByteArray, QVariant> configuration; | ||
169 | auto config = getConfig(identifier); | ||
99 | for (const auto &key : config->allKeys()) { | 170 | for (const auto &key : config->allKeys()) { |
100 | configuration.insert(key.toLatin1(), config->value(key)); | 171 | configuration.insert(key.toLatin1(), config->value(key)); |
101 | } | 172 | } |
diff --git a/common/resourceconfig.h b/common/resourceconfig.h index 2108caa..505b5ec 100644 --- a/common/resourceconfig.h +++ b/common/resourceconfig.h | |||
@@ -36,3 +36,15 @@ public: | |||
36 | static void configureResource(const QByteArray &identifier, const QMap<QByteArray, QVariant> &configuration); | 36 | static void configureResource(const QByteArray &identifier, const QMap<QByteArray, QVariant> &configuration); |
37 | static QMap<QByteArray, QVariant> getConfiguration(const QByteArray &identifier); | 37 | static QMap<QByteArray, QVariant> getConfiguration(const QByteArray &identifier); |
38 | }; | 38 | }; |
39 | |||
40 | class SINK_EXPORT AccountConfig | ||
41 | { | ||
42 | public: | ||
43 | static QMap<QByteArray, QByteArray> getAccounts(); | ||
44 | static QByteArray newIdentifier(const QByteArray &type); | ||
45 | static void addAccount(const QByteArray &identifier, const QByteArray &type); | ||
46 | static void removeAccount(const QByteArray &identifier); | ||
47 | static void clear(); | ||
48 | static void configureAccount(const QByteArray &identifier, const QMap<QByteArray, QVariant> &configuration); | ||
49 | static QMap<QByteArray, QVariant> getConfiguration(const QByteArray &identifier); | ||
50 | }; | ||
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index 3095c2e..d91c974 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp | |||
@@ -126,3 +126,102 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::S | |||
126 | }); | 126 | }); |
127 | return qMakePair(job, emitter); | 127 | return qMakePair(job, emitter); |
128 | } | 128 | } |
129 | |||
130 | |||
131 | AccountFacade::AccountFacade(const QByteArray &) : Sink::StoreFacade<Sink::ApplicationDomain::SinkAccount>() | ||
132 | { | ||
133 | } | ||
134 | |||
135 | AccountFacade::~AccountFacade() | ||
136 | { | ||
137 | } | ||
138 | |||
139 | KAsync::Job<void> AccountFacade::create(const Sink::ApplicationDomain::SinkAccount &account) | ||
140 | { | ||
141 | return KAsync::start<void>([account, this]() { | ||
142 | const QByteArray type = account.getProperty("type").toByteArray(); | ||
143 | const QByteArray providedIdentifier = account.getProperty("identifier").toByteArray(); | ||
144 | // It is currently a requirement that the account starts with the type | ||
145 | const QByteArray identifier = providedIdentifier.isEmpty() ? AccountConfig::newIdentifier(type) : providedIdentifier; | ||
146 | AccountConfig::addAccount(identifier, type); | ||
147 | auto changedProperties = account.changedProperties(); | ||
148 | changedProperties.removeOne("identifier"); | ||
149 | changedProperties.removeOne("type"); | ||
150 | if (!changedProperties.isEmpty()) { | ||
151 | // We have some configuration values | ||
152 | QMap<QByteArray, QVariant> configurationValues; | ||
153 | for (const auto &property : changedProperties) { | ||
154 | configurationValues.insert(property, account.getProperty(property)); | ||
155 | } | ||
156 | AccountConfig::configureAccount(identifier, configurationValues); | ||
157 | } | ||
158 | }); | ||
159 | } | ||
160 | |||
161 | KAsync::Job<void> AccountFacade::modify(const Sink::ApplicationDomain::SinkAccount &account) | ||
162 | { | ||
163 | return KAsync::start<void>([account, this]() { | ||
164 | const QByteArray identifier = account.identifier(); | ||
165 | if (identifier.isEmpty()) { | ||
166 | Warning() << "We need an \"identifier\" property to identify the account to configure."; | ||
167 | return; | ||
168 | } | ||
169 | auto changedProperties = account.changedProperties(); | ||
170 | changedProperties.removeOne("identifier"); | ||
171 | changedProperties.removeOne("type"); | ||
172 | if (!changedProperties.isEmpty()) { | ||
173 | // We have some configuration values | ||
174 | QMap<QByteArray, QVariant> configurationValues; | ||
175 | for (const auto &property : changedProperties) { | ||
176 | configurationValues.insert(property, account.getProperty(property)); | ||
177 | } | ||
178 | AccountConfig::configureAccount(identifier, configurationValues); | ||
179 | } | ||
180 | }); | ||
181 | } | ||
182 | |||
183 | KAsync::Job<void> AccountFacade::remove(const Sink::ApplicationDomain::SinkAccount &account) | ||
184 | { | ||
185 | return KAsync::start<void>([account, this]() { | ||
186 | const QByteArray identifier = account.identifier(); | ||
187 | if (identifier.isEmpty()) { | ||
188 | Warning() << "We need an \"identifier\" property to identify the account to configure"; | ||
189 | return; | ||
190 | } | ||
191 | AccountConfig::removeAccount(identifier); | ||
192 | }); | ||
193 | } | ||
194 | |||
195 | QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::SinkAccount::Ptr>::Ptr> AccountFacade::load(const Sink::Query &query) | ||
196 | { | ||
197 | auto resultProvider = new Sink::ResultProvider<typename Sink::ApplicationDomain::SinkAccount::Ptr>(); | ||
198 | auto emitter = resultProvider->emitter(); | ||
199 | resultProvider->setFetcher([](const QSharedPointer<Sink::ApplicationDomain::SinkAccount> &) {}); | ||
200 | resultProvider->onDone([resultProvider]() { delete resultProvider; }); | ||
201 | auto job = KAsync::start<void>([query, resultProvider]() { | ||
202 | const auto configuredAccounts = AccountConfig::getAccounts(); | ||
203 | for (const auto &res : configuredAccounts.keys()) { | ||
204 | const auto type = configuredAccounts.value(res); | ||
205 | if (query.propertyFilter.contains("type") && query.propertyFilter.value("type").toByteArray() != type) { | ||
206 | continue; | ||
207 | } | ||
208 | if (!query.ids.isEmpty() && !query.ids.contains(res)) { | ||
209 | continue; | ||
210 | } | ||
211 | |||
212 | auto account = Sink::ApplicationDomain::SinkAccount::Ptr::create("", res, 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); | ||
213 | account->setProperty("type", type); | ||
214 | |||
215 | const auto configurationValues = AccountConfig::getConfiguration(res); | ||
216 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { | ||
217 | account->setProperty(it.key(), it.value()); | ||
218 | } | ||
219 | |||
220 | resultProvider->add(account); | ||
221 | } | ||
222 | // TODO initialResultSetComplete should be implicit | ||
223 | resultProvider->initialResultSetComplete(Sink::ApplicationDomain::SinkAccount::Ptr()); | ||
224 | resultProvider->complete(); | ||
225 | }); | ||
226 | return qMakePair(job, emitter); | ||
227 | } | ||
diff --git a/common/resourcefacade.h b/common/resourcefacade.h index 3de0e25..48ff2a5 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h | |||
@@ -40,3 +40,14 @@ public: | |||
40 | KAsync::Job<void> remove(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; | 40 | KAsync::Job<void> remove(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; |
41 | QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::SinkResource::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; | 41 | QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::SinkResource::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; |
42 | }; | 42 | }; |
43 | |||
44 | class AccountFacade : public Sink::StoreFacade<Sink::ApplicationDomain::SinkAccount> | ||
45 | { | ||
46 | public: | ||
47 | AccountFacade(const QByteArray &instanceIdentifier); | ||
48 | virtual ~AccountFacade(); | ||
49 | KAsync::Job<void> create(const Sink::ApplicationDomain::SinkAccount &resource) Q_DECL_OVERRIDE; | ||
50 | KAsync::Job<void> modify(const Sink::ApplicationDomain::SinkAccount &resource) Q_DECL_OVERRIDE; | ||
51 | KAsync::Job<void> remove(const Sink::ApplicationDomain::SinkAccount &resource) Q_DECL_OVERRIDE; | ||
52 | QPair<KAsync::Job<void>, typename Sink::ResultEmitter<Sink::ApplicationDomain::SinkAccount::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; | ||
53 | }; | ||