Home | History | Annotate | Download | only in lib
      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/filter_chain.h"
     12 #include "mojo/public/cpp/bindings/lib/shared_data.h"
     13 #include "mojo/public/cpp/environment/environment.h"
     14 
     15 namespace mojo {
     16 namespace internal {
     17 
     18 class Router : public MessageReceiverWithResponder {
     19  public:
     20   Router(ScopedMessagePipeHandle message_pipe,
     21          FilterChain filters,
     22          const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter());
     23   virtual ~Router();
     24 
     25   // Sets the receiver to handle messages read from the message pipe that do
     26   // not have the kMessageIsResponse flag set.
     27   void set_incoming_receiver(MessageReceiverWithResponder* receiver) {
     28     incoming_receiver_ = receiver;
     29   }
     30 
     31   // Sets the error handler to receive notifications when an error is
     32   // encountered while reading from the pipe or waiting to read from the pipe.
     33   void set_error_handler(ErrorHandler* error_handler) {
     34     connector_.set_error_handler(error_handler);
     35   }
     36 
     37   // Returns true if an error was encountered while reading from the pipe or
     38   // waiting to read from the pipe.
     39   bool encountered_error() const { return connector_.encountered_error(); }
     40 
     41   void CloseMessagePipe() {
     42     connector_.CloseMessagePipe();
     43   }
     44 
     45   ScopedMessagePipeHandle PassMessagePipe() {
     46     return connector_.PassMessagePipe();
     47   }
     48 
     49   // MessageReceiver implementation:
     50   virtual bool Accept(Message* message) MOJO_OVERRIDE;
     51   virtual bool AcceptWithResponder(Message* message, MessageReceiver* responder)
     52       MOJO_OVERRIDE;
     53 
     54   // Sets this object to testing mode.
     55   // In testing mode:
     56   // - the object is more tolerant of unrecognized response messages;
     57   // - the connector continues working after seeing errors from its incoming
     58   //   receiver.
     59   void EnableTestingMode();
     60 
     61  private:
     62   typedef std::map<uint64_t, MessageReceiver*> ResponderMap;
     63 
     64   class HandleIncomingMessageThunk : public MessageReceiver {
     65    public:
     66     HandleIncomingMessageThunk(Router* router);
     67     virtual ~HandleIncomingMessageThunk();
     68 
     69     // MessageReceiver implementation:
     70     virtual bool Accept(Message* message) MOJO_OVERRIDE;
     71 
     72    private:
     73     Router* router_;
     74   };
     75 
     76   bool HandleIncomingMessage(Message* message);
     77 
     78   HandleIncomingMessageThunk thunk_;
     79   FilterChain filters_;
     80   Connector connector_;
     81   SharedData<Router*> weak_self_;
     82   MessageReceiverWithResponder* incoming_receiver_;
     83   ResponderMap responders_;
     84   uint64_t next_request_id_;
     85   bool testing_mode_;
     86 };
     87 
     88 }  // namespace internal
     89 }  // namespace mojo
     90 
     91 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_
     92