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);