Mercurial > hg > piper-cpp
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 } |