1// Copyright 2013 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 "content/browser/message_port_message_filter.h"
6
7#include "content/browser/message_port_service.h"
8#include "content/common/message_port_messages.h"
9
10namespace content {
11
12MessagePortMessageFilter::MessagePortMessageFilter(
13    const NextRoutingIDCallback& callback)
14    : BrowserMessageFilter(MessagePortMsgStart),
15      next_routing_id_(callback) {
16}
17
18MessagePortMessageFilter::~MessagePortMessageFilter() {
19}
20
21void MessagePortMessageFilter::OnChannelClosing() {
22  MessagePortService::GetInstance()->OnMessagePortMessageFilterClosing(this);
23}
24
25bool MessagePortMessageFilter::OnMessageReceived(const IPC::Message& message) {
26  bool handled = true;
27  IPC_BEGIN_MESSAGE_MAP(MessagePortMessageFilter, message)
28    IPC_MESSAGE_HANDLER(MessagePortHostMsg_CreateMessagePort,
29                        OnCreateMessagePort)
30    IPC_MESSAGE_FORWARD(MessagePortHostMsg_DestroyMessagePort,
31                        MessagePortService::GetInstance(),
32                        MessagePortService::Destroy)
33    IPC_MESSAGE_FORWARD(MessagePortHostMsg_Entangle,
34                        MessagePortService::GetInstance(),
35                        MessagePortService::Entangle)
36    IPC_MESSAGE_FORWARD(MessagePortHostMsg_PostMessage,
37                        MessagePortService::GetInstance(),
38                        MessagePortService::PostMessage)
39    IPC_MESSAGE_FORWARD(MessagePortHostMsg_QueueMessages,
40                        MessagePortService::GetInstance(),
41                        MessagePortService::QueueMessages)
42    IPC_MESSAGE_FORWARD(MessagePortHostMsg_SendQueuedMessages,
43                        MessagePortService::GetInstance(),
44                        MessagePortService::SendQueuedMessages)
45    IPC_MESSAGE_UNHANDLED(handled = false)
46  IPC_END_MESSAGE_MAP()
47
48  return handled;
49}
50
51void MessagePortMessageFilter::OnDestruct() const {
52  BrowserThread::DeleteOnIOThread::Destruct(this);
53}
54
55int MessagePortMessageFilter::GetNextRoutingID() {
56  return next_routing_id_.Run();
57}
58
59void MessagePortMessageFilter::UpdateMessagePortsWithNewRoutes(
60    const std::vector<int>& message_port_ids,
61    std::vector<int>* new_routing_ids) {
62  DCHECK(new_routing_ids);
63  new_routing_ids->clear();
64  new_routing_ids->resize(message_port_ids.size());
65
66  for (size_t i = 0; i < message_port_ids.size(); ++i) {
67    (*new_routing_ids)[i] = GetNextRoutingID();
68    MessagePortService::GetInstance()->UpdateMessagePort(
69        message_port_ids[i],
70        this,
71        (*new_routing_ids)[i]);
72  }
73}
74
75void MessagePortMessageFilter::OnCreateMessagePort(int *route_id,
76                                                   int* message_port_id) {
77  *route_id = next_routing_id_.Run();
78  MessagePortService::GetInstance()->Create(*route_id, this, message_port_id);
79}
80
81}  // namespace content
82