1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef IPC_MESSAGE_ROUTER_H_ 6*635a8641SAndroid Build Coastguard Worker #define IPC_MESSAGE_ROUTER_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include "base/component_export.h" 11*635a8641SAndroid Build Coastguard Worker #include "base/containers/id_map.h" 12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h" 13*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_listener.h" 14*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_sender.h" 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker // The MessageRouter handles all incoming messages sent to it by routing them 17*635a8641SAndroid Build Coastguard Worker // to the correct listener. Routing is based on the Message's routing ID. 18*635a8641SAndroid Build Coastguard Worker // Since routing IDs are typically assigned asynchronously by the browser 19*635a8641SAndroid Build Coastguard Worker // process, the MessageRouter has the notion of pending IDs for listeners that 20*635a8641SAndroid Build Coastguard Worker // have not yet been assigned a routing ID. 21*635a8641SAndroid Build Coastguard Worker // 22*635a8641SAndroid Build Coastguard Worker // When a message arrives, the routing ID is used to index the set of routes to 23*635a8641SAndroid Build Coastguard Worker // find a listener. If a listener is found, then the message is passed to it. 24*635a8641SAndroid Build Coastguard Worker // Otherwise, the message is ignored if its routing ID is not equal to 25*635a8641SAndroid Build Coastguard Worker // MSG_ROUTING_CONTROL. 26*635a8641SAndroid Build Coastguard Worker // 27*635a8641SAndroid Build Coastguard Worker // The MessageRouter supports the IPC::Sender interface for outgoing messages, 28*635a8641SAndroid Build Coastguard Worker // but does not define a meaningful implementation of it. The subclass of 29*635a8641SAndroid Build Coastguard Worker // MessageRouter is intended to provide that if appropriate. 30*635a8641SAndroid Build Coastguard Worker // 31*635a8641SAndroid Build Coastguard Worker // The MessageRouter can be used as a concrete class provided its Send method 32*635a8641SAndroid Build Coastguard Worker // is not called and it does not receive any control messages. 33*635a8641SAndroid Build Coastguard Worker 34*635a8641SAndroid Build Coastguard Worker namespace IPC { 35*635a8641SAndroid Build Coastguard Worker COMPONENT_EXPORT(IPC)36*635a8641SAndroid Build Coastguard Workerclass COMPONENT_EXPORT(IPC) MessageRouter : public Listener, public Sender { 37*635a8641SAndroid Build Coastguard Worker public: 38*635a8641SAndroid Build Coastguard Worker MessageRouter(); 39*635a8641SAndroid Build Coastguard Worker ~MessageRouter() override; 40*635a8641SAndroid Build Coastguard Worker 41*635a8641SAndroid Build Coastguard Worker // Implemented by subclasses to handle control messages 42*635a8641SAndroid Build Coastguard Worker virtual bool OnControlMessageReceived(const Message& msg); 43*635a8641SAndroid Build Coastguard Worker 44*635a8641SAndroid Build Coastguard Worker // Listener implementation: 45*635a8641SAndroid Build Coastguard Worker bool OnMessageReceived(const Message& msg) override; 46*635a8641SAndroid Build Coastguard Worker 47*635a8641SAndroid Build Coastguard Worker // Like OnMessageReceived, except it only handles routed messages. Returns 48*635a8641SAndroid Build Coastguard Worker // true if the message was dispatched, or false if there was no listener for 49*635a8641SAndroid Build Coastguard Worker // that route id. 50*635a8641SAndroid Build Coastguard Worker virtual bool RouteMessage(const Message& msg); 51*635a8641SAndroid Build Coastguard Worker 52*635a8641SAndroid Build Coastguard Worker // Sender implementation: 53*635a8641SAndroid Build Coastguard Worker bool Send(Message* msg) override; 54*635a8641SAndroid Build Coastguard Worker 55*635a8641SAndroid Build Coastguard Worker // Called to add a listener for a particular message routing ID. 56*635a8641SAndroid Build Coastguard Worker // Returns true if succeeded. 57*635a8641SAndroid Build Coastguard Worker bool AddRoute(int32_t routing_id, Listener* listener); 58*635a8641SAndroid Build Coastguard Worker 59*635a8641SAndroid Build Coastguard Worker // Called to remove a listener for a particular message routing ID. 60*635a8641SAndroid Build Coastguard Worker void RemoveRoute(int32_t routing_id); 61*635a8641SAndroid Build Coastguard Worker 62*635a8641SAndroid Build Coastguard Worker // Returns the Listener associated with |routing_id|. 63*635a8641SAndroid Build Coastguard Worker Listener* GetRoute(int32_t routing_id); 64*635a8641SAndroid Build Coastguard Worker 65*635a8641SAndroid Build Coastguard Worker private: 66*635a8641SAndroid Build Coastguard Worker // A list of all listeners with assigned routing IDs. 67*635a8641SAndroid Build Coastguard Worker base::IDMap<Listener*> routes_; 68*635a8641SAndroid Build Coastguard Worker 69*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(MessageRouter); 70*635a8641SAndroid Build Coastguard Worker }; 71*635a8641SAndroid Build Coastguard Worker 72*635a8641SAndroid Build Coastguard Worker } // namespace IPC 73*635a8641SAndroid Build Coastguard Worker 74*635a8641SAndroid Build Coastguard Worker #endif // IPC_MESSAGE_ROUTER_H_ 75