15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_MESSAGE_ROUTER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_MESSAGE_ROUTER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The MessageRouter handles all incoming messages sent to it by routing them
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the correct listener.  Routing is based on the Message's routing ID.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Since routing IDs are typically assigned asynchronously by the browser
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process, the MessageRouter has the notion of pending IDs for listeners that
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have not yet been assigned a routing ID.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When a message arrives, the routing ID is used to index the set of routes to
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// find a listener.  If a listener is found, then the message is passed to it.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, the message is ignored if its routing ID is not equal to
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MSG_ROUTING_CONTROL.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The MessageRouter supports the IPC::Sender interface for outgoing messages,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but does not define a meaningful implementation of it.  The subclass of
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MessageRouter is intended to provide that if appropriate.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The MessageRouter can be used as a concrete class provided its Send method
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not called and it does not receive any control messages.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageRouter : public IPC::Listener, public IPC::Sender {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageRouter();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MessageRouter();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implemented by subclasses to handle control messages
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnControlMessageReceived(const IPC::Message& msg);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Like OnMessageReceived, except it only handles routed messages.  Returns
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true if the message was dispatched, or false if there was no listener for
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that route id.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RouteMessage(const IPC::Message& msg);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Called to add a listener for a particular message routing ID.
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns true if succeeded.
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool AddRoute(int32 routing_id, IPC::Listener* listener);
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Called to remove a listener for a particular message routing ID.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRoute(int32 routing_id);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A list of all listeners with assigned routing IDs.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<IPC::Listener> routes_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MessageRouter);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_MESSAGE_ROUTER_H_
68