diff options
Diffstat (limited to 'client/clientapi.h')
-rw-r--r-- | client/clientapi.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/client/clientapi.h b/client/clientapi.h index 592fa48..662f96c 100644 --- a/client/clientapi.h +++ b/client/clientapi.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <QStandardPaths> | 6 | #include <QStandardPaths> |
7 | #include <QTimer> | 7 | #include <QTimer> |
8 | #include <QDebug> | 8 | #include <QDebug> |
9 | #include <QEventLoop> | ||
9 | #include <functional> | 10 | #include <functional> |
10 | 11 | ||
11 | namespace async { | 12 | namespace async { |
@@ -64,6 +65,14 @@ namespace async { | |||
64 | * The future side for the client. | 65 | * The future side for the client. |
65 | * | 66 | * |
66 | * It does not directly hold the state. | 67 | * It does not directly hold the state. |
68 | * | ||
69 | * The advantage of this is that we can specialize it to: | ||
70 | * * do inline transformations to the data | ||
71 | * * directly store the state in a suitable datastructure: QList, QSet, std::list, QVector, ... | ||
72 | * * build async interfaces with signals | ||
73 | * * build sync interfaces that block when accessing the value | ||
74 | * | ||
75 | * TODO: This should probably be merged with daniels futurebase used in Async | ||
67 | */ | 76 | */ |
68 | template<class DomainType> | 77 | template<class DomainType> |
69 | class ResultEmitter { | 78 | class ResultEmitter { |
@@ -85,6 +94,42 @@ namespace async { | |||
85 | std::function<void(void)> completeHandler; | 94 | std::function<void(void)> completeHandler; |
86 | }; | 95 | }; |
87 | 96 | ||
97 | |||
98 | /* | ||
99 | * A result set specialization that provides a syncronous list | ||
100 | */ | ||
101 | template<class T> | ||
102 | class SyncListResult : public QList<T> { | ||
103 | public: | ||
104 | SyncListResult(const QSharedPointer<ResultEmitter<T> > &emitter) | ||
105 | :QList<T>(), | ||
106 | mComplete(false), | ||
107 | mEmitter(emitter) | ||
108 | { | ||
109 | emitter->onAdded([this](const T &value) { | ||
110 | this->append(value); | ||
111 | }); | ||
112 | emitter->onComplete([this]() { | ||
113 | mComplete = true; | ||
114 | auto loop = mWaitLoop.toStrongRef(); | ||
115 | if (loop) { | ||
116 | loop->quit(); | ||
117 | } | ||
118 | }); | ||
119 | } | ||
120 | |||
121 | void exec() | ||
122 | { | ||
123 | auto loop = QSharedPointer<QEventLoop>::create(); | ||
124 | mWaitLoop = loop; | ||
125 | loop->exec(QEventLoop::ExcludeUserInputEvents); | ||
126 | } | ||
127 | |||
128 | private: | ||
129 | bool mComplete; | ||
130 | QWeakPointer<QEventLoop> mWaitLoop; | ||
131 | QSharedPointer<ResultEmitter<T> > mEmitter; | ||
132 | }; | ||
88 | } | 133 | } |
89 | 134 | ||
90 | namespace Akonadi2 { | 135 | namespace Akonadi2 { |