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