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