summaryrefslogtreecommitdiffstats
path: root/common/resourceaccess.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-01-25 15:24:55 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-01-25 15:24:55 +0100
commitc6a2d1a828cb819f4622ec730c18bf2c816c6179 (patch)
tree3521cd6f98dea0b84d683b139900971b28322cb1 /common/resourceaccess.cpp
parenta9215eadb1439cf7bb0eb220fb1f7d04a4d46a9a (diff)
downloadsink-c6a2d1a828cb819f4622ec730c18bf2c816c6179.tar.gz
sink-c6a2d1a828cb819f4622ec730c18bf2c816c6179.zip
Propagate errors for commands.
Diffstat (limited to 'common/resourceaccess.cpp')
-rw-r--r--common/resourceaccess.cpp40
1 files changed, 24 insertions, 16 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
38class QueuedCommand 38class QueuedCommand
39{ 39{
40public: 40public:
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
73class ResourceAccess::Private 73class 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
132void ResourceAccess::registerCallback(uint messageId, const std::function<void()> &callback) 132void 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()
137Async::Job<void> ResourceAccess::sendCommand(int commandId) 137Async::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
151struct JobFinisher { 157struct 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 {
165Async::Job<void> ResourceAccess::sendCommand(int commandId, flatbuffers::FlatBufferBuilder &fbb) 171Async::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()
348void ResourceAccess::callCallbacks(int id) 356void 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}