BsMessageHandler.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "BsMessageHandler.h"
  2. namespace BansheeEngine
  3. {
  4. Map<String, UINT32> MessageId::UniqueMessageIds;
  5. UINT32 MessageId::NextMessageId = 0;
  6. MessageId::MessageId()
  7. : mMsgIdentifier(0)
  8. { }
  9. MessageId::MessageId(const String& name)
  10. {
  11. auto findIter = UniqueMessageIds.find(name);
  12. if (findIter != UniqueMessageIds.end())
  13. mMsgIdentifier = findIter->second;
  14. else
  15. {
  16. mMsgIdentifier = NextMessageId;
  17. UniqueMessageIds[name] = NextMessageId++;
  18. }
  19. }
  20. HMessage::HMessage()
  21. :mId(0)
  22. { }
  23. HMessage::HMessage(UINT32 id)
  24. :mId(id)
  25. { }
  26. void HMessage::disconnect()
  27. {
  28. if (mId > 0)
  29. MessageHandler::instance().unsubscribe(mId);
  30. }
  31. MessageHandler::MessageHandler()
  32. :mNextCallbackId(1) // 0 is reserved
  33. { }
  34. void MessageHandler::send(MessageId message)
  35. {
  36. auto iterFind = mMessageHandlers.find(message.mMsgIdentifier);
  37. if (iterFind != mMessageHandlers.end())
  38. {
  39. for (auto& handlerData : iterFind->second)
  40. {
  41. handlerData.callback();
  42. }
  43. }
  44. }
  45. HMessage MessageHandler::listen(MessageId message, std::function<void()> callback)
  46. {
  47. UINT32 callbackId = mNextCallbackId++;
  48. MessageHandlerData data;
  49. data.id = callbackId;
  50. data.callback = callback;
  51. mMessageHandlers[message.mMsgIdentifier].push_back(data);
  52. mHandlerIdToMessageMap[callbackId] = message.mMsgIdentifier;
  53. return HMessage(callbackId);
  54. }
  55. void MessageHandler::unsubscribe(UINT32 handleId)
  56. {
  57. UINT32 msgId = mHandlerIdToMessageMap[handleId];
  58. auto iterFind = mMessageHandlers.find(msgId);
  59. if (iterFind != mMessageHandlers.end())
  60. {
  61. Vector<MessageHandlerData>& handlerData = iterFind->second;
  62. std::remove_if(handlerData.begin(), handlerData.end(),
  63. [&](MessageHandlerData& x)
  64. {
  65. return x.id == handleId;
  66. });
  67. }
  68. mHandlerIdToMessageMap.erase(handleId);
  69. }
  70. void sendMessage(MessageId message)
  71. {
  72. MessageHandler::instance().send(message);
  73. }
  74. }