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 10namespace IPC { 11 12ForwardingMessageFilter::ForwardingMessageFilter( 13 const uint32* message_ids_to_filter, 14 size_t num_message_ids_to_filter, 15 base::TaskRunner* target_task_runner) 16 : target_task_runner_(target_task_runner) { 17 DCHECK(target_task_runner_.get()); 18 for (size_t i = 0; i < num_message_ids_to_filter; i++) 19 message_ids_to_filter_.insert(message_ids_to_filter[i]); 20} 21 22void ForwardingMessageFilter::AddRoute(int routing_id, const Handler& handler) { 23 DCHECK(!handler.is_null()); 24 base::AutoLock locked(handlers_lock_); 25 handlers_.insert(std::make_pair(routing_id, handler)); 26} 27 28void ForwardingMessageFilter::RemoveRoute(int routing_id) { 29 base::AutoLock locked(handlers_lock_); 30 handlers_.erase(routing_id); 31} 32 33bool ForwardingMessageFilter::OnMessageReceived(const Message& message) { 34 if (message_ids_to_filter_.find(message.type()) == 35 message_ids_to_filter_.end()) 36 return false; 37 38 39 Handler handler; 40 41 { 42 base::AutoLock locked(handlers_lock_); 43 std::map<int, Handler>::iterator it = handlers_.find(message.routing_id()); 44 if (it == handlers_.end()) 45 return false; 46 handler = it->second; 47 } 48 49 target_task_runner_->PostTask(FROM_HERE, base::Bind(handler, message)); 50 return true; 51} 52 53ForwardingMessageFilter::~ForwardingMessageFilter() { 54} 55 56} // namespace IPC 57