diff utilities/vampipe-convert.cpp @ 73:7bfc07576830

Ensure id is passed through properly in convert and in server
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 10 Oct 2016 15:03:47 +0100
parents a5ba837bca28
children
line wrap: on
line diff
--- a/utilities/vampipe-convert.cpp	Fri Oct 07 16:43:18 2016 +0100
+++ b/utilities/vampipe-convert.cpp	Mon Oct 10 15:03:47 2016 +0100
@@ -79,6 +79,72 @@
 
 PreservingPluginHandleMapper mapper;
 
+static RequestOrResponse::RpcId
+readJsonId(const Json &j)
+{
+    RequestOrResponse::RpcId id;
+
+    if (j["id"].is_number()) {
+        id.type = RequestOrResponse::RpcId::Number;
+        id.number = j["id"].number_value();
+    } else if (j["id"].is_string()) {
+        id.type = RequestOrResponse::RpcId::Tag;
+        id.tag = j["id"].string_value();
+    } else {
+        id.type = RequestOrResponse::RpcId::Absent;
+    }
+
+    return id;
+}
+
+static Json
+writeJsonId(const RequestOrResponse::RpcId &id)
+{
+    if (id.type == RequestOrResponse::RpcId::Number) {
+        return id.number;
+    } else if (id.type == RequestOrResponse::RpcId::Tag) {
+        return id.tag;
+    } else {
+        return Json();
+    }
+}
+
+template <typename Reader>
+static RequestOrResponse::RpcId
+readCapnpId(const Reader &r)
+{
+    int number;
+    string tag;
+    switch (r.getId().which()) {
+    case RpcRequest::Id::Which::NUMBER:
+        number = r.getId().getNumber();
+        return { RequestOrResponse::RpcId::Number, number, "" };
+    case RpcRequest::Id::Which::TAG:
+        tag = r.getId().getTag();
+        return { RequestOrResponse::RpcId::Tag, 0, tag };
+    case RpcRequest::Id::Which::NONE:
+        return { RequestOrResponse::RpcId::Absent, 0, "" };
+    }
+    return {};
+}
+
+template <typename Builder>
+static void
+buildCapnpId(Builder &b, const RequestOrResponse::RpcId &id)
+{
+    switch (id.type) {
+    case RequestOrResponse::RpcId::Number:
+        b.getId().setNumber(id.number);
+        break;
+    case RequestOrResponse::RpcId::Tag:
+        b.getId().setTag(id.tag);
+        break;
+    case RequestOrResponse::RpcId::Absent:
+        b.getId().setNone();
+        break;
+    }
+}
+
 RequestOrResponse
 readRequestJson(string &err)
 {
@@ -97,7 +163,9 @@
 
     rr.type = VampJson::getRequestResponseType(j, err);
     if (err != "") return {};
-    
+
+    rr.id = readJsonId(j);
+
     VampJson::BufferSerialisation serialisation =
         VampJson::BufferSerialisation::Array;
 
@@ -135,23 +203,25 @@
          VampJson::BufferSerialisation::Base64 :
          VampJson::BufferSerialisation::Array);
 
+    Json id = writeJsonId(rr.id);
+    
     switch (rr.type) {
 
     case RRType::List:
-	j = VampJson::fromRpcRequest_List();
+	j = VampJson::fromRpcRequest_List(id);
 	break;
     case RRType::Load:
-	j = VampJson::fromRpcRequest_Load(rr.loadRequest);
+	j = VampJson::fromRpcRequest_Load(rr.loadRequest, id);
 	break;
     case RRType::Configure:
-	j = VampJson::fromRpcRequest_Configure(rr.configurationRequest, mapper);
+	j = VampJson::fromRpcRequest_Configure(rr.configurationRequest, mapper, id);
 	break;
     case RRType::Process:
 	j = VampJson::fromRpcRequest_Process
-	    (rr.processRequest, mapper, serialisation);
+	    (rr.processRequest, mapper, serialisation, id);
 	break;
     case RRType::Finish:
-	j = VampJson::fromRpcRequest_Finish(rr.finishRequest, mapper);
+	j = VampJson::fromRpcRequest_Finish(rr.finishRequest, mapper, id);
 	break;
     case RRType::NotValid:
 	break;
@@ -178,6 +248,8 @@
 
     rr.type = VampJson::getRequestResponseType(j, err);
     if (err != "") return {};
+
+    rr.id = readJsonId(j);
     
     VampJson::BufferSerialisation serialisation =
         VampJson::BufferSerialisation::Array;
@@ -219,31 +291,33 @@
          VampJson::BufferSerialisation::Base64 :
          VampJson::BufferSerialisation::Array);
 
+    Json id = writeJsonId(rr.id);
+
     if (!rr.success) {
 
-	j = VampJson::fromError(rr.errorText, rr.type);
+	j = VampJson::fromError(rr.errorText, rr.type, id);
 
     } else {
     
 	switch (rr.type) {
 
 	case RRType::List:
-	    j = VampJson::fromRpcResponse_List(rr.listResponse);
+	    j = VampJson::fromRpcResponse_List(rr.listResponse, id);
 	    break;
 	case RRType::Load:
-	    j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper);
+	    j = VampJson::fromRpcResponse_Load(rr.loadResponse, mapper, id);
 	    break;
 	case RRType::Configure:
 	    j = VampJson::fromRpcResponse_Configure(rr.configurationResponse,
-                                                     mapper);
+                                                    mapper, id);
 	    break;
 	case RRType::Process:
 	    j = VampJson::fromRpcResponse_Process
-		(rr.processResponse, mapper, serialisation);
+		(rr.processResponse, mapper, serialisation, id);
 	    break;
 	case RRType::Finish:
 	    j = VampJson::fromRpcResponse_Finish
-		(rr.finishResponse, mapper, serialisation);
+		(rr.finishResponse, mapper, serialisation, id);
 	    break;
 	case RRType::NotValid:
 	    break;
@@ -263,6 +337,7 @@
     RpcRequest::Reader reader = message.getRoot<RpcRequest>();
     
     rr.type = VampnProto::getRequestResponseType(reader);
+    rr.id = readCapnpId(reader);
 
     switch (rr.type) {
 
@@ -295,6 +370,8 @@
     ::capnp::MallocMessageBuilder message;
     RpcRequest::Builder builder = message.initRoot<RpcRequest>();
 
+    buildCapnpId(builder, rr.id);
+    
     switch (rr.type) {
 
     case RRType::List:
@@ -332,6 +409,7 @@
     rr.type = VampnProto::getRequestResponseType(reader);
     rr.success = true;
     rr.errorText = "";
+    rr.id = readCapnpId(reader);
     int errorCode = 0;
 
     switch (rr.type) {
@@ -368,6 +446,8 @@
     ::capnp::MallocMessageBuilder message;
     RpcResponse::Builder builder = message.initRoot<RpcResponse>();
 
+    buildCapnpId(builder, rr.id);
+
     if (!rr.success) {
 
 	VampnProto::buildRpcResponse_Error(builder, rr.errorText, rr.type);