router.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1// Copyright 2014 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_ 6#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_ 7 8#include <map> 9 10#include "mojo/public/cpp/bindings/lib/connector.h" 11#include "mojo/public/cpp/bindings/lib/shared_data.h" 12 13namespace mojo { 14namespace internal { 15 16class Router : public MessageReceiver { 17 public: 18 // The Router takes ownership of |message_pipe|. 19 explicit Router(ScopedMessagePipeHandle message_pipe, 20 MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter()); 21 virtual ~Router(); 22 23 // Sets the receiver to handle messages read from the message pipe that do 24 // not have the kMessageIsResponse flag set. 25 void set_incoming_receiver(MessageReceiver* receiver) { 26 incoming_receiver_ = receiver; 27 } 28 29 // Sets the error handler to receive notifications when an error is 30 // encountered while reading from the pipe or waiting to read from the pipe. 31 void set_error_handler(ErrorHandler* error_handler) { 32 connector_.set_error_handler(error_handler); 33 } 34 35 // Returns true if an error was encountered while reading from the pipe or 36 // waiting to read from the pipe. 37 bool encountered_error() const { return connector_.encountered_error(); } 38 39 // MessageReceiver implementation: 40 virtual bool Accept(Message* message) MOJO_OVERRIDE; 41 virtual bool AcceptWithResponder(Message* message, MessageReceiver* responder) 42 MOJO_OVERRIDE; 43 44 private: 45 typedef std::map<uint64_t, MessageReceiver*> ResponderMap; 46 47 class HandleIncomingMessageThunk : public MessageReceiver { 48 public: 49 HandleIncomingMessageThunk(Router* router); 50 virtual ~HandleIncomingMessageThunk(); 51 52 // MessageReceiver implementation: 53 virtual bool Accept(Message* message) MOJO_OVERRIDE; 54 virtual bool AcceptWithResponder(Message* message, 55 MessageReceiver* responder) MOJO_OVERRIDE; 56 private: 57 Router* router_; 58 }; 59 60 bool HandleIncomingMessage(Message* message); 61 62 Connector connector_; 63 SharedData<Router*> weak_self_; 64 MessageReceiver* incoming_receiver_; 65 HandleIncomingMessageThunk thunk_; 66 ResponderMap responders_; 67 uint64_t next_request_id_; 68}; 69 70} // namespace internal 71} // namespace mojo 72 73#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_ 74