diff options
Diffstat (limited to 'client/clientapi.h')
-rw-r--r-- | client/clientapi.h | 149 |
1 files changed, 84 insertions, 65 deletions
diff --git a/client/clientapi.h b/client/clientapi.h index 4ec90e2..44fc98b 100644 --- a/client/clientapi.h +++ b/client/clientapi.h | |||
@@ -3,6 +3,8 @@ | |||
3 | #include <QString> | 3 | #include <QString> |
4 | #include <QSet> | 4 | #include <QSet> |
5 | #include <QSharedPointer> | 5 | #include <QSharedPointer> |
6 | #include <QTimer> | ||
7 | #include <QDebug> | ||
6 | #include <functional> | 8 | #include <functional> |
7 | 9 | ||
8 | namespace async { | 10 | namespace async { |
@@ -100,28 +102,45 @@ namespace Domain { | |||
100 | 102 | ||
101 | class AkonadiDomainType { | 103 | class AkonadiDomainType { |
102 | public: | 104 | public: |
105 | AkonadiDomainType(const QString &resource, const QString &identifier, qint64 revision) | ||
106 | : mResource(resource), | ||
107 | mIdentifier(identifier), | ||
108 | mRevision(revision) | ||
109 | { | ||
110 | } | ||
111 | |||
112 | virtual QVariant getProperty(const QString &key){ return QVariant(); } | ||
113 | |||
114 | private: | ||
103 | /* | 115 | /* |
104 | * Each domain object needs to store the resource, identifier, revision triple so we can link back to the storage location. | 116 | * Each domain object needs to store the resource, identifier, revision triple so we can link back to the storage location. |
105 | */ | 117 | */ |
106 | QString identifier; | 118 | QString mResource; |
107 | QString resource; | 119 | QString mIdentifier; |
108 | qint64 revision; | 120 | qint64 mRevision; |
109 | }; | 121 | }; |
110 | 122 | ||
111 | class Event : public AkonadiDomainType { | 123 | class Event : public AkonadiDomainType { |
124 | public: | ||
125 | typedef QSharedPointer<Event> Ptr; | ||
126 | Event(const QString &resource, const QString &identifier, qint64 revision):AkonadiDomainType(resource, identifier, revision){}; | ||
112 | 127 | ||
113 | }; | 128 | }; |
114 | class Todo : public AkonadiDomainType { | ||
115 | 129 | ||
130 | class Todo : public AkonadiDomainType { | ||
131 | public: | ||
132 | typedef QSharedPointer<Todo> Ptr; | ||
116 | }; | 133 | }; |
117 | class Calendar : public AkonadiDomainType { | ||
118 | 134 | ||
135 | class Calendar : public AkonadiDomainType { | ||
136 | public: | ||
137 | typedef QSharedPointer<Calendar> Ptr; | ||
119 | }; | 138 | }; |
120 | class Mail : public AkonadiDomainType { | ||
121 | 139 | ||
140 | class Mail : public AkonadiDomainType { | ||
122 | }; | 141 | }; |
123 | class Folder : public AkonadiDomainType { | ||
124 | 142 | ||
143 | class Folder : public AkonadiDomainType { | ||
125 | }; | 144 | }; |
126 | 145 | ||
127 | /** | 146 | /** |
@@ -185,7 +204,7 @@ public: | |||
185 | virtual void create(const DomainType &domainObject) = 0; | 204 | virtual void create(const DomainType &domainObject) = 0; |
186 | virtual void modify(const DomainType &domainObject) = 0; | 205 | virtual void modify(const DomainType &domainObject) = 0; |
187 | virtual void remove(const DomainType &domainObject) = 0; | 206 | virtual void remove(const DomainType &domainObject) = 0; |
188 | virtual void load(const Query &query, const std::function<void(const DomainType &)> &resultCallback) = 0; | 207 | virtual void load(const Query &query, const std::function<void(const typename DomainType::Ptr &)> &resultCallback) = 0; |
189 | }; | 208 | }; |
190 | 209 | ||
191 | 210 | ||
@@ -262,9 +281,9 @@ public: | |||
262 | * Asynchronusly load a dataset | 281 | * Asynchronusly load a dataset |
263 | */ | 282 | */ |
264 | template <class DomainType> | 283 | template <class DomainType> |
265 | static QSharedPointer<ResultEmitter<DomainType> > load(Query query) | 284 | static QSharedPointer<ResultEmitter<typename DomainType::Ptr> > load(Query query) |
266 | { | 285 | { |
267 | QSharedPointer<ResultProvider<DomainType> > resultSet(new ResultProvider<DomainType>); | 286 | QSharedPointer<ResultProvider<typename DomainType::Ptr> > resultSet(new ResultProvider<typename DomainType::Ptr>); |
268 | 287 | ||
269 | //Execute the search in a thread. | 288 | //Execute the search in a thread. |
270 | //We must guarantee that the emitter is returned before the first result is emitted. | 289 | //We must guarantee that the emitter is returned before the first result is emitted. |
@@ -275,7 +294,7 @@ public: | |||
275 | for(const QString &resource : query.resources) { | 294 | for(const QString &resource : query.resources) { |
276 | auto facade = FacadeFactory::instance().getFacade<DomainType>(resource); | 295 | auto facade = FacadeFactory::instance().getFacade<DomainType>(resource); |
277 | //We have to bind an instance to the function callback. Since we use a shared pointer this keeps the result provider instance (and thus also the emitter) alive. | 296 | //We have to bind an instance to the function callback. Since we use a shared pointer this keeps the result provider instance (and thus also the emitter) alive. |
278 | std::function<void(const DomainType &)> addCallback = std::bind(&ResultProvider<DomainType>::add, resultSet, std::placeholders::_1); | 297 | std::function<void(const typename DomainType::Ptr &)> addCallback = std::bind(&ResultProvider<typename DomainType::Ptr>::add, resultSet, std::placeholders::_1); |
279 | facade->load(query, addCallback); | 298 | facade->load(query, addCallback); |
280 | } | 299 | } |
281 | resultSet->complete(); | 300 | resultSet->complete(); |
@@ -363,58 +382,58 @@ class EventDomainAdapter : public Akonadi2::Domain::Event { | |||
363 | * | 382 | * |
364 | * TODO: perhaps we should also allow async access and leave the thread/non-thread decision up to the implementation? | 383 | * TODO: perhaps we should also allow async access and leave the thread/non-thread decision up to the implementation? |
365 | */ | 384 | */ |
366 | template<typename DomainType> | 385 | // template<typename DomainType> |
367 | class StoreFacadeImpl : public Akonadi2::StoreFacade<Akonadi2::Domain::Event> { | 386 | // class StoreFacadeImpl : public Akonadi2::StoreFacade<Akonadi2::Domain::Event> { |
368 | }; | 387 | // }; |
369 | 388 | // | |
370 | template<> | 389 | // template<> |
371 | class StoreFacadeImpl<Akonadi2::Domain::Event> : public Akonadi2::StoreFacade<Akonadi2::Domain::Event> { | 390 | // class StoreFacadeImpl<Akonadi2::Domain::Event> : public Akonadi2::StoreFacade<Akonadi2::Domain::Event> { |
372 | public: | 391 | // public: |
373 | StoreFacadeImpl():StoreFacade() {}; | 392 | // StoreFacadeImpl():StoreFacade() {}; |
374 | 393 | // | |
375 | void create(const Akonadi2::Domain::Event &domainObject) { | 394 | // void create(const Akonadi2::Domain::Event &domainObject) { |
376 | //FIXME here we would need to cast to DomainAdapter | 395 | // //FIXME here we would need to cast to DomainAdapter |
377 | //Do actual work | 396 | // //Do actual work |
378 | //transformFromDomainType(domainObject); | 397 | // //transformFromDomainType(domainObject); |
379 | //Ideally we have an adapter | 398 | // //Ideally we have an adapter |
380 | //getAdater(domainObject).buffer(); | 399 | // //getAdater(domainObject).buffer(); |
381 | //domainObject.key(); => The domain object needs to provide the id | 400 | // //domainObject.key(); => The domain object needs to provide the id |
382 | //writeToDb(); | 401 | // //writeToDb(); |
383 | } | 402 | // } |
384 | 403 | // | |
385 | void modify(const Akonadi2::Domain::Event &domainObject) { | 404 | // void modify(const Akonadi2::Domain::Event &domainObject) { |
386 | //Do actual work | 405 | // //Do actual work |
387 | } | 406 | // } |
388 | 407 | // | |
389 | void remove(const Akonadi2::Domain::Event &domainObject) { | 408 | // void remove(const Akonadi2::Domain::Event &domainObject) { |
390 | //Do actual work | 409 | // //Do actual work |
391 | } | 410 | // } |
392 | 411 | // | |
393 | class EventBuffer { | 412 | // class EventBuffer { |
394 | QString value; | 413 | // QString value; |
395 | }; | 414 | // }; |
396 | 415 | // | |
397 | static Akonadi2::Domain::Event transformToDomainType(const EventBuffer &buffer) { | 416 | // static Akonadi2::Domain::Event transformToDomainType(const EventBuffer &buffer) { |
398 | //We may want to avoid copies here | 417 | // //We may want to avoid copies here |
399 | Akonadi2::Domain::Event event; | 418 | // Akonadi2::Domain::Event event; |
400 | // //Ideally we don't have to copy and can use an adaptor instead | 419 | // // //Ideally we don't have to copy and can use an adaptor instead |
401 | // return DomainAdaptor | 420 | // // return DomainAdaptor |
402 | return event; | 421 | // return event; |
403 | }; | 422 | // }; |
404 | 423 | // | |
405 | void load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::Domain::Event &)> &resultCallback) { | 424 | // void load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::Domain::Event &)> &resultCallback) { |
406 | //retrieve buffers from storage | 425 | // //retrieve buffers from storage |
407 | QList<EventBuffer> queryresult; | 426 | // QList<EventBuffer> queryresult; |
408 | for(const EventBuffer &buffer : queryresult) { | 427 | // for(const EventBuffer &buffer : queryresult) { |
409 | resultCallback(transformToDomainType(buffer)); | 428 | // resultCallback(transformToDomainType(buffer)); |
410 | } | 429 | // } |
411 | } | 430 | // } |
412 | 431 | // | |
413 | private: | 432 | // private: |
414 | //Dummy implementation | 433 | // //Dummy implementation |
415 | class ResourceImpl {}; | 434 | // class ResourceImpl {}; |
416 | ResourceImpl resource; | 435 | // ResourceImpl resource; |
417 | class DatabaseImpl {}; | 436 | // class DatabaseImpl {}; |
418 | DatabaseImpl mDb; | 437 | // DatabaseImpl mDb; |
419 | }; | 438 | // }; |
420 | 439 | ||