| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| |
| #include"ipc/message_filter_router.h" |
| |
| #include<stddef.h> |
| #include<stdint.h> |
| |
| #include"ipc/ipc_message_macros.h" |
| #include"ipc/ipc_message_start.h" |
| #include"ipc/ipc_message_utils.h" |
| #include"ipc/message_filter.h" |
| |
| namespace IPC{ |
| |
| namespace{ |
| |
| boolTryFiltersImpl(MessageFilterRouter::MessageFilters& filters, |
| const IPC::Message& message){ |
| for(size_t i=0; i< filters.size();++i){ |
| if(filters[i]->OnMessageReceived(message)){ |
| returntrue; |
| } |
| } |
| returnfalse; |
| } |
| |
| boolRemoveFilterImpl(MessageFilterRouter::MessageFilters& filters, |
| MessageFilter* filter){ |
| return std::erase(filters, filter)>0; |
| } |
| |
| boolValidMessageClass(int message_class){ |
| return message_class>=0&& message_class<LastIPCMsgStart; |
| } |
| |
| }// namespace |
| |
| MessageFilterRouter::MessageFilterRouter()=default; |
| MessageFilterRouter::~MessageFilterRouter()=default; |
| |
| voidMessageFilterRouter::AddFilter(MessageFilter* filter){ |
| // Determine if the filter should be applied to all messages, or only |
| // messages of a certain class. |
| std::vector<uint32_t> supported_message_classes; |
| if(filter->GetSupportedMessageClasses(&supported_message_classes)){ |
| for(size_t i=0; i< supported_message_classes.size();++i){ |
| constint message_class= supported_message_classes[i]; |
| DCHECK(ValidMessageClass(message_class)); |
| // Safely ignore repeated subscriptions to a given message class for the |
| // current filter being added. |
| if(!message_class_filters_[message_class].empty()&& |
| message_class_filters_[message_class].back()== filter){ |
| continue; |
| } |
| message_class_filters_[message_class].push_back(filter); |
| } |
| }else{ |
| global_filters_.push_back(filter); |
| } |
| } |
| |
| voidMessageFilterRouter::RemoveFilter(MessageFilter* filter){ |
| if(RemoveFilterImpl(global_filters_, filter)) |
| return; |
| |
| for(size_t i=0; i< std::size(message_class_filters_);++i) |
| RemoveFilterImpl(message_class_filters_[i], filter); |
| } |
| |
| boolMessageFilterRouter::TryFilters(constMessage& message){ |
| if(TryFiltersImpl(global_filters_, message)) |
| returntrue; |
| |
| constint message_class= IPC_MESSAGE_CLASS(message); |
| if(!ValidMessageClass(message_class)) |
| returnfalse; |
| |
| returnTryFiltersImpl(message_class_filters_[message_class], message); |
| } |
| |
| voidMessageFilterRouter::Clear(){ |
| global_filters_.clear(); |
| for(size_t i=0; i< std::size(message_class_filters_);++i) |
| message_class_filters_[i].clear(); |
| } |
| |
| }// namespace IPC |