github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/cmd/dummy_neb/dummy_callback.h (about) 1 // Copyright (C) 2018 go-nebulas authors 2 // 3 // This file is part of the go-nebulas library. 4 // 5 // the go-nebulas library is free software: you can redistribute it and/or 6 // modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation, either version 3 of the License, or 9 // (at your option) any later version. 10 // 11 // the go-nebulas library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License 17 // along with the go-nebulas library. If not, see 18 // <http://www.gnu.org/licenses/>. 19 // 20 #pragma once 21 #include "cmd/dummy_neb/dummy_common.h" 22 23 class callback_handler : public neb::util::singleton<callback_handler> { 24 public: 25 callback_handler(); 26 27 template <typename Func> void add_version_handler(uint64_t holder, Func &&f) { 28 std::unique_lock<std::mutex> _l(m_mutex); 29 m_version_handlers.insert(std::make_pair(holder, f)); 30 } 31 void handle_version(void *holder, uint32_t major, uint32_t minor, 32 uint32_t patch); 33 34 template <typename Func> void add_ir_list_handler(uint64_t holder, Func &&f) { 35 std::unique_lock<std::mutex> _l(m_mutex); 36 m_ir_list_handlers.insert(std::make_pair(holder, f)); 37 } 38 void handle_ir_list(void *holder, const char *ir_name_list); 39 40 template <typename Func> 41 void add_ir_versions_handler(uint64_t holder, Func &&f) { 42 std::unique_lock<std::mutex> _l(m_mutex); 43 m_ir_versions_handlers.insert(std::make_pair(holder, f)); 44 } 45 void handle_ir_versions(void *holder, const char *ir_versions); 46 47 template <typename Func> void add_nr_handler(uint64_t holder, Func &&f) { 48 std::unique_lock<std::mutex> _l(m_mutex); 49 m_nr_handlers.insert(std::make_pair(holder, f)); 50 } 51 void handle_nr(void *holder, const char *nr_handler_id); 52 53 template <typename Func> 54 void add_nr_result_handler(uint64_t holder, Func &&f) { 55 std::unique_lock<std::mutex> _l(m_mutex); 56 m_nr_result_handlers.insert(std::make_pair(holder, f)); 57 } 58 void handle_nr_result(void *holder, const char *nr_result); 59 60 template <typename Func> 61 void add_nr_result_by_height_handler(uint64_t holder, Func &&f) { 62 std::unique_lock<std::mutex> _l(m_mutex); 63 m_nr_result_by_height_handlers.insert(std::make_pair(holder, f)); 64 } 65 void handle_nr_result_by_height(void *holder, const char *nr_result); 66 67 template <typename Func> void add_nr_sum_handler(uint64_t holder, Func &&f) { 68 std::unique_lock<std::mutex> _l(m_mutex); 69 m_nr_sum_handlers.insert(std::make_pair(holder, f)); 70 } 71 void handle_nr_sum(void *holder, const char *nr_sum); 72 73 template <typename Func> 74 void add_dip_reward_handler(uint64_t holder, Func &&f) { 75 std::unique_lock<std::mutex> _l(m_mutex); 76 m_dip_reward_handlers.insert(std::make_pair(holder, f)); 77 } 78 void handle_dip_reward(void *holder, const char *dip_reward); 79 80 protected: 81 template <typename Handlers, typename... ARGS> 82 void handle(Handlers &hs, void *holder, ARGS... args) { 83 std::unique_lock<std::mutex> _l(m_mutex); 84 auto h = reinterpret_cast<uint64_t>(holder); 85 auto it = hs.find(h); 86 if (it == hs.end()) { 87 // LOG(INFO) << "can't find handler"; 88 return; 89 } 90 it->second(h, args...); 91 hs.erase(it); 92 } 93 94 protected: 95 std::mutex m_mutex; 96 97 std::unordered_map< 98 uint64_t, std::function<void(uint64_t, uint32_t, uint32_t, uint32_t)>> 99 m_version_handlers; 100 101 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 102 m_ir_list_handlers; 103 104 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 105 m_ir_versions_handlers; 106 107 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 108 m_nr_handlers; 109 110 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 111 m_nr_result_handlers; 112 113 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 114 m_nr_result_by_height_handlers; 115 116 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 117 m_nr_sum_handlers; 118 119 std::unordered_map<uint64_t, std::function<void(uint64_t, const char *)>> 120 m_dip_reward_handlers; 121 }; 122 123 void nbre_version_callback(ipc_status_code isc, void *handler, uint32_t major, 124 uint32_t minor, uint32_t patch); 125 126 void nbre_ir_list_callback(ipc_status_code isc, void *handler, 127 const char *ir_name_list); 128 void nbre_ir_versions_callback(ipc_status_code isc, void *handler, 129 const char *ir_versions); 130 131 void nbre_nr_handle_callback(ipc_status_code isc, void *holder, 132 const char *nr_handle_id); 133 134 void nbre_nr_result_callback(ipc_status_code isc, void *holder, 135 const char *nr_result); 136 137 void nbre_nr_result_by_height_callback(ipc_status_code isc, void *holder, 138 const char *nr_result); 139 140 void nbre_nr_sum_callback(ipc_status_code isc, void *holder, 141 const char *nr_sum); 142 143 void nbre_dip_reward_callback(ipc_status_code isc, void *holder, 144 const char *dip_reward);