BsMessageHandler.cpp 2.1 KB

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