MessageReceiverMap.cpp [plain text]
#include "config.h"
#include "MessageReceiverMap.h"
#include "MessageDecoder.h"
#include "MessageReceiver.h"
namespace IPC {
MessageReceiverMap::MessageReceiverMap()
{
}
MessageReceiverMap::~MessageReceiverMap()
{
}
void MessageReceiverMap::addMessageReceiver(StringReference messageReceiverName, MessageReceiver& messageReceiver)
{
ASSERT(!m_globalMessageReceivers.contains(messageReceiverName));
messageReceiver.willBeAddedToMessageReceiverMap();
m_globalMessageReceivers.set(messageReceiverName, &messageReceiver);
}
void MessageReceiverMap::addMessageReceiver(StringReference messageReceiverName, uint64_t destinationID, MessageReceiver& messageReceiver)
{
ASSERT(destinationID);
ASSERT(!m_messageReceivers.contains(std::make_pair(messageReceiverName, destinationID)));
ASSERT(!m_globalMessageReceivers.contains(messageReceiverName));
messageReceiver.willBeAddedToMessageReceiverMap();
m_messageReceivers.set(std::make_pair(messageReceiverName, destinationID), &messageReceiver);
}
void MessageReceiverMap::removeMessageReceiver(StringReference messageReceiverName)
{
ASSERT(m_globalMessageReceivers.contains(messageReceiverName));
auto it = m_globalMessageReceivers.find(messageReceiverName);
it->value->willBeRemovedFromMessageReceiverMap();
m_globalMessageReceivers.remove(it);
}
void MessageReceiverMap::removeMessageReceiver(StringReference messageReceiverName, uint64_t destinationID)
{
ASSERT(m_messageReceivers.contains(std::make_pair(messageReceiverName, destinationID)));
auto it = m_messageReceivers.find(std::make_pair(messageReceiverName, destinationID));
it->value->willBeRemovedFromMessageReceiverMap();
m_messageReceivers.remove(it);
}
void MessageReceiverMap::invalidate()
{
for (auto& messageReceiver : m_globalMessageReceivers.values())
messageReceiver->willBeRemovedFromMessageReceiverMap();
m_globalMessageReceivers.clear();
for (auto& messageReceiver : m_messageReceivers.values())
messageReceiver->willBeRemovedFromMessageReceiverMap();
m_messageReceivers.clear();
}
bool MessageReceiverMap::dispatchMessage(Connection& connection, MessageDecoder& decoder)
{
if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) {
ASSERT(!decoder.destinationID());
messageReceiver->didReceiveMessage(connection, decoder);
return true;
}
if (MessageReceiver* messageReceiver = m_messageReceivers.get(std::make_pair(decoder.messageReceiverName(), decoder.destinationID()))) {
messageReceiver->didReceiveMessage(connection, decoder);
return true;
}
return false;
}
bool MessageReceiverMap::dispatchSyncMessage(Connection& connection, MessageDecoder& decoder, std::unique_ptr<MessageEncoder>& replyEncoder)
{
if (MessageReceiver* messageReceiver = m_globalMessageReceivers.get(decoder.messageReceiverName())) {
ASSERT(!decoder.destinationID());
messageReceiver->didReceiveSyncMessage(connection, decoder, replyEncoder);
return true;
}
if (MessageReceiver* messageReceiver = m_messageReceivers.get(std::make_pair(decoder.messageReceiverName(), decoder.destinationID()))) {
messageReceiver->didReceiveSyncMessage(connection, decoder, replyEncoder);
return true;
}
return false;
}
}