OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/public/cpp/bindings/lib/router.h" | 5 #include "mojo/public/cpp/bindings/lib/router.h" |
6 | 6 |
7 #include "mojo/public/cpp/environment/logging.h" | 7 #include "mojo/public/cpp/environment/logging.h" |
8 | 8 |
9 namespace mojo { | 9 namespace mojo { |
10 namespace internal { | 10 namespace internal { |
11 | 11 |
12 // ---------------------------------------------------------------------------- | 12 // ---------------------------------------------------------------------------- |
13 | 13 |
14 class ResponderThunk : public MessageReceiver { | 14 class ResponderThunk : public MessageReceiverWithStatus { |
15 public: | 15 public: |
16 explicit ResponderThunk(const SharedData<Router*>& router) | 16 explicit ResponderThunk(const SharedData<Router*>& router) |
17 : router_(router), accept_was_invoked_(false) {} | 17 : router_(router), accept_was_invoked_(false) {} |
18 ~ResponderThunk() override { | 18 ~ResponderThunk() override { |
19 if (!accept_was_invoked_) { | 19 if (!accept_was_invoked_) { |
20 // The Mojo application handled a message that was expecting a response | 20 // The Mojo application handled a message that was expecting a response |
21 // but did not send a response. | 21 // but did not send a response. |
22 Router* router = router_.value(); | 22 Router* router = router_.value(); |
23 if (router) { | 23 if (router) { |
24 // We close the pipe here as a way of signaling to the calling | 24 // We close the pipe here as a way of signaling to the calling |
(...skipping 12 matching lines...) Expand all Loading... |
37 | 37 |
38 bool result = false; | 38 bool result = false; |
39 | 39 |
40 Router* router = router_.value(); | 40 Router* router = router_.value(); |
41 if (router) | 41 if (router) |
42 result = router->Accept(message); | 42 result = router->Accept(message); |
43 | 43 |
44 return result; | 44 return result; |
45 } | 45 } |
46 | 46 |
| 47 // MessageReceiverWithStatus implementation: |
| 48 bool IsValid() override { |
| 49 Router* router = router_.value(); |
| 50 return router && !router->encountered_error() && router->is_valid(); |
| 51 } |
| 52 |
47 private: | 53 private: |
48 SharedData<Router*> router_; | 54 SharedData<Router*> router_; |
49 bool accept_was_invoked_; | 55 bool accept_was_invoked_; |
50 }; | 56 }; |
51 | 57 |
52 // ---------------------------------------------------------------------------- | 58 // ---------------------------------------------------------------------------- |
53 | 59 |
54 Router::HandleIncomingMessageThunk::HandleIncomingMessageThunk(Router* router) | 60 Router::HandleIncomingMessageThunk::HandleIncomingMessageThunk(Router* router) |
55 : router_(router) { | 61 : router_(router) { |
56 } | 62 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 } | 117 } |
112 | 118 |
113 void Router::EnableTestingMode() { | 119 void Router::EnableTestingMode() { |
114 testing_mode_ = true; | 120 testing_mode_ = true; |
115 connector_.set_enforce_errors_from_incoming_receiver(false); | 121 connector_.set_enforce_errors_from_incoming_receiver(false); |
116 } | 122 } |
117 | 123 |
118 bool Router::HandleIncomingMessage(Message* message) { | 124 bool Router::HandleIncomingMessage(Message* message) { |
119 if (message->has_flag(kMessageExpectsResponse)) { | 125 if (message->has_flag(kMessageExpectsResponse)) { |
120 if (incoming_receiver_) { | 126 if (incoming_receiver_) { |
121 MessageReceiver* responder = new ResponderThunk(weak_self_); | 127 MessageReceiverWithStatus* responder = new ResponderThunk(weak_self_); |
122 bool ok = incoming_receiver_->AcceptWithResponder(message, responder); | 128 bool ok = incoming_receiver_->AcceptWithResponder(message, responder); |
123 if (!ok) | 129 if (!ok) |
124 delete responder; | 130 delete responder; |
125 return ok; | 131 return ok; |
126 } | 132 } |
127 | 133 |
128 // If we receive a request expecting a response when the client is not | 134 // If we receive a request expecting a response when the client is not |
129 // listening, then we have no choice but to tear down the pipe. | 135 // listening, then we have no choice but to tear down the pipe. |
130 connector_.CloseMessagePipe(); | 136 connector_.CloseMessagePipe(); |
131 } else if (message->has_flag(kMessageIsResponse)) { | 137 } else if (message->has_flag(kMessageIsResponse)) { |
(...skipping 14 matching lines...) Expand all Loading... |
146 // OK to drop message on the floor. | 152 // OK to drop message on the floor. |
147 } | 153 } |
148 | 154 |
149 return false; | 155 return false; |
150 } | 156 } |
151 | 157 |
152 // ---------------------------------------------------------------------------- | 158 // ---------------------------------------------------------------------------- |
153 | 159 |
154 } // namespace internal | 160 } // namespace internal |
155 } // namespace mojo | 161 } // namespace mojo |
OLD | NEW |