// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ipc/ipc_forwarding_message_filter.h" #include "base/bind.h" #include "base/location.h" namespace IPC { ForwardingMessageFilter::ForwardingMessageFilter( const uint32* message_ids_to_filter, size_t num_message_ids_to_filter, base::TaskRunner* target_task_runner) : target_task_runner_(target_task_runner) { DCHECK(target_task_runner_.get()); for (size_t i = 0; i < num_message_ids_to_filter; i++) message_ids_to_filter_.insert(message_ids_to_filter[i]); } void ForwardingMessageFilter::AddRoute(int routing_id, const Handler& handler) { DCHECK(!handler.is_null()); base::AutoLock locked(handlers_lock_); handlers_.insert(std::make_pair(routing_id, handler)); } void ForwardingMessageFilter::RemoveRoute(int routing_id) { base::AutoLock locked(handlers_lock_); handlers_.erase(routing_id); } bool ForwardingMessageFilter::OnMessageReceived(const Message& message) { if (message_ids_to_filter_.find(message.type()) == message_ids_to_filter_.end()) return false; Handler handler; { base::AutoLock locked(handlers_lock_); std::map::iterator it = handlers_.find(message.routing_id()); if (it == handlers_.end()) return false; handler = it->second; } target_task_runner_->PostTask(FROM_HERE, base::Bind(handler, message)); return true; } ForwardingMessageFilter::~ForwardingMessageFilter() { } } // namespace IPC