comparison utilities/vampipe-server.cpp @ 31:b376ab0ce003

Begin server
author Chris Cannam <c.cannam@qmul.ac.uk>
date Tue, 24 May 2016 16:30:01 +0100
parents
children 2d97883d20df
comparison
equal deleted inserted replaced
30:eb679afcd1bb 31:b376ab0ce003
1
2 #include "VampnProto.h"
3
4 #include "bits/RequestOrResponse.h"
5
6 #include <iostream>
7 #include <sstream>
8 #include <stdexcept>
9
10 using namespace std;
11 using namespace vampipe;
12
13 void usage()
14 {
15 string myname = "vampipe-server";
16 cerr << "\n" << myname <<
17 ": Load and run Vamp plugins in response to messages from stdin\n\n"
18 " Usage: " << myname << "\n\n"
19 "Expects Vamp request messages in Cap'n Proto packed format on stdin,\n"
20 "and writes Vamp response messages in the same format to stdout.\n\n";
21
22 exit(2);
23 }
24
25 RequestOrResponse
26 readRequestCapnp()
27 {
28 RequestOrResponse rr;
29 rr.direction = RequestOrResponse::Request;
30
31 ::capnp::PackedFdMessageReader message(0); // stdin
32 VampRequest::Reader reader = message.getRoot<VampRequest>();
33
34 rr.type = VampnProto::getRequestResponseType(reader);
35
36 switch (rr.type) {
37
38 case RRType::List:
39 VampnProto::readVampRequest_List(reader); // type check only
40 break;
41 case RRType::Load:
42 VampnProto::readVampRequest_Load(rr.loadRequest, reader);
43 break;
44 case RRType::Configure:
45 VampnProto::readVampRequest_Configure(rr.configurationRequest, reader,
46 rr.mapper);
47 break;
48 case RRType::Process:
49 VampnProto::readVampRequest_Process(rr.processRequest, reader,
50 rr.mapper);
51 break;
52 case RRType::Finish:
53 VampnProto::readVampRequest_Finish(rr.finishPlugin, reader,
54 rr.mapper);
55 break;
56 case RRType::NotValid:
57 break;
58 }
59
60 return rr;
61 }
62
63 void
64 writeResponseCapnp(RequestOrResponse &rr)
65 {
66 ::capnp::MallocMessageBuilder message;
67 VampResponse::Builder builder = message.initRoot<VampResponse>();
68
69 switch (rr.type) {
70
71 case RRType::List:
72 VampnProto::buildVampResponse_List(builder, "", rr.listResponse);
73 break;
74 case RRType::Load:
75 VampnProto::buildVampResponse_Load(builder, rr.loadResponse, rr.mapper);
76 break;
77 case RRType::Configure:
78 VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse);
79 break;
80 case RRType::Process:
81 VampnProto::buildVampResponse_Process(builder, rr.processResponse);
82 break;
83 case RRType::Finish:
84 VampnProto::buildVampResponse_Finish(builder, rr.finishResponse);
85 break;
86 case RRType::NotValid:
87 break;
88 }
89
90 writePackedMessageToFd(1, message);
91 }
92
93 RequestOrResponse
94 processRequest(const RequestOrResponse &request)
95 {
96 RequestOrResponse response;
97 response.direction = RequestOrResponse::Response;
98 //!!! DO THE WORK!
99 return response;
100 }
101
102 int main(int argc, char **argv)
103 {
104 if (argc != 1) {
105 usage();
106 }
107
108 while (true) {
109
110 try {
111
112 RequestOrResponse request = readRequestCapnp();
113
114 // NotValid without an exception indicates EOF:
115
116 //!!! not yet it doesn't -- have to figure out how to
117 //!!! handle this with capnp
118 if (request.type == RRType::NotValid) break;
119
120 RequestOrResponse response = processRequest(request);
121
122 writeResponseCapnp(response);
123
124 } catch (std::exception &e) {
125 cerr << "Error: " << e.what() << endl;
126 exit(1);
127 }
128 }
129
130 exit(0);
131 }