BsMessageHandler.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. handlerData.erase(
  63. std::remove_if(handlerData.begin(), handlerData.end(),
  64. [&](MessageHandlerData& x)
  65. {
  66. return x.id == handleId;
  67. }));
  68. }
  69. mHandlerIdToMessageMap.erase(handleId);
  70. }
  71. void sendMessage(MessageId message)
  72. {
  73. MessageHandler::instance().send(message);
  74. }
  75. }