1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ipc/ipc_forwarding_message_filter.h" 6 7#include "base/bind.h" 8#include "base/location.h" 9#include "ipc/ipc_message.h" 10 11namespace IPC { 12 13ForwardingMessageFilter::ForwardingMessageFilter( 14 const uint32* message_ids_to_filter, 15 size_t num_message_ids_to_filter, 16 base::TaskRunner* target_task_runner) 17 : target_task_runner_(target_task_runner) { 18 DCHECK(target_task_runner_.get()); 19 for (size_t i = 0; i < num_message_ids_to_filter; i++) 20 message_ids_to_filter_.insert(message_ids_to_filter[i]); 21} 22 23void ForwardingMessageFilter::AddRoute(int routing_id, const Handler& handler) { 24 DCHECK(!handler.is_null()); 25 base::AutoLock locked(handlers_lock_); 26 handlers_.insert(std::make_pair(routing_id, handler)); 27} 28 29void ForwardingMessageFilter::RemoveRoute(int routing_id) { 30 base::AutoLock locked(handlers_lock_); 31 handlers_.erase(routing_id); 32} 33 34bool ForwardingMessageFilter::OnMessageReceived(const Message& message) { 35 if (message_ids_to_filter_.find(message.type()) == 36 message_ids_to_filter_.end()) 37 return false; 38 39 40 Handler handler; 41 42 { 43 base::AutoLock locked(handlers_lock_); 44 std::map<int, Handler>::iterator it = handlers_.find(message.routing_id()); 45 if (it == handlers_.end()) 46 return false; 47 handler = it->second; 48 } 49 50 target_task_runner_->PostTask(FROM_HERE, base::Bind(handler, message)); 51 return true; 52} 53 54ForwardingMessageFilter::~ForwardingMessageFilter() { 55} 56 57} // namespace IPC 58