MessageReceiverMap.cpp [plain text]
#include "config.h"
#include "MessageReceiverMap.h"
#include "Decoder.h"
#include "MessageReceiver.h"
namespace IPC {
MessageReceiverMap::MessageReceiverMap()
{
}
MessageReceiverMap::~MessageReceiverMap()
{
}
void MessageReceiverMap::addMessageReceiver(ReceiverName messageReceiverName, MessageReceiver& messageReceiver)
{
ASSERT(!m_globalMessageReceivers.contains(messageReceiverName));
messageReceiver.willBeAddedToMessageReceiverMap();
m_globalMessageReceivers.set(messageReceiverName, &messageReceiver);
}
void MessageReceiverMap::addMessageReceiver(ReceiverName 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(ReceiverName messageReceiverName)
{
ASSERT(m_globalMessageReceivers.contains(messageReceiverName));
auto it = m_globalMessageReceivers.find(messageReceiverName);
it->value->willBeRemovedFromMessageReceiverMap();
m_globalMessageReceivers.remove(it);
}
void MessageReceiverMap::removeMessageReceiver(ReceiverName 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::removeMessageReceiver(MessageReceiver& messageReceiver)
{
Vector<ReceiverName> globalReceiversToRemove;
for (auto& [name, receiver] : m_globalMessageReceivers) {
if (receiver == &messageReceiver)
globalReceiversToRemove.append(name);
}
for (auto& globalReceiverToRemove : globalReceiversToRemove)
removeMessageReceiver(globalReceiverToRemove);
Vector<std::pair<ReceiverName, uint64_t>> receiversToRemove;
for (auto& [nameAndDestinationID, receiver] : m_messageReceivers) {
if (receiver == &messageReceiver)
receiversToRemove.append(std::make_pair(nameAndDestinationID.first, nameAndDestinationID.second));
}
for (auto& [name, destinationID] : receiversToRemove)
removeMessageReceiver(name, destinationID);
}
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, Decoder& 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, Decoder& decoder, std::unique_ptr<Encoder>& 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;
}
}