// Copyright (c) 2011-2016 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once #include #include "Common/JsonValue.h" #include "JsonRpcServer/JsonRpcServer.h" #include "PaymentServiceJsonRpcMessages.h" #include "Serialization/JsonInputValueSerializer.h" #include "Serialization/JsonOutputStreamSerializer.h" namespace PaymentService { class WalletService; class PaymentServiceJsonRpcServer : public CryptoNote::JsonRpcServer { public: PaymentServiceJsonRpcServer(System::Dispatcher& sys, System::Event& stopEvent, WalletService& service, Logging::ILogger& loggerGroup); PaymentServiceJsonRpcServer(const PaymentServiceJsonRpcServer&) = delete; protected: virtual void processJsonRpcRequest(const Common::JsonValue& req, Common::JsonValue& resp) override; private: WalletService& service; Logging::LoggerRef logger; typedef std::function HandlerFunction; template HandlerFunction jsonHandler(RequestHandler handler) { return [handler] (const Common::JsonValue& jsonRpcParams, Common::JsonValue& jsonResponse) mutable { RequestType request; ResponseType response; try { CryptoNote::JsonInputValueSerializer inputSerializer(const_cast(jsonRpcParams)); serialize(request, inputSerializer); } catch (std::exception&) { makeGenericErrorReponse(jsonResponse, "Invalid Request", -32600); return; } std::error_code ec = handler(request, response); if (ec) { makeErrorResponse(ec, jsonResponse); return; } CryptoNote::JsonOutputStreamSerializer outputSerializer; serialize(response, outputSerializer); fillJsonResponse(outputSerializer.getValue(), jsonResponse); }; } std::unordered_map handlers; std::error_code handleReset(const Reset::Request& request, Reset::Response& response); std::error_code handleCreateAddress(const CreateAddress::Request& request, CreateAddress::Response& response); std::error_code handleDeleteAddress(const DeleteAddress::Request& request, DeleteAddress::Response& response); std::error_code handleGetSpendKeys(const GetSpendKeys::Request& request, GetSpendKeys::Response& response); std::error_code handleGetBalance(const GetBalance::Request& request, GetBalance::Response& response); std::error_code handleGetBlockHashes(const GetBlockHashes::Request& request, GetBlockHashes::Response& response); std::error_code handleGetTransactionHashes(const GetTransactionHashes::Request& request, GetTransactionHashes::Response& response); std::error_code handleGetTransactions(const GetTransactions::Request& request, GetTransactions::Response& response); std::error_code handleGetUnconfirmedTransactionHashes(const GetUnconfirmedTransactionHashes::Request& request, GetUnconfirmedTransactionHashes::Response& response); std::error_code handleGetTransaction(const GetTransaction::Request& request, GetTransaction::Response& response); std::error_code handleSendTransaction(const SendTransaction::Request& request, SendTransaction::Response& response); std::error_code handleCreateDelayedTransaction(const CreateDelayedTransaction::Request& request, CreateDelayedTransaction::Response& response); std::error_code handleGetDelayedTransactionHashes(const GetDelayedTransactionHashes::Request& request, GetDelayedTransactionHashes::Response& response); std::error_code handleDeleteDelayedTransaction(const DeleteDelayedTransaction::Request& request, DeleteDelayedTransaction::Response& response); std::error_code handleSendDelayedTransaction(const SendDelayedTransaction::Request& request, SendDelayedTransaction::Response& response); std::error_code handleGetViewKey(const GetViewKey::Request& request, GetViewKey::Response& response); std::error_code handleGetStatus(const GetStatus::Request& request, GetStatus::Response& response); std::error_code handleGetAddresses(const GetAddresses::Request& request, GetAddresses::Response& response); }; }//namespace PaymentService