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