annotate 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
rev   line source
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 }