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 17 namespace content { 18 class MessagePortMessageFilter; 19 20 class 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