diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/resourceaccess.cpp | 40 | ||||
-rw-r--r-- | common/resourceaccess.h | 2 |
2 files changed, 25 insertions, 17 deletions
diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp index 227f25c..b874679 100644 --- a/common/resourceaccess.cpp +++ b/common/resourceaccess.cpp | |||
@@ -38,14 +38,14 @@ namespace Akonadi2 | |||
38 | class QueuedCommand | 38 | class QueuedCommand |
39 | { | 39 | { |
40 | public: | 40 | public: |
41 | QueuedCommand(int commandId, const std::function<void()> &callback) | 41 | QueuedCommand(int commandId, const std::function<void(int, const QString &)> &callback) |
42 | : commandId(commandId), | 42 | : commandId(commandId), |
43 | bufferSize(0), | 43 | bufferSize(0), |
44 | buffer(0), | 44 | buffer(0), |
45 | callback(callback) | 45 | callback(callback) |
46 | {} | 46 | {} |
47 | 47 | ||
48 | QueuedCommand(int commandId, flatbuffers::FlatBufferBuilder &fbb, const std::function<void()> &callback) | 48 | QueuedCommand(int commandId, flatbuffers::FlatBufferBuilder &fbb, const std::function<void(int, const QString &)> &callback) |
49 | : commandId(commandId), | 49 | : commandId(commandId), |
50 | bufferSize(fbb.GetSize()), | 50 | bufferSize(fbb.GetSize()), |
51 | buffer(new char[bufferSize]), | 51 | buffer(new char[bufferSize]), |
@@ -67,7 +67,7 @@ public: | |||
67 | const int commandId; | 67 | const int commandId; |
68 | const uint bufferSize; | 68 | const uint bufferSize; |
69 | char *buffer; | 69 | char *buffer; |
70 | std::function<void()> callback; | 70 | std::function<void(int, const QString &)> callback; |
71 | }; | 71 | }; |
72 | 72 | ||
73 | class ResourceAccess::Private | 73 | class ResourceAccess::Private |
@@ -81,7 +81,7 @@ public: | |||
81 | QByteArray partialMessageBuffer; | 81 | QByteArray partialMessageBuffer; |
82 | flatbuffers::FlatBufferBuilder fbb; | 82 | flatbuffers::FlatBufferBuilder fbb; |
83 | QVector<QueuedCommand *> commandQueue; | 83 | QVector<QueuedCommand *> commandQueue; |
84 | QMultiMap<uint, std::function<void()> > resultHandler; | 84 | QMultiMap<uint, std::function<void(int error, const QString &errorMessage)> > resultHandler; |
85 | uint messageId; | 85 | uint messageId; |
86 | }; | 86 | }; |
87 | 87 | ||
@@ -129,7 +129,7 @@ bool ResourceAccess::isReady() const | |||
129 | return d->socket->isValid(); | 129 | return d->socket->isValid(); |
130 | } | 130 | } |
131 | 131 | ||
132 | void ResourceAccess::registerCallback(uint messageId, const std::function<void()> &callback) | 132 | void ResourceAccess::registerCallback(uint messageId, const std::function<void(int error, const QString &errorMessage)> &callback) |
133 | { | 133 | { |
134 | d->resultHandler.insert(messageId, callback); | 134 | d->resultHandler.insert(messageId, callback); |
135 | } | 135 | } |
@@ -137,27 +137,33 @@ void ResourceAccess::registerCallback(uint messageId, const std::function<void() | |||
137 | Async::Job<void> ResourceAccess::sendCommand(int commandId) | 137 | Async::Job<void> ResourceAccess::sendCommand(int commandId) |
138 | { | 138 | { |
139 | return Async::start<void>([this, commandId](Async::Future<void> &f) { | 139 | return Async::start<void>([this, commandId](Async::Future<void> &f) { |
140 | auto continuation = [&f](int error, const QString &errorMessage) { | ||
141 | if (error) { | ||
142 | f.setError(error, errorMessage); | ||
143 | } | ||
144 | f.setFinished(); | ||
145 | }; | ||
140 | if (isReady()) { | 146 | if (isReady()) { |
141 | log(QString("Sending command %1").arg(commandId)); | 147 | log(QString("Sending command %1").arg(commandId)); |
142 | d->messageId++; | 148 | d->messageId++; |
143 | registerCallback(d->messageId, [&f]() { f.setFinished(); }); | 149 | registerCallback(d->messageId, continuation); |
144 | Commands::write(d->socket, d->messageId, commandId); | 150 | Commands::write(d->socket, d->messageId, commandId); |
145 | } else { | 151 | } else { |
146 | d->commandQueue << new QueuedCommand(commandId, [&f]() { f.setFinished(); }); | 152 | d->commandQueue << new QueuedCommand(commandId, continuation); |
147 | } | 153 | } |
148 | }); | 154 | }); |
149 | } | 155 | } |
150 | 156 | ||
151 | struct JobFinisher { | 157 | struct JobFinisher { |
152 | bool finished; | 158 | bool finished; |
153 | std::function<void()> callback; | 159 | std::function<void(int error, const QString &errorMessage)> callback; |
154 | 160 | ||
155 | JobFinisher() : finished(false) {} | 161 | JobFinisher() : finished(false) {} |
156 | 162 | ||
157 | void setFinished() { | 163 | void setFinished(int error, const QString &errorMessage) { |
158 | finished = true; | 164 | finished = true; |
159 | if (callback) { | 165 | if (callback) { |
160 | callback(); | 166 | callback(error, errorMessage); |
161 | } | 167 | } |
162 | } | 168 | } |
163 | }; | 169 | }; |
@@ -165,8 +171,8 @@ struct JobFinisher { | |||
165 | Async::Job<void> ResourceAccess::sendCommand(int commandId, flatbuffers::FlatBufferBuilder &fbb) | 171 | Async::Job<void> ResourceAccess::sendCommand(int commandId, flatbuffers::FlatBufferBuilder &fbb) |
166 | { | 172 | { |
167 | auto finisher = QSharedPointer<JobFinisher>::create(); | 173 | auto finisher = QSharedPointer<JobFinisher>::create(); |
168 | auto callback = [finisher] () { | 174 | auto callback = [finisher] (int error, const QString &errorMessage) { |
169 | finisher->setFinished(); | 175 | finisher->setFinished(error, errorMessage); |
170 | }; | 176 | }; |
171 | if (isReady()) { | 177 | if (isReady()) { |
172 | d->messageId++; | 178 | d->messageId++; |
@@ -180,7 +186,10 @@ Async::Job<void> ResourceAccess::sendCommand(int commandId, flatbuffers::FlatBu | |||
180 | if (finisher->finished) { | 186 | if (finisher->finished) { |
181 | f.setFinished(); | 187 | f.setFinished(); |
182 | } else { | 188 | } else { |
183 | finisher->callback = [&f]() { | 189 | finisher->callback = [&f](int error, const QString &errorMessage) { |
190 | if (error) { | ||
191 | f.setError(error, errorMessage); | ||
192 | } | ||
184 | f.setFinished(); | 193 | f.setFinished(); |
185 | }; | 194 | }; |
186 | } | 195 | } |
@@ -273,8 +282,7 @@ void ResourceAccess::connectionError(QLocalSocket::LocalSocketError error) | |||
273 | } | 282 | } |
274 | 283 | ||
275 | for(auto handler : d->resultHandler.values()) { | 284 | for(auto handler : d->resultHandler.values()) { |
276 | //TODO set error | 285 | handler(1, "The resource closed unexpectedly"); |
277 | handler(); | ||
278 | } | 286 | } |
279 | d->resultHandler.clear(); | 287 | d->resultHandler.clear(); |
280 | 288 | ||
@@ -348,7 +356,7 @@ bool ResourceAccess::processMessageBuffer() | |||
348 | void ResourceAccess::callCallbacks(int id) | 356 | void ResourceAccess::callCallbacks(int id) |
349 | { | 357 | { |
350 | for(auto handler : d->resultHandler.values(id)) { | 358 | for(auto handler : d->resultHandler.values(id)) { |
351 | handler(); | 359 | handler(0, QString()); |
352 | } | 360 | } |
353 | d->resultHandler.remove(id); | 361 | d->resultHandler.remove(id); |
354 | } | 362 | } |
diff --git a/common/resourceaccess.h b/common/resourceaccess.h index fbdd992..c5b8a6c 100644 --- a/common/resourceaccess.h +++ b/common/resourceaccess.h | |||
@@ -65,7 +65,7 @@ private Q_SLOTS: | |||
65 | 65 | ||
66 | private: | 66 | private: |
67 | void log(const QString &message); | 67 | void log(const QString &message); |
68 | void registerCallback(uint messageId, const std::function<void()> &callback); | 68 | void registerCallback(uint messageId, const std::function<void(int error, const QString &)> &callback); |
69 | 69 | ||
70 | class Private; | 70 | class Private; |
71 | Private * const d; | 71 | Private * const d; |