comparison utilities/vampipe-server.cpp @ 32:2d97883d20df

Wire up a couple of server actions
author Chris Cannam <c.cannam@qmul.ac.uk>
date Tue, 24 May 2016 17:17:03 +0100
parents b376ab0ce003
children 0b48b10140bb
comparison
equal deleted inserted replaced
31:b376ab0ce003 32:2d97883d20df
5 5
6 #include <iostream> 6 #include <iostream>
7 #include <sstream> 7 #include <sstream>
8 #include <stdexcept> 8 #include <stdexcept>
9 9
10 #include <map>
11 #include <set>
12
10 using namespace std; 13 using namespace std;
11 using namespace vampipe; 14 using namespace vampipe;
15 using namespace Vamp;
16 using namespace Vamp::HostExt;
12 17
13 void usage() 18 void usage()
14 { 19 {
15 string myname = "vampipe-server"; 20 string myname = "vampipe-server";
16 cerr << "\n" << myname << 21 cerr << "\n" << myname <<
20 "and writes Vamp response messages in the same format to stdout.\n\n"; 25 "and writes Vamp response messages in the same format to stdout.\n\n";
21 26
22 exit(2); 27 exit(2);
23 } 28 }
24 29
30 class Mapper : public PluginHandleMapper
31 {
32 public:
33 Mapper() : m_nextHandle(1) { }
34
35 void addPlugin(Plugin *p) {
36 if (m_rplugins.find(p) == m_rplugins.end()) {
37 int32_t h = m_nextHandle++;
38 m_plugins[h] = p;
39 m_rplugins[p] = h;
40 }
41 }
42
43 int32_t pluginToHandle(Plugin *p) {
44 if (m_rplugins.find(p) == m_rplugins.end()) {
45 throw NotFound();
46 }
47 return m_rplugins[p];
48 }
49
50 Plugin *handleToPlugin(int32_t h) {
51 if (m_plugins.find(h) == m_plugins.end()) {
52 throw NotFound();
53 }
54 return m_plugins[h];
55 }
56
57 bool isInitialised(int32_t h) {
58 return m_initialisedPlugins.find(h) != m_initialisedPlugins.end();
59 }
60
61 void markInitialised(int32_t h) {
62 m_initialisedPlugins.insert(h);
63 }
64
65 private:
66 int32_t m_nextHandle; // NB plugin handle type must fit in JSON number
67 map<uint32_t, Plugin *> m_plugins;
68 map<Plugin *, uint32_t> m_rplugins;
69 set<uint32_t> m_initialisedPlugins;
70 };
71
72 static Mapper mapper;
73
25 RequestOrResponse 74 RequestOrResponse
26 readRequestCapnp() 75 readRequestCapnp()
27 { 76 {
28 RequestOrResponse rr; 77 RequestOrResponse rr;
29 rr.direction = RequestOrResponse::Request; 78 rr.direction = RequestOrResponse::Request;
40 break; 89 break;
41 case RRType::Load: 90 case RRType::Load:
42 VampnProto::readVampRequest_Load(rr.loadRequest, reader); 91 VampnProto::readVampRequest_Load(rr.loadRequest, reader);
43 break; 92 break;
44 case RRType::Configure: 93 case RRType::Configure:
45 VampnProto::readVampRequest_Configure(rr.configurationRequest, reader, 94 VampnProto::readVampRequest_Configure(rr.configurationRequest,
46 rr.mapper); 95 reader, mapper);
47 break; 96 break;
48 case RRType::Process: 97 case RRType::Process:
49 VampnProto::readVampRequest_Process(rr.processRequest, reader, 98 VampnProto::readVampRequest_Process(rr.processRequest, reader, mapper);
50 rr.mapper);
51 break; 99 break;
52 case RRType::Finish: 100 case RRType::Finish:
53 VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, 101 VampnProto::readVampRequest_Finish(rr.finishPlugin, reader, mapper);
54 rr.mapper);
55 break; 102 break;
56 case RRType::NotValid: 103 case RRType::NotValid:
57 break; 104 break;
58 } 105 }
59 106
70 117
71 case RRType::List: 118 case RRType::List:
72 VampnProto::buildVampResponse_List(builder, "", rr.listResponse); 119 VampnProto::buildVampResponse_List(builder, "", rr.listResponse);
73 break; 120 break;
74 case RRType::Load: 121 case RRType::Load:
75 VampnProto::buildVampResponse_Load(builder, rr.loadResponse, rr.mapper); 122 VampnProto::buildVampResponse_Load(builder, rr.loadResponse, mapper);
76 break; 123 break;
77 case RRType::Configure: 124 case RRType::Configure:
78 VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse); 125 VampnProto::buildVampResponse_Configure(builder, rr.configurationResponse);
79 break; 126 break;
80 case RRType::Process: 127 case RRType::Process:
93 RequestOrResponse 140 RequestOrResponse
94 processRequest(const RequestOrResponse &request) 141 processRequest(const RequestOrResponse &request)
95 { 142 {
96 RequestOrResponse response; 143 RequestOrResponse response;
97 response.direction = RequestOrResponse::Response; 144 response.direction = RequestOrResponse::Response;
98 //!!! DO THE WORK! 145 response.type = request.type;
146
147 auto loader = PluginLoader::getInstance();
148
149 switch (request.type) {
150
151 case RRType::List:
152 response.listResponse = loader->listPluginData();
153 response.success = true;
154 break;
155
156 case RRType::Load:
157 response.loadResponse = loader->loadPlugin(request.loadRequest);
158 if (response.loadResponse.plugin != nullptr) {
159 mapper.addPlugin(response.loadResponse.plugin);
160 response.success = true;
161 }
162 break;
163
164 default:
165 //!!!
166 ;
167 }
168
99 return response; 169 return response;
100 } 170 }
101 171
102 int main(int argc, char **argv) 172 int main(int argc, char **argv)
103 { 173 {