diff options
Diffstat (limited to 'ipc/ipc_channel_proxy.cc')
-rw-r--r-- | ipc/ipc_channel_proxy.cc | 106 |
1 files changed, 6 insertions, 100 deletions
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc index 776b423..3a0cf30 100644 --- a/ipc/ipc_channel_proxy.cc +++ b/ipc/ipc_channel_proxy.cc @@ -14,96 +14,12 @@ #include "ipc/ipc_listener.h" #include "ipc/ipc_logging.h" #include "ipc/ipc_message_macros.h" -#include "ipc/ipc_message_start.h" #include "ipc/ipc_message_utils.h" namespace IPC { //------------------------------------------------------------------------------ -class ChannelProxy::Context::MessageFilterRouter { - public: - typedef std::vector<MessageFilter*> MessageFilters; - - MessageFilterRouter() {} - ~MessageFilterRouter() {} - - void AddFilter(MessageFilter* filter) { - // Determine if the filter should be applied to all messages, or only - // messages of a certain class. - std::vector<uint32> supported_message_classes; - if (filter->GetSupportedMessageClasses(&supported_message_classes)) { - DCHECK(!supported_message_classes.empty()); - for (size_t i = 0; i < supported_message_classes.size(); ++i) { - DCHECK(ValidMessageClass(supported_message_classes[i])); - message_class_filters_[supported_message_classes[i]].push_back(filter); - } - } else { - global_filters_.push_back(filter); - } - } - - void RemoveFilter(MessageFilter* filter) { - if (RemoveFilter(global_filters_, filter)) - return; - - for (size_t i = 0; i < arraysize(message_class_filters_); ++i) - RemoveFilter(message_class_filters_[i], filter); - } - - bool TryFilters(const Message& message) { - if (TryFilters(global_filters_, message)) - return true; - - const int message_class = IPC_MESSAGE_CLASS(message); - if (!ValidMessageClass(message_class)) - return false; - - return TryFilters(message_class_filters_[message_class], message); - } - - void Clear() { - global_filters_.clear(); - for (size_t i = 0; i < arraysize(message_class_filters_); ++i) - message_class_filters_[i].clear(); - } - - private: - static bool TryFilters(MessageFilters& filters, const IPC::Message& message) { - for (size_t i = 0; i < filters.size(); ++i) { - if (filters[i]->OnMessageReceived(message)) { - return true; - } - } - return false; - } - - static bool RemoveFilter(MessageFilters& filters, MessageFilter* filter) { - MessageFilters::iterator it = - std::find(filters.begin(), filters.end(), filter); - if (it == filters.end()) - return false; - - filters.erase(it); - return true; - } - - static bool ValidMessageClass(int message_class) { - return message_class >= 0 && message_class < LastIPCMsgStart; - } - - // List of global and selective filters; a given filter will exist in either - // |message_global_filters_| OR |message_class_filters_|, but not both. - // Note that |message_global_filters_| will be given first offering of any - // given message. It's the filter implementer and installer's - // responsibility to ensure that a filter is either global or selective to - // ensure proper message filtering order. - MessageFilters global_filters_; - MessageFilters message_class_filters_[LastIPCMsgStart]; -}; - -//------------------------------------------------------------------------------ - ChannelProxy::MessageFilter::MessageFilter() {} void ChannelProxy::MessageFilter::OnFilterAdded(Channel* channel) {} @@ -120,11 +36,6 @@ bool ChannelProxy::MessageFilter::OnMessageReceived(const Message& message) { return false; } -bool ChannelProxy::MessageFilter::GetSupportedMessageClasses( - std::vector<uint32>* /*supported_message_classes*/) const { - return false; -} - ChannelProxy::MessageFilter::~MessageFilter() {} //------------------------------------------------------------------------------ @@ -135,7 +46,6 @@ ChannelProxy::Context::Context(Listener* listener, listener_(listener), ipc_task_runner_(ipc_task_runner), channel_connected_called_(false), - message_filter_router_(new MessageFilterRouter()), peer_pid_(base::kNullProcessId) { DCHECK(ipc_task_runner_.get()); } @@ -155,19 +65,20 @@ void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle, } bool ChannelProxy::Context::TryFilters(const Message& message) { - DCHECK(message_filter_router_); #ifdef IPC_MESSAGE_LOG_ENABLED Logging* logger = Logging::GetInstance(); if (logger->Enabled()) logger->OnPreDispatchMessage(message); #endif - if (message_filter_router_->TryFilters(message)) { + for (size_t i = 0; i < filters_.size(); ++i) { + if (filters_[i]->OnMessageReceived(message)) { #ifdef IPC_MESSAGE_LOG_ENABLED - if (logger->Enabled()) - logger->OnPostDispatchMessage(message, channel_id_); + if (logger->Enabled()) + logger->OnPostDispatchMessage(message, channel_id_); #endif - return true; + return true; + } } return false; } @@ -246,7 +157,6 @@ void ChannelProxy::Context::OnChannelClosed() { // We don't need the filters anymore. filters_.clear(); - message_filter_router_->Clear(); channel_.reset(); @@ -280,8 +190,6 @@ void ChannelProxy::Context::OnAddFilter() { for (size_t i = 0; i < new_filters.size(); ++i) { filters_.push_back(new_filters[i]); - message_filter_router_->AddFilter(new_filters[i].get()); - // If the channel has already been created, then we need to send this // message so that the filter gets access to the Channel. if (channel_.get()) @@ -297,8 +205,6 @@ void ChannelProxy::Context::OnRemoveFilter(MessageFilter* filter) { if (!channel_.get()) return; // The filters have already been deleted. - message_filter_router_->RemoveFilter(filter); - for (size_t i = 0; i < filters_.size(); ++i) { if (filters_[i].get() == filter) { filter->OnFilterRemoved(); |