From 4e4d9e9f85eaf9c3bec48559bd4cad3e8a9333ca Mon Sep 17 00:00:00 2001 From: Russell Yanofsky Date: Mon, 31 Jul 2017 11:46:13 -0400 Subject: Remove use of CRPCTable::appendCommand in wallet code This commit does not change behavior. --- src/interfaces/chain.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'src/interfaces/chain.cpp') diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp index 8ce718cc5..f04d07d49 100644 --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -15,12 +15,15 @@ #include #include #include +#include +#include #include #include #include #include #include #include +#include #include #include #include @@ -212,6 +215,45 @@ public: Chain::Notifications* m_notifications; }; +class RpcHandlerImpl : public Handler +{ +public: + RpcHandlerImpl(const CRPCCommand& command) : m_command(command), m_wrapped_command(&command) + { + m_command.actor = [this](const JSONRPCRequest& request, UniValue& result, bool last_handler) { + if (!m_wrapped_command) return false; + try { + return m_wrapped_command->actor(request, result, last_handler); + } catch (const UniValue& e) { + // If this is not the last handler and a wallet not found + // exception was thrown, return false so the next handler can + // try to handle the request. Otherwise, reraise the exception. + if (!last_handler) { + const UniValue& code = e["code"]; + if (code.isNum() && code.get_int() == RPC_WALLET_NOT_FOUND) { + return false; + } + } + throw; + } + }; + ::tableRPC.appendCommand(m_command.name, &m_command); + } + + void disconnect() override final + { + if (m_wrapped_command) { + m_wrapped_command = nullptr; + ::tableRPC.removeCommand(m_command.name, &m_command); + } + } + + ~RpcHandlerImpl() override { disconnect(); } + + CRPCCommand m_command; + const CRPCCommand* m_wrapped_command; +}; + class ChainImpl : public Chain { public: @@ -310,8 +352,11 @@ public: return MakeUnique(*this, notifications); } void waitForNotifications() override { SyncWithValidationInterfaceQueue(); } + std::unique_ptr handleRpc(const CRPCCommand& command) override + { + return MakeUnique(command); + } }; - } // namespace std::unique_ptr MakeChain() { return MakeUnique(); } -- cgit v1.2.3