Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / mojo / public / cpp / bindings / lib / router.h
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
13 namespace mojo {
14 namespace internal {
15
16 class 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   // Errors from incoming receivers will force the router's connector into an
36   // error state, where no more messages will be processed. This method is used
37   // during testing to prevent that from happening.
38   void set_enforce_errors_from_incoming_receiver(bool enforce) {
39     connector_.set_enforce_errors_from_incoming_receiver(enforce);
40   }
41
42   // Returns true if an error was encountered while reading from the pipe or
43   // waiting to read from the pipe.
44   bool encountered_error() const { return connector_.encountered_error(); }
45
46   void CloseMessagePipe() {
47     connector_.CloseMessagePipe();
48   }
49
50   ScopedMessagePipeHandle ReleaseMessagePipe() {
51     return connector_.ReleaseMessagePipe();
52   }
53
54   // MessageReceiver implementation:
55   virtual bool Accept(Message* message) MOJO_OVERRIDE;
56   virtual bool AcceptWithResponder(Message* message, MessageReceiver* responder)
57       MOJO_OVERRIDE;
58
59  private:
60   typedef std::map<uint64_t, MessageReceiver*> ResponderMap;
61
62   class HandleIncomingMessageThunk : public MessageReceiver {
63    public:
64     HandleIncomingMessageThunk(Router* router);
65     virtual ~HandleIncomingMessageThunk();
66
67     // MessageReceiver implementation:
68     virtual bool Accept(Message* message) MOJO_OVERRIDE;
69     virtual bool AcceptWithResponder(Message* message,
70                                      MessageReceiver* responder) MOJO_OVERRIDE;
71    private:
72     Router* router_;
73   };
74
75   bool HandleIncomingMessage(Message* message);
76
77   Connector connector_;
78   SharedData<Router*> weak_self_;
79   MessageReceiver* incoming_receiver_;
80   HandleIncomingMessageThunk thunk_;
81   ResponderMap responders_;
82   uint64_t next_request_id_;
83 };
84
85 }  // namespace internal
86 }  // namespace mojo
87
88 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ROUTER_H_