From 2c342d984f2ed9efdb9729b5e655f33663e22e23 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 6 Dec 2012 18:59:45 -0800 Subject: [PATCH] Fixes. Template code must go in header files. --- src/cpp/ripple/WSConnection.h | 82 ++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/WSConnection.h b/src/cpp/ripple/WSConnection.h index d90ddab4f9..cd5b17a631 100644 --- a/src/cpp/ripple/WSConnection.h +++ b/src/cpp/ripple/WSConnection.h @@ -1,10 +1,14 @@ + #include "../websocketpp/src/sockets/tls.hpp" #include "../websocketpp/src/websocketpp.hpp" + +#include "../json/value.h" + #include "WSDoor.h" #include "Application.h" - #include "Log.h" #include "NetworkOPs.h" +#include "CallRPC.h" template class WSServerHandler; @@ -22,7 +26,7 @@ public: protected: typedef void (WSConnection::*doFuncPtr)(Json::Value& jvResult, Json::Value &jvRequest); - WSServerHandler* mHandler; + WSServerHandler* mHandler; connection_ptr mConnection; NetworkOPs& mNetwork; @@ -46,12 +50,78 @@ public: } // Implement overridden functions from base class: - template - void send(const Json::Value& jvObj); + void send(const Json::Value& jvObj) + { + mHandler->send(mConnection, jvObj); + } // Utilities - template - Json::Value invokeCommand(Json::Value& jvRequest); + Json::Value invokeCommand(Json::Value& jvRequest) + { + if (!jvRequest.isMember("command")) + { + Json::Value jvResult(Json::objectValue); + + jvResult["type"] = "response"; + jvResult["result"] = "error"; + jvResult["error"] = "missingCommand"; + jvResult["command"] = jvRequest; + + return jvResult; + } + + RPCHandler mRPCHandler(&mNetwork, this); + Json::Value jvResult(Json::objectValue); + + // XXX Temporarily support RPC style commands over websocket. Remove this. + if (jvRequest.isMember("params")) + { + RPCParser rpParser; + + Json::Value jvRpcRequest = rpParser.parseCommand(jvRequest["command"].asString(), jvRequest["params"]); + + if (jvRpcRequest.isMember("error")) + { + jvResult = jvRpcRequest; + } + else + { + jvResult["result"] = mRPCHandler.doCommand( + jvRpcRequest, + mHandler->getPublic() ? RPCHandler::GUEST : RPCHandler::ADMIN); + } + } + else + { + jvResult["result"] = mRPCHandler.doCommand( + jvRequest, + mHandler->getPublic() ? RPCHandler::GUEST : RPCHandler::ADMIN); + } + + // Currently we will simply unwrap errors returned by the RPC + // API, in the future maybe we can make the responses + // consistent. + // + // Regularize result. This is duplicate code. + if (jvResult["result"].isMember("error")) + { + jvResult = jvResult["result"]; + jvResult["status"] = "error"; + jvResult["request"] = jvRequest; + + } else { + jvResult["status"] = "success"; + } + + if (jvRequest.isMember("id")) + { + jvResult["id"] = jvRequest["id"]; + } + + jvResult["type"] = "response"; + + return jvResult; + } };