// 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<int, Handler>::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
