From 96612361e6365d8eb731d5f485756b0fb7bcf35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 5 Feb 2021 00:46:13 +0100 Subject: [PATCH] ksys: Add MessageTransceiverRxOnly --- data/uking_functions.csv | 22 +++++------ src/KingSystem/Utils/CMakeLists.txt | 2 + .../Utils/Thread/MessageTransceiverBase.cpp | 4 +- .../Utils/Thread/MessageTransceiverBase.h | 20 +++++++--- .../Utils/Thread/MessageTransceiverRxOnly.cpp | 23 ++++++++++++ .../Utils/Thread/MessageTransceiverRxOnly.h | 37 +++++++++++++++++++ 6 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.cpp create mode 100644 src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 33bde4f2..6b0c5f3f 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -92684,8 +92684,8 @@ 0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC2Ev 0x00000071011f65c8,nullsub_4673,4,_ZN4ksys22MessageTransceiverBaseD1Ev 0x00000071011f65cc,j__ZdlPv_1225,4,_ZN4ksys22MessageTransceiverBaseD0Ev -0x00000071011f65d0,sub_71011F65D0,28,_ZNK4ksys22MessageTransceiverBase17checkReceiverFlagEv -0x00000071011f65ec,sub_71011F65EC,28,_ZNK4ksys22MessageTransceiverBase15isWaitingForAckEv +0x00000071011f65d0,sub_71011F65D0,28,_ZN4ksys22MessageTransceiverBase17checkReceiverFlagEv +0x00000071011f65ec,sub_71011F65EC,28,_ZN4ksys22MessageTransceiverBase15isWaitingForAckEv 0x00000071011f6608,sub_71011F6608,8,_ZN4ksys22MessageTransceiverBase11sendMessageERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb 0x00000071011f6610,sub_71011F6610,8,_ZN4ksys22MessageTransceiverBase29sendMessageOnProcessingThreadERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvb 0x00000071011f6618,sub_71011F6618,8,_ZN4ksys22MessageTransceiverBase11sendMessageERNS_14IMessageBrokerERKNS_11MessageTypeEPvb @@ -92693,15 +92693,15 @@ 0x00000071011f6628,getGlobalMessage,8,_ZN4ksys22MessageTransceiverBase13getDispatcherEv 0x00000071011f6630,GlobalMessage::setGlobalPtr_,16,_ZN4ksys22MessageTransceiverBase19setGlobalDispatcherEPNS_21MessageDispatcherBaseE 0x00000071011f6640,sub_71011F6640,16,_ZNK4ksys22MessageTransceiverBase11getRegisterERNS_14IMessageBrokerE -0x00000071011f6650,j_j_Struct1A::dtor_1,4, -0x00000071011f6654,sub_71011F6654,36, -0x00000071011f6678,sub_71011F6678,16, -0x00000071011f6688,sub_71011F6688,128, -0x00000071011f6708,sub_71011F6708,80, -0x00000071011f6758,sub_71011F6758,88, -0x00000071011f67b0,sub_71011F67B0,8, -0x00000071011f67b8,sub_71011F67B8,204, -0x00000071011f6884,sub_71011F6884,92, +0x00000071011f6650,j_j_Struct1A::dtor_1,4,_ZN4ksys24MessageTransceiverRxOnly8ReceiverD1Ev +0x00000071011f6654,sub_71011F6654,36,_ZN4ksys24MessageTransceiverRxOnly8ReceiverD0Ev +0x00000071011f6678,sub_71011F6678,16,_ZN4ksys24MessageTransceiverRxOnly8Receiver13handleMessageERKNS_7MessageE +0x00000071011f6688,sub_71011F6688,128,_ZN4ksys24MessageTransceiverRxOnlyC1ERNS0_8IHandlerE +0x00000071011f6708,sub_71011F6708,80,_ZN4ksys24MessageTransceiverRxOnlyD1Ev +0x00000071011f6758,sub_71011F6758,88,_ZN4ksys24MessageTransceiverRxOnlyD0Ev +0x00000071011f67b0,sub_71011F67B0,8,_ZN4ksys24MessageTransceiverRxOnly11getReceiverEv +0x00000071011f67b8,sub_71011F67B8,204,_ZNK4ksys24MessageTransceiverRxOnly8Receiver27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011f6884,sub_71011F6884,92,_ZNK4ksys24MessageTransceiverRxOnly8Receiver18getRuntimeTypeInfoEv 0x00000071011f68e0,Thread::ctor,108,_ZN4ksys4util10TaskThreadC1ERKN4sead14SafeStringBaseIcEEPNS2_4HeapEiNS2_12MessageQueue9BlockTypeElii 0x00000071011f694c,Thread::dtor,120,_ZN4ksys4util10TaskThreadD1Ev 0x00000071011f69c4,Thread::dtorDelete,128,_ZN4ksys4util10TaskThreadD0Ev diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index d65210e1..a3d00caa 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -29,6 +29,8 @@ target_sources(uking PRIVATE Thread/MessageTransceiverBase.h Thread/MessageTransceiverId.cpp Thread/MessageTransceiverId.h + Thread/MessageTransceiverRxOnly.cpp + Thread/MessageTransceiverRxOnly.h Thread/Task.cpp Thread/Task.h Thread/TaskData.h diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp index 540c1f80..554bd8d2 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp +++ b/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp @@ -10,11 +10,11 @@ MessageTransceiverBase::MessageTransceiverBase() = default; MessageTransceiverBase::~MessageTransceiverBase() = default; -bool MessageTransceiverBase::checkReceiverFlag() const { +bool MessageTransceiverBase::checkReceiverFlag() { return getReceiver()->checkFlag(); } -bool MessageTransceiverBase::isWaitingForAck() const { +bool MessageTransceiverBase::isWaitingForAck() { return getReceiver()->isWaitingForAck(); } diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverBase.h b/src/KingSystem/Utils/Thread/MessageTransceiverBase.h index 21ff106a..6869bc20 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiverBase.h +++ b/src/KingSystem/Utils/Thread/MessageTransceiverBase.h @@ -1,22 +1,22 @@ #pragma once #include +#include "KingSystem/Utils/Thread/MessageDispatcherBase.h" +#include "KingSystem/Utils/Thread/MessageReceiverEx.h" namespace ksys { class IMessageBroker; class IMessageBrokerRegister; -class MessageDispatcherBase; struct MesTransceiverId; -class MessageReceiverEx; struct MessageType; class MessageTransceiverBase { public: MessageTransceiverBase(); virtual ~MessageTransceiverBase(); - bool checkReceiverFlag() const; - bool isWaitingForAck() const; + bool checkReceiverFlag(); + bool isWaitingForAck(); virtual bool sendMessage(const MesTransceiverId& dest, const MessageType& type, void* user_data, bool ack); virtual bool sendMessageOnProcessingThread(const MesTransceiverId& dest, @@ -25,13 +25,23 @@ public: bool ack); virtual bool sendMessageOnProcessingThread(IMessageBroker& broker, const MessageType& type, void* user_data, bool ack); - virtual MessageReceiverEx* getReceiver() const = 0; + virtual MessageReceiverEx* getReceiver() = 0; MessageDispatcherBase* getDispatcher(); MesTransceiverId* getId() const { return mId; } IMessageBrokerRegister* getRegister(IMessageBroker& broker) const; static void setGlobalDispatcher(MessageDispatcherBase* dispatcher); +protected: + void registerReceiver(MessageReceiverEx& receiver) { + getDispatcher()->registerTransceiver(receiver); + mId = receiver.MessageReceiver::getId(); + } + + void deregisterReceiver(MessageReceiverEx& receiver) { + getDispatcher()->deregisterTransceiver(receiver); + } + private: static MessageDispatcherBase* sDispatcher; diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.cpp new file mode 100644 index 00000000..52e94f4b --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.cpp @@ -0,0 +1,23 @@ +#include "KingSystem/Utils/Thread/MessageTransceiverRxOnly.h" + +namespace ksys { + +MessageTransceiverRxOnly::MessageTransceiverRxOnly(IHandler& handler) : mReceiver(handler) { + registerReceiver(mReceiver); +} + +MessageTransceiverRxOnly::~MessageTransceiverRxOnly() { + deregisterReceiver(mReceiver); +} + +MessageReceiverEx* MessageTransceiverRxOnly::getReceiver() { + return &mReceiver; +} + +MessageTransceiverRxOnly::Receiver::~Receiver() = default; + +int MessageTransceiverRxOnly::Receiver::handleMessage(const Message& message) { + return mHandler.handleMessage(message); +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.h b/src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.h new file mode 100644 index 00000000..83d029aa --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverRxOnly.h @@ -0,0 +1,37 @@ +#pragma once + +#include "KingSystem/Utils/Thread/MessageReceiverEx.h" +#include "KingSystem/Utils/Thread/MessageTransceiverBase.h" + +namespace ksys { + +class Message; + +class MessageTransceiverRxOnly : public MessageTransceiverBase { +public: + class IHandler { + public: + virtual ~IHandler() = default; + virtual int handleMessage(const Message& message) = 0; + }; + + explicit MessageTransceiverRxOnly(IHandler& handler); + ~MessageTransceiverRxOnly() override; + MessageReceiverEx* getReceiver() override; + +private: + class Receiver : public MessageReceiverEx { + SEAD_RTTI_OVERRIDE(Receiver, MessageReceiverEx) + public: + explicit Receiver(IHandler& handler) : mHandler(handler) {} + ~Receiver() override; + int handleMessage(const Message& message) override; + + private: + IHandler& mHandler; + }; + + Receiver mReceiver; +}; + +} // namespace ksys