From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/BaseClasses/MessageHandler.cpp | 196 +++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 Runtime/BaseClasses/MessageHandler.cpp (limited to 'Runtime/BaseClasses/MessageHandler.cpp') diff --git a/Runtime/BaseClasses/MessageHandler.cpp b/Runtime/BaseClasses/MessageHandler.cpp new file mode 100644 index 0000000..71ef06e --- /dev/null +++ b/Runtime/BaseClasses/MessageHandler.cpp @@ -0,0 +1,196 @@ +#include "UnityPrefix.h" +#include "MessageHandler.h" +#include "Runtime/Utilities/LogAssert.h" +#include +#include + +using namespace std; + +MessageForwarder::MessageForwarder () +{ + m_GeneralMessage = NULL; + m_CanHandleGeneralMessage = NULL; +} + +void MessageForwarder::HandleMessage (void* receiver, int messageID, MessageData& messageData) +{ + MessageCallback messagePtr = m_GeneralMessage; + if (messageID < m_SupportedMessages.size () && m_SupportedMessages[messageID] != NULL) + messagePtr = m_SupportedMessages[messageID]; + + AssertIf (messagePtr == NULL); + messagePtr (receiver, messageID, messageData); +} + +bool MessageForwarder::HasMessageCallback (const MessageIdentifier& identifier) +{ + if (identifier.messageID < m_SupportedMessages.size () && m_SupportedMessages[identifier.messageID]) + return true; + else + return m_GeneralMessage != NULL && (identifier.options & MessageIdentifier::kSendToScripts); +} + +bool MessageForwarder::WillHandleMessage (void* receiver, const MessageIdentifier& identifier) +{ + if (identifier.messageID < m_SupportedMessages.size () && m_SupportedMessages[identifier.messageID]) + return true; + + if (m_GeneralMessage && (identifier.options & MessageIdentifier::kSendToScripts)) + { + AssertIf (m_CanHandleGeneralMessage == NULL); + MessageData data; + return m_CanHandleGeneralMessage (receiver, identifier.messageID, data); + } + return false; +} + +int MessageForwarder::GetExpectedParameter (int messageID) +{ + if (messageID < m_SupportedMessages.size ()) + return m_SupportedMessagesParameter[messageID]; + else + return 0; +} + +void MessageForwarder::RegisterMessageCallback (int messageID, MessageCallback message, int classId) +{ + AssertIf (messageID == -1); + if (messageID >= m_SupportedMessages.size ()) + { + m_SupportedMessages.resize (messageID + 1, NULL); + m_SupportedMessagesParameter.resize (messageID + 1, 0); + } + m_SupportedMessages[messageID] = message; + m_SupportedMessagesParameter[messageID] = classId; +} + +void MessageForwarder::RegisterAllMessagesCallback (MessageCallback message, CanHandleMessageCallback canHandle) +{ + m_GeneralMessage = message; + m_CanHandleGeneralMessage = canHandle; +} + +void MessageForwarder::AddBaseMessages (const MessageForwarder& baseClass) +{ + int maxsize = max (m_SupportedMessages.size (), baseClass.m_SupportedMessages.size ()); + m_SupportedMessages.resize (maxsize, NULL); + m_SupportedMessagesParameter.resize (maxsize, 0); + for (int i=0;ifirst] = index; + m_MessageIDToIdentifier[index] = i->second; + m_MessageIDToIdentifier[index].messageID = index; + index++; + } + + + // Setup the messageIDs of all registered message Identifiers + MessageIdentifier::RegisteredMessages::iterator j; + for (j = identifiers.begin ();j != identifiers.end ();j++) + { + AssertIf (*j == NULL); + MessageIdentifier& identifier = **j; + if (m_MessageNameToIndex.count (identifier.messageName)) + { + identifier.messageID = m_MessageNameToIndex[identifier.messageName]; + } + } +} + +void MessageHandler::Initialize (const MessageForwarders& receivers) +{ + m_Forwarder = receivers; + m_MessageCount = m_MessageNameToIndex.size (); + m_ClassCount = receivers.size (); + + // Precalculate supported messages + m_SupportedMessages.resize (m_ClassCount * m_MessageCount); + for (int c=0;csecond; +} + +const char* MessageHandler::MessageIDToName (int messageID) +{ + AssertIf (messageID < 0); + AssertIf (messageID >= m_MessageIDToIdentifier.size ()); + return m_MessageIDToIdentifier[messageID].messageName; +} + +int MessageHandler::MessageIDToParameter (int messageID) +{ + AssertIf (messageID < 0); + AssertIf (messageID >= m_MessageIDToIdentifier.size ()); + return m_MessageIDToIdentifier[messageID].parameterClassId; +} + +MessageIdentifier MessageHandler::MessageIDToMessageIdentifier (int messageID) +{ + AssertIf (messageID < 0); + AssertIf (messageID >= m_MessageIDToIdentifier.size ()); + return m_MessageIDToIdentifier[messageID]; +} -- cgit v1.1-26-g67d0