From 62eecde248bf0fde592becc3686d62b8ab9f27dd Mon Sep 17 00:00:00 2001 From: Neels99 Date: Sat, 17 Feb 2024 23:33:09 +0300 Subject: [PATCH] [feature] Update libp2p Handler --- libp2p/handler.h | 51 ++++++++++++++++++++--------------------------- libp2p/protocol.h | 10 ++++++---- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/libp2p/handler.h b/libp2p/handler.h index 890084de..e4586f31 100644 --- a/libp2p/handler.h +++ b/libp2p/handler.h @@ -9,77 +9,77 @@ #include "message.h" #include +// От этого класса должен наследоваться любой класс, который собирается принимать сообщения. +class NetworkHandler +{ +}; + template using handler_type = std::function, ProtocolType*)>; -template class Handler { public: - virtual void invoke(PackStream &stream, ProtocolType* _protocol) = 0; + virtual void invoke(PackStream &stream, NetworkHandler* protocol_) = 0; }; template -class MessageHandler : public Handler +class MessageHandler : public Handler { protected: - handler_type handlerF; + handler_type handler; std::shared_ptr generate_message(PackStream &stream) { - std::shared_ptr msg = std::make_shared(); - LOG_DEBUG_P2P << "\tMessage data: " << stream; - + + std::shared_ptr msg = std::make_shared(); stream >> *msg; return msg; } public: - MessageHandler(handler_type _handlerF) : handlerF(_handlerF) {} + MessageHandler(handler_type handler_) : handler(handler_) {} - void invoke(PackStream &stream, ProtocolType* _protocol) override + void invoke(PackStream &stream, NetworkHandler* protocol_) override { auto msg = generate_message(stream); -// auto protocol = std::static_pointer_cast(_protocol); - handlerF(msg, _protocol); + handler(msg, static_cast(protocol_)); } }; -template -using HandlerPtr = std::shared_ptr>; +using HandlerPtr = std::shared_ptr; template -HandlerPtr make_handler(handler_type handlerF) +HandlerPtr make_handler(handler_type handler_) { - HandlerPtr handler = std::make_shared>(std::move(handlerF)); + HandlerPtr handler = std::make_shared>(std::move(handler_)); return handler; } -template class HandlerManager { private: - std::map> handlers; + std::map handlers; public: HandlerManager() = default; HandlerManager(const HandlerManager& manager) = delete; - template - void new_handler(std::string command, handler_type handlerF) + template + void new_handler(std::string command, handler_type handler_) { if (!handlers.count(command)) { - handlers[command] = make_handler(handlerF); + handlers[command] = make_handler(handler_); } else { // TODO: handler for this command already exist in map } } - HandlerPtr operator[](std::string command) + HandlerPtr get_handler(std::string command) { if (handlers.count(command)) { @@ -90,13 +90,6 @@ class HandlerManager return nullptr; } } - - // operator[] for pointers - HandlerPtr get_handler(std::string command) - { - return (*this)[command]; - } }; -template -using HandlerManagerPtr = std::shared_ptr>; \ No newline at end of file +using HandlerManagerPtr = std::shared_ptr; \ No newline at end of file diff --git a/libp2p/protocol.h b/libp2p/protocol.h index 5fd7d481..efba26b1 100644 --- a/libp2p/protocol.h +++ b/libp2p/protocol.h @@ -12,19 +12,21 @@ #include "protocol_events.h" #include "handler.h" -template -class BaseProtocol : public ProtocolEvents, public COMPONENTS... +template +class BaseProtocol : public NetworkHandler, public ProtocolEvents, public COMPONENTS... { protected: typedef SocketType socket_type; - HandlerManagerPtr handler_manager; + + HandlerManagerPtr handler_manager; SocketType* socket; public: virtual void write(std::shared_ptr msg) = 0; public: - explicit BaseProtocol (socket_type* socket_, HandlerManagerPtr handler_manager_) + template + explicit BaseProtocol (socket_type* socket_, HandlerManagerPtr handler_manager_, Args... args) : socket(socket_), handler_manager(handler_manager_), COMPONENTS(this, std::forward(args))... { socket->set_message_handler