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#ifndef CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
6#define CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
7
8#include <map>
9#include <utility>
10#include <vector>
11
12#include "base/basictypes.h"
13#include "base/memory/singleton.h"
14#include "base/strings/string16.h"
15#include "ipc/ipc_message.h"
16
17namespace content {
18class MessagePortMessageFilter;
19
20class MessagePortService {
21 public:
22  typedef std::vector<std::pair<base::string16, std::vector<int> > >
23      QueuedMessages;
24
25  // Returns the MessagePortService singleton.
26  static MessagePortService* GetInstance();
27
28  // These methods correspond to the message port related IPCs.
29  void Create(int route_id,
30              MessagePortMessageFilter* filter,
31              int* message_port_id);
32  void Destroy(int message_port_id);
33  void Entangle(int local_message_port_id, int remote_message_port_id);
34  void PostMessage(int sender_message_port_id,
35                   const base::string16& message,
36                   const std::vector<int>& sent_message_port_ids);
37  void QueueMessages(int message_port_id);
38  void SendQueuedMessages(int message_port_id,
39                          const QueuedMessages& queued_messages);
40
41  // Updates the information needed to reach a message port when it's sent to a
42  // (possibly different) process.
43  void UpdateMessagePort(
44      int message_port_id,
45      MessagePortMessageFilter* filter,
46      int routing_id);
47
48  void OnMessagePortMessageFilterClosing(MessagePortMessageFilter* filter);
49
50  // Attempts to send the queued messages for a message port.
51  void SendQueuedMessagesIfPossible(int message_port_id);
52
53 private:
54  friend struct DefaultSingletonTraits<MessagePortService>;
55
56  MessagePortService();
57  ~MessagePortService();
58
59  void PostMessageTo(int message_port_id,
60                     const base::string16& message,
61                     const std::vector<int>& sent_message_port_ids);
62
63  // Handles the details of removing a message port id. Before calling this,
64  // verify that the message port id exists.
65  void Erase(int message_port_id);
66
67  struct MessagePort;
68  typedef std::map<int, MessagePort> MessagePorts;
69  MessagePorts message_ports_;
70
71  // We need globally unique identifiers for each message port.
72  int next_message_port_id_;
73
74  DISALLOW_COPY_AND_ASSIGN(MessagePortService);
75};
76
77}  // namespace content
78
79#endif  // CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
80