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.
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_
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"
18 class Router
: public MessageReceiverWithResponder
{
20 Router(ScopedMessagePipeHandle message_pipe
,
22 const MojoAsyncWaiter
* waiter
= Environment::GetDefaultAsyncWaiter());
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
;
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
);
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(); }
41 void CloseMessagePipe() {
42 connector_
.CloseMessagePipe();
45 ScopedMessagePipeHandle
PassMessagePipe() {
46 return connector_
.PassMessagePipe();
49 // MessageReceiver implementation:
50 virtual bool Accept(Message
* message
) MOJO_OVERRIDE
;
51 virtual bool AcceptWithResponder(Message
* message
, MessageReceiver
* responder
)
54 // Blocks the current thread for the first incoming method call, i.e., either
55 // a call to a client method or a callback method.
56 bool WaitForIncomingMessage() {
57 return connector_
.WaitForIncomingMessage();
60 // Sets this object to testing mode.
62 // - the object is more tolerant of unrecognized response messages;
63 // - the connector continues working after seeing errors from its incoming
65 void EnableTestingMode();
68 typedef std::map
<uint64_t, MessageReceiver
*> ResponderMap
;
70 class HandleIncomingMessageThunk
: public MessageReceiver
{
72 HandleIncomingMessageThunk(Router
* router
);
73 virtual ~HandleIncomingMessageThunk();
75 // MessageReceiver implementation:
76 virtual bool Accept(Message
* message
) MOJO_OVERRIDE
;
82 bool HandleIncomingMessage(Message
* message
);
84 HandleIncomingMessageThunk thunk_
;
87 SharedData
<Router
*> weak_self_
;
88 MessageReceiverWithResponder
* incoming_receiver_
;
89 ResponderMap responders_
;
90 uint64_t next_request_id_
;
94 } // namespace internal
97 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_