Mercurial > hg > piper-cpp
comparison utilities/vampipe-convert.cpp @ 73:7bfc07576830
Ensure id is passed through properly in convert and in server
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Mon, 10 Oct 2016 15:03:47 +0100 |
parents | a5ba837bca28 |
children |
comparison
equal
deleted
inserted
replaced
72:16acd7d24b1a | 73:7bfc07576830 |
---|---|
77 //!!! Lots of potential for refactoring the conversion classes based | 77 //!!! Lots of potential for refactoring the conversion classes based |
78 //!!! on the common matter in the following eight functions... | 78 //!!! on the common matter in the following eight functions... |
79 | 79 |
80 PreservingPluginHandleMapper mapper; | 80 PreservingPluginHandleMapper mapper; |
81 | 81 |
82 static RequestOrResponse::RpcId | |
83 readJsonId(const Json &j) | |
84 { | |
85 RequestOrResponse::RpcId id; | |
86 | |
87 if (j["id"].is_number()) { | |
88 id.type = RequestOrResponse::RpcId::Number; | |
89 id.number = j["id"].number_value(); | |
90 } else if (j["id"].is_string()) { | |
91 id.type = RequestOrResponse::RpcId::Tag; | |
92 id.tag = j["id"].string_value(); | |
93 } else { | |
94 id.type = RequestOrResponse::RpcId::Absent; | |
95 } | |
96 | |
97 return id; | |
98 } | |
99 | |
100 static Json | |
101 writeJsonId(const RequestOrResponse::RpcId &id) | |
102 { | |
103 if (id.type == RequestOrResponse::RpcId::Number) { | |
104 return id.number; | |
105 } else if (id.type == RequestOrResponse::RpcId::Tag) { | |
106 return id.tag; | |
107 } else { | |
108 return Json(); | |
109 } | |
110 } | |
111 | |
112 template <typename Reader> | |
113 static RequestOrResponse::RpcId | |
114 readCapnpId(const Reader &r) | |
115 { | |
116 int number; | |
117 string tag; | |
118 switch (r.getId().which()) { | |
119 case RpcRequest::Id::Which::NUMBER: | |
120 number = r.getId().getNumber(); | |
121 return { RequestOrResponse::RpcId::Number, number, "" }; | |
122 case RpcRequest::Id::Which::TAG: | |
123 tag = r.getId().getTag(); | |
124 return { RequestOrResponse::RpcId::Tag, 0, tag }; | |
125 case RpcRequest::Id::Which::NONE: | |
126 return { RequestOrResponse::RpcId::Absent, 0, "" }; | |
127 } | |
128 return {}; | |
129 } | |
130 | |
131 template <typename Builder> | |
132 static void | |
133 buildCapnpId(Builder &b, const RequestOrResponse::RpcId &id) | |
134 { | |
135 switch (id.type) { | |
136 case RequestOrResponse::RpcId::Number: | |
137 b.getId().setNumber(id.number); | |
138 break; | |
139 case RequestOrResponse::RpcId::Tag: | |
140 b.getId().setTag(id.tag); | |
141 break; | |
142 case RequestOrResponse::RpcId::Absent: | |
143 b.getId().setNone(); | |
144 break; | |
145 } | |
146 } | |
147 | |
82 RequestOrResponse | 148 RequestOrResponse |
83 readRequestJson(string &err) | 149 readRequestJson(string &err) |
84 { | 150 { |
85 RequestOrResponse rr; | 151 RequestOrResponse rr; |
86 rr.direction = RequestOrResponse::Request; | 152 rr.direction = RequestOrResponse::Request; |
95 Json j = convertRequestJson(input, err); | 161 Json j = convertRequestJson(input, err); |
96 if (err != "") return {}; | 162 if (err != "") return {}; |
97 | 163 |
98 rr.type = VampJson::getRequestResponseType(j, err); | 164 rr.type = VampJson::getRequestResponseType(j, err); |
99 if (err != "") return {}; | 165 if (err != "") return {}; |
100 | 166 |
167 rr.id = readJsonId(j); | |
168 | |
101 VampJson::BufferSerialisation serialisation = | 169 VampJson::BufferSerialisation serialisation = |
102 VampJson::BufferSerialisation::Array; | 170 VampJson::BufferSerialisation::Array; |
103 | 171 |
104 switch (rr.type) { | 172 switch (rr.type) { |
105 | 173 |
133 VampJson::BufferSerialisation serialisation = | 201 VampJson::BufferSerialisation serialisation = |
134 (useBase64 ? | 202 (useBase64 ? |
135 VampJson::BufferSerialisation::Base64 : | 203 VampJson::BufferSerialisation::Base64 : |
136 VampJson::BufferSerialisation::Array); | 204 VampJson::BufferSerialisation::Array); |
137 | 205 |
206 Json id = writeJsonId(rr.id); | |
207 | |
138 switch (rr.type) { | 208 switch (rr.type) { |
139 | 209 |
140 case RRType::List: | 210 case RRType::List: |
141 j = VampJson::fromRpcRequest_List(); | 211 j = VampJson::fromRpcRequest_List(id); |
142 break; | 212 break; |
143 case RRType::Load: | 213 case RRType::Load: |
144 j = VampJson::fromRpcRequest_Load(rr.loadRequest); | 214 j = VampJson::fromRpcRequest_Load(rr.loadRequest, id); |
145 break; | 215 break; |
146 case RRType::Configure: | 216 case RRType::Configure: |
147 j = VampJson::fromRpcRequest_Configure(rr.configurationRequest, mapper); | 217 j = VampJson::fromRpcRequest_Configure(rr.configurationRequest, mapper, id); |
148 break; | 218 break; |
149 case RRType::Process: | 219 case RRType::Process: |
150 j = VampJson::fromRpcRequest_Process | 220 j = VampJson::fromRpcRequest_Process |
151 (rr.processRequest, mapper, serialisation); | 221 (rr.processRequest, mapper, serialisation, id); |
152 break; | 222 break; |
153 case RRType::Finish: | 223 case RRType::Finish: |
154 j = VampJson::fromRpcRequest_Finish(rr.finishRequest, mapper); | 224 j = VampJson::fromRpcRequest_Finish(rr.finishRequest, mapper, id); |
155 break; | 225 break; |
156 case RRType::NotValid: | 226 case RRType::NotValid: |
157 break; | 227 break; |
158 } | 228 } |
159 | 229 |
176 Json j = convertResponseJson(input, err); | 246 Json j = convertResponseJson(input, err); |
177 if (err != "") return {}; | 247 if (err != "") return {}; |
178 | 248 |
179 rr.type = VampJson::getRequestResponseType(j, err); | 249 rr.type = VampJson::getRequestResponseType(j, err); |
180 if (err != "") return {}; | 250 if (err != "") return {}; |
251 | |
252 rr.id = readJsonId(j); | |
181 | 253 |
182 VampJson::BufferSerialisation serialisation = | 254 VampJson::BufferSerialisation serialisation = |
183 VampJson::BufferSerialisation::Array; | 255 VampJson::BufferSerialisation::Array; |
184 | 256 |
185 rr.success = j["success"].bool_value(); | 257 rr.success = j["success"].bool_value(); |
217 VampJson::BufferSerialisation serialisation = | 289 VampJson::BufferSerialisation serialisation = |
218 (useBase64 ? | 290 (useBase64 ? |
219 VampJson::BufferSerialisation::Base64 : | 291 VampJson::BufferSerialisation::Base64 : |
220 VampJson::BufferSerialisation::Array); | 292 VampJson::BufferSerialisation::Array); |
221 | 293 |
294 Json id = writeJsonId(rr.id); | |
295 | |
222 if (!rr.success) { | 296 if (!rr.success) { |
223 | 297 |
224 j = VampJson::fromError(rr.errorText, rr.type); | 298 j = VampJson::fromError(rr.errorText, rr.type, id); |
225 | 299 |
226 } else { | 300 } else { |
227 | 301 |
228 switch (rr.type) { | 302 switch (rr.type) { |
229 | 303 |
230 case RRType::List: | 304 case RRType::List: |
231 j = VampJson::fromRpcResponse_List(rr.listResponse); | 305 j = VampJson::fromRpcResponse_List(rr.listResponse, id); |
232 break; | 306 break; |
233 case RRType::Load: | 307 case RRType::Load: |
234 j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper); | 308 j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper, id); |
235 break; | 309 break; |
236 case RRType::Configure: | 310 case RRType::Configure: |
237 j = VampJson::fromRpcResponse_Configure(rr.configurationResponse, | 311 j = VampJson::fromRpcResponse_Configure(rr.configurationResponse, |
238 mapper); | 312 mapper, id); |
239 break; | 313 break; |
240 case RRType::Process: | 314 case RRType::Process: |
241 j = VampJson::fromRpcResponse_Process | 315 j = VampJson::fromRpcResponse_Process |
242 (rr.processResponse, mapper, serialisation); | 316 (rr.processResponse, mapper, serialisation, id); |
243 break; | 317 break; |
244 case RRType::Finish: | 318 case RRType::Finish: |
245 j = VampJson::fromRpcResponse_Finish | 319 j = VampJson::fromRpcResponse_Finish |
246 (rr.finishResponse, mapper, serialisation); | 320 (rr.finishResponse, mapper, serialisation, id); |
247 break; | 321 break; |
248 case RRType::NotValid: | 322 case RRType::NotValid: |
249 break; | 323 break; |
250 } | 324 } |
251 } | 325 } |
261 | 335 |
262 ::capnp::InputStreamMessageReader message(buffered); | 336 ::capnp::InputStreamMessageReader message(buffered); |
263 RpcRequest::Reader reader = message.getRoot<RpcRequest>(); | 337 RpcRequest::Reader reader = message.getRoot<RpcRequest>(); |
264 | 338 |
265 rr.type = VampnProto::getRequestResponseType(reader); | 339 rr.type = VampnProto::getRequestResponseType(reader); |
340 rr.id = readCapnpId(reader); | |
266 | 341 |
267 switch (rr.type) { | 342 switch (rr.type) { |
268 | 343 |
269 case RRType::List: | 344 case RRType::List: |
270 VampnProto::readRpcRequest_List(reader); // type check only | 345 VampnProto::readRpcRequest_List(reader); // type check only |
293 writeRequestCapnp(RequestOrResponse &rr) | 368 writeRequestCapnp(RequestOrResponse &rr) |
294 { | 369 { |
295 ::capnp::MallocMessageBuilder message; | 370 ::capnp::MallocMessageBuilder message; |
296 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); | 371 RpcRequest::Builder builder = message.initRoot<RpcRequest>(); |
297 | 372 |
373 buildCapnpId(builder, rr.id); | |
374 | |
298 switch (rr.type) { | 375 switch (rr.type) { |
299 | 376 |
300 case RRType::List: | 377 case RRType::List: |
301 VampnProto::buildRpcRequest_List(builder); | 378 VampnProto::buildRpcRequest_List(builder); |
302 break; | 379 break; |
330 RpcResponse::Reader reader = message.getRoot<RpcResponse>(); | 407 RpcResponse::Reader reader = message.getRoot<RpcResponse>(); |
331 | 408 |
332 rr.type = VampnProto::getRequestResponseType(reader); | 409 rr.type = VampnProto::getRequestResponseType(reader); |
333 rr.success = true; | 410 rr.success = true; |
334 rr.errorText = ""; | 411 rr.errorText = ""; |
412 rr.id = readCapnpId(reader); | |
335 int errorCode = 0; | 413 int errorCode = 0; |
336 | 414 |
337 switch (rr.type) { | 415 switch (rr.type) { |
338 | 416 |
339 case RRType::List: | 417 case RRType::List: |
365 void | 443 void |
366 writeResponseCapnp(RequestOrResponse &rr) | 444 writeResponseCapnp(RequestOrResponse &rr) |
367 { | 445 { |
368 ::capnp::MallocMessageBuilder message; | 446 ::capnp::MallocMessageBuilder message; |
369 RpcResponse::Builder builder = message.initRoot<RpcResponse>(); | 447 RpcResponse::Builder builder = message.initRoot<RpcResponse>(); |
448 | |
449 buildCapnpId(builder, rr.id); | |
370 | 450 |
371 if (!rr.success) { | 451 if (!rr.success) { |
372 | 452 |
373 VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type); | 453 VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type); |
374 | 454 |