Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /ipc /message_filter_router.cc
blob: 1738b1ea9b4d29f2b8b803f404942b2e02f9d30c [file] [log] [blame] [edit]
// 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

[8]ページ先頭

©2009-2025 Movatter.jp