diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 9c9e505b..1deb01fd 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -283,6 +283,7 @@ add_files( utility/messaging/Message.h utility/messaging/MessageBase.h utility/messaging/MessageListener.h + utility/messaging/MessageListenerBase.cpp utility/messaging/MessageListenerBase.h utility/messaging/MessageQueue.cpp utility/messaging/MessageQueue.h diff --git a/src/lib/utility/messaging/MessageListenerBase.cpp b/src/lib/utility/messaging/MessageListenerBase.cpp new file mode 100644 index 00000000..3c748386 --- /dev/null +++ b/src/lib/utility/messaging/MessageListenerBase.cpp @@ -0,0 +1,3 @@ +#include "utility/messaging/MessageListenerBase.h" + +uint MessageListenerBase::s_nextId = 0; diff --git a/src/lib/utility/messaging/MessageListenerBase.h b/src/lib/utility/messaging/MessageListenerBase.h index b7535682..0e0b727d 100644 --- a/src/lib/utility/messaging/MessageListenerBase.h +++ b/src/lib/utility/messaging/MessageListenerBase.h @@ -5,11 +5,13 @@ #include "utility/messaging/MessageBase.h" #include "utility/messaging/MessageQueue.h" +#include "utility/types.h" class MessageListenerBase { public: MessageListenerBase() + : m_id(s_nextId++) { MessageQueue::getInstance()->registerListener(this); } @@ -19,9 +21,19 @@ public: MessageQueue::getInstance()->unregisterListener(this); } + uint getId() const + { + return m_id; + } + virtual std::string getType() const = 0; virtual void handleMessageBase(MessageBase*) = 0; + +private: + static uint s_nextId; + + uint m_id; }; #endif // MESSAGE_LISTENER_BASE_H diff --git a/src/lib/utility/messaging/MessageQueue.cpp b/src/lib/utility/messaging/MessageQueue.cpp index 913c02d2..9b6c6baf 100644 --- a/src/lib/utility/messaging/MessageQueue.cpp +++ b/src/lib/utility/messaging/MessageQueue.cpp @@ -53,6 +53,19 @@ void MessageQueue::unregisterListener(MessageListenerBase* listener) LOG_ERROR("Listener was not found"); } +MessageListenerBase* MessageQueue::getListenerById(const uint id) const +{ + std::lock_guard lock(m_listenersMutex); + for (size_t i = 0; i < m_listeners.size(); i++) + { + if (m_listeners[i]->getId() == id) + { + return m_listeners[i]; + } + } + return nullptr; +} + void MessageQueue::pushMessage(std::shared_ptr message) { std::lock_guard lock(m_backMessageBufferMutex); @@ -240,10 +253,15 @@ void MessageQueue::sendMessageAsTask(std::shared_ptr message, bool if (listener->getType() == message->getType()) { + uint listenerId = listener->getId(); taskGroup->addTask(std::make_shared( - [listener, message]() + [listenerId, message]() { - listener->handleMessageBase(message.get()); + MessageListenerBase* listener = MessageQueue::getInstance()->getListenerById(listenerId); + if (listener) + { + listener->handleMessageBase(message.get()); + } } )); } diff --git a/src/lib/utility/messaging/MessageQueue.h b/src/lib/utility/messaging/MessageQueue.h index f66e428c..2d8655b4 100644 --- a/src/lib/utility/messaging/MessageQueue.h +++ b/src/lib/utility/messaging/MessageQueue.h @@ -5,6 +5,8 @@ #include #include +#include "utility/types.h" + class MessageBase; class MessageListenerBase; @@ -16,6 +18,8 @@ public: void registerListener(MessageListenerBase* listener); void unregisterListener(MessageListenerBase* listener); + MessageListenerBase* getListenerById(const uint id) const; + void pushMessage(std::shared_ptr message); void processMessage(std::shared_ptr message, bool asNextTask);