From e2d211641942f6f551fd68fa0f5d4dacf70be859 Mon Sep 17 00:00:00 2001 From: Adam Dobrowolski Date: Mon, 26 Apr 2021 08:32:36 +0200 Subject: [PATCH] [EGD-6617] Added option to disconnect handler in service Till now we were only able to connect handlers to services, but disconnect was not possible. With nullptr handler system would crash --- module-sys/Service/Service.cpp | 15 ++++++++++++++- module-sys/Service/Service.hpp | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/module-sys/Service/Service.cpp b/module-sys/Service/Service.cpp index 0de4173701173b7037d2cee8464ff0e13f4c0619..ad3e15fcdf15ba8c16f590dd750673238a73f702 100644 --- a/module-sys/Service/Service.cpp +++ b/module-sys/Service/Service.cpp @@ -158,6 +158,9 @@ namespace sys const auto idx = type_index(typeid(*message)); if (const auto handler = message_handlers.find(idx); handler != message_handlers.end()) { const auto &handlerFunction = handler->second; + if (handlerFunction == nullptr) { + return {true, nullptr}; + } return {true, handlerFunction(message)}; } return {false, nullptr}; @@ -168,7 +171,7 @@ namespace sys auto idx = type_index(type); if (message_handlers.find(idx) == message_handlers.end()) { log_debug("Registering new message handler on %s", type.name()); - message_handlers[idx] = handler; + message_handlers[idx] = std::move(handler); return true; } LOG_ERROR("Handler for: %s already registered!", type.name()); @@ -186,6 +189,16 @@ namespace sys return connect(&msg, handler); } + bool Service::disconnect(const std::type_info &type) + { + auto iter = message_handlers.find(type); + if (iter == std::end(message_handlers)) { + return false; + } + message_handlers.erase(iter); + return true; + } + void Service::CloseHandler() { timers.stop(); diff --git a/module-sys/Service/Service.hpp b/module-sys/Service/Service.hpp index 735cdc1481d35219618450d24dbc18bf77741c64..5db4f4c7485a922fa157c913dd233f68664964fc 100644 --- a/module-sys/Service/Service.hpp +++ b/module-sys/Service/Service.hpp @@ -95,6 +95,7 @@ namespace sys bool connect(const std::type_info &type, MessageHandler handler); bool connect(Message *msg, MessageHandler handler); bool connect(Message &&msg, MessageHandler handler); + bool disconnect(const std::type_info &type); void sendCloseReadyMessage(Service *service);