comparison utilities/vampipe-server.cpp @ 58:c38e12d4bbdd

Merge from branch outputid-string-in-featureset
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 19 Sep 2016 14:48:43 +0100
parents 815e94fedc1c
children a5ba837bca28
comparison
equal deleted inserted replaced
48:ce6cb3308bd7 58:c38e12d4bbdd
63 break; 63 break;
64 case RRType::Process: 64 case RRType::Process:
65 VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper); 65 VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper);
66 break; 66 break;
67 case RRType::Finish: 67 case RRType::Finish:
68 VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, mapper); 68 VampnProto::readVampRequest_Finish(rr.finishRequest, reader, mapper);
69 break; 69 break;
70 case RRType::NotValid: 70 case RRType::NotValid:
71 break; 71 break;
72 } 72 }
73 73
78 writeResponseCapnp(RequestOrResponse &rr) 78 writeResponseCapnp(RequestOrResponse &rr)
79 { 79 {
80 ::capnp::MallocMessageBuilder message; 80 ::capnp::MallocMessageBuilder message;
81 VampResponse::Builder builder = message.initRoot<VampResponse>(); 81 VampResponse::Builder builder = message.initRoot<VampResponse>();
82 82
83 switch (rr.type) { 83 if (!rr.success) {
84 84
85 case RRType::List: 85 VampnProto::buildVampResponse_Error(builder, rr.errorText, rr.type);
86 VampnProto::buildVampResponse_List(builder, "", rr.listResponse); 86
87 break; 87 } else {
88 case RRType::Load: 88
89 VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper); 89 switch (rr.type) {
90 break; 90
91 case RRType::Configure: 91 case RRType::List:
92 VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse); 92 VampnProto::buildVampResponse_List(builder, rr.listResponse);
93 break; 93 break;
94 case RRType::Process: 94 case RRType::Load:
95 VampnProto::buildVampResponse_Process(builder, rr.processResponse); 95 VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper);
96 break; 96 break;
97 case RRType::Finish: 97 case RRType::Configure:
98 VampnProto::buildVampResponse_Finish(builder, rr.finishResponse); 98 VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse, mapper);
99 break; 99 break;
100 case RRType::NotValid: 100 case RRType::Process:
101 break; 101 VampnProto::buildVampResponse_Process(builder, rr.processResponse, mapper);
102 } 102 break;
103 103 case RRType::Finish:
104 VampnProto::buildVampResponse_Finish(builder, rr.finishResponse, mapper);
105 break;
106 case RRType::NotValid:
107 break;
108 }
109 }
110
111 writeMessageToFd(1, message);
112 }
113
114 void
115 writeExceptionCapnp(const std::exception &e, RRType type)
116 {
117 ::capnp::MallocMessageBuilder message;
118 VampResponse::Builder builder = message.initRoot<VampResponse>();
119 VampnProto::buildVampResponse_Exception(builder, e, type);
120
104 writeMessageToFd(1, message); 121 writeMessageToFd(1, message);
105 } 122 }
106 123
107 RequestOrResponse 124 RequestOrResponse
108 handleRequest(const RequestOrResponse &request) 125 handleRequest(const RequestOrResponse &request)
166 throw runtime_error("wrong block size supplied to process"); 183 throw runtime_error("wrong block size supplied to process");
167 } 184 }
168 fbuffers[i] = preq.inputBuffers[i].data(); 185 fbuffers[i] = preq.inputBuffers[i].data();
169 } 186 }
170 187
188 response.processResponse.plugin = preq.plugin;
171 response.processResponse.features = 189 response.processResponse.features =
172 preq.plugin->process(fbuffers, preq.timestamp); 190 preq.plugin->process(fbuffers, preq.timestamp);
173 response.success = true; 191 response.success = true;
174 192
175 delete[] fbuffers; 193 delete[] fbuffers;
176 break; 194 break;
177 } 195 }
178 196
179 case RRType::Finish: 197 case RRType::Finish:
180 { 198 {
181 auto h = mapper.pluginToHandle(request.finishPlugin); 199 response.finishResponse.plugin = request.finishRequest.plugin;
182
183 response.finishResponse.features = 200 response.finishResponse.features =
184 request.finishPlugin->getRemainingFeatures(); 201 request.finishRequest.plugin->getRemainingFeatures();
185 202
186 mapper.removePlugin(h); 203 // We do not delete the plugin here -- we need it in the
187 delete request.finishPlugin; 204 // mapper when converting the features. It gets deleted by the
205 // caller.
206
188 response.success = true; 207 response.success = true;
189 break; 208 break;
190 } 209 }
191 210
192 case RRType::NotValid: 211 case RRType::NotValid:
202 usage(); 221 usage();
203 } 222 }
204 223
205 while (true) { 224 while (true) {
206 225
226 RequestOrResponse request;
227
207 try { 228 try {
208 229
209 RequestOrResponse request = readRequestCapnp(); 230 request = readRequestCapnp();
210 231
211 cerr << "vampipe-server: request received, of type " 232 cerr << "vampipe-server: request received, of type "
212 << int(request.type) 233 << int(request.type)
213 << endl; 234 << endl;
214 235
224 << endl; 245 << endl;
225 246
226 writeResponseCapnp(response); 247 writeResponseCapnp(response);
227 248
228 cerr << "vampipe-server: response written" << endl; 249 cerr << "vampipe-server: response written" << endl;
250
251 if (request.type == RRType::Finish) {
252 auto h = mapper.pluginToHandle(request.finishRequest.plugin);
253 mapper.removePlugin(h);
254 delete request.finishRequest.plugin;
255 }
229 256
230 } catch (std::exception &e) { 257 } catch (std::exception &e) {
258
231 cerr << "vampipe-server: error: " << e.what() << endl; 259 cerr << "vampipe-server: error: " << e.what() << endl;
260
261 writeExceptionCapnp(e, request.type);
262
232 exit(1); 263 exit(1);
233 } 264 }
234 } 265 }
235 266
236 exit(0); 267 exit(0);