diff options
Diffstat (limited to 'source/core/StarJsonRpc.hpp')
-rw-r--r-- | source/core/StarJsonRpc.hpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/core/StarJsonRpc.hpp b/source/core/StarJsonRpc.hpp new file mode 100644 index 0000000..651e717 --- /dev/null +++ b/source/core/StarJsonRpc.hpp @@ -0,0 +1,54 @@ +#ifndef STAR_JSON_RPC_HPP +#define STAR_JSON_RPC_HPP + +#include "StarJson.hpp" +#include "StarByteArray.hpp" +#include "StarRpcPromise.hpp" + +namespace Star { + +STAR_CLASS(JsonRpcInterface); +STAR_CLASS(JsonRpc); + +STAR_EXCEPTION(JsonRpcException, StarException); + +typedef function<Json(Json const&)> JsonRpcRemoteFunction; + +typedef StringMap<JsonRpcRemoteFunction> JsonRpcHandlers; + +// Simple interface to just the method invocation part of JsonRpc. +class JsonRpcInterface { +public: + virtual ~JsonRpcInterface(); + virtual RpcPromise<Json> invokeRemote(String const& handler, Json const& arguments) = 0; +}; + +// Simple class to handle remote methods based on Json types. Does not +// handle any of the network details, simply turns rpc calls into ByteArray +// messages to be sent and received. +class JsonRpc : public JsonRpcInterface { +public: + JsonRpc(); + + void registerHandler(String const& handler, JsonRpcRemoteFunction func); + void registerHandlers(JsonRpcHandlers const& handlers); + + void removeHandler(String const& handler); + void clearHandlers(); + + RpcPromise<Json> invokeRemote(String const& handler, Json const& arguments) override; + + bool sendPending() const; + ByteArray send(); + void receive(ByteArray const& inbuffer); + +private: + JsonRpcHandlers m_handlers; + Map<uint64_t, RpcPromiseKeeper<Json>> m_pendingResponse; + List<Json> m_pending; + uint64_t m_requestId; +}; + +} + +#endif |