OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/interface_endpoint_client.h" | 5 #include "mojo/public/cpp/bindings/interface_endpoint_client.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/location.h" | 12 #include "base/location.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "mojo/public/cpp/bindings/associated_group.h" | 17 #include "mojo/public/cpp/bindings/associated_group.h" |
18 #include "mojo/public/cpp/bindings/lib/interface_endpoint_controller.h" | 18 #include "mojo/public/cpp/bindings/associated_group_controller.h" |
19 #include "mojo/public/cpp/bindings/lib/multiplex_router.h" | 19 #include "mojo/public/cpp/bindings/interface_endpoint_controller.h" |
20 #include "mojo/public/cpp/bindings/sync_call_restrictions.h" | 20 #include "mojo/public/cpp/bindings/sync_call_restrictions.h" |
21 | 21 |
22 namespace mojo { | 22 namespace mojo { |
23 namespace internal { | |
24 | 23 |
25 // ---------------------------------------------------------------------------- | 24 // ---------------------------------------------------------------------------- |
26 | 25 |
27 namespace { | 26 namespace { |
28 | 27 |
29 void DCheckIfInvalid(const base::WeakPtr<InterfaceEndpointClient>& client, | 28 void DCheckIfInvalid(const base::WeakPtr<InterfaceEndpointClient>& client, |
30 const std::string& message) { | 29 const std::string& message) { |
31 bool is_valid = client && !client->encountered_error(); | 30 bool is_valid = client && !client->encountered_error(); |
32 DCHECK(!is_valid) << message; | 31 DCHECK(!is_valid) << message; |
33 } | 32 } |
(...skipping 30 matching lines...) Expand all Loading... |
64 FROM_HERE, | 63 FROM_HERE, |
65 base::Bind(&InterfaceEndpointClient::RaiseError, endpoint_client_)); | 64 base::Bind(&InterfaceEndpointClient::RaiseError, endpoint_client_)); |
66 } | 65 } |
67 } | 66 } |
68 } | 67 } |
69 | 68 |
70 // MessageReceiver implementation: | 69 // MessageReceiver implementation: |
71 bool Accept(Message* message) override { | 70 bool Accept(Message* message) override { |
72 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 71 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
73 accept_was_invoked_ = true; | 72 accept_was_invoked_ = true; |
74 DCHECK(message->has_flag(kMessageIsResponse)); | 73 DCHECK(message->has_flag(internal::kMessageIsResponse)); |
75 | 74 |
76 bool result = false; | 75 bool result = false; |
77 | 76 |
78 if (endpoint_client_) | 77 if (endpoint_client_) |
79 result = endpoint_client_->Accept(message); | 78 result = endpoint_client_->Accept(message); |
80 | 79 |
81 return result; | 80 return result; |
82 } | 81 } |
83 | 82 |
84 // MessageReceiverWithStatus implementation: | 83 // MessageReceiverWithStatus implementation: |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 encountered_error_(false), | 143 encountered_error_(false), |
145 task_runner_(std::move(runner)), | 144 task_runner_(std::move(runner)), |
146 weak_ptr_factory_(this) { | 145 weak_ptr_factory_(this) { |
147 DCHECK(handle_.is_valid()); | 146 DCHECK(handle_.is_valid()); |
148 DCHECK(handle_.is_local()); | 147 DCHECK(handle_.is_local()); |
149 | 148 |
150 // TODO(yzshen): the way to use validator (or message filter in general) | 149 // TODO(yzshen): the way to use validator (or message filter in general) |
151 // directly is a little awkward. | 150 // directly is a little awkward. |
152 payload_validator_->set_sink(&thunk_); | 151 payload_validator_->set_sink(&thunk_); |
153 | 152 |
154 controller_ = | 153 controller_ = handle_.group_controller()->AttachEndpointClient( |
155 handle_.router()->AttachEndpointClient(handle_, this, task_runner_); | 154 handle_, this, task_runner_); |
156 if (expect_sync_requests) | 155 if (expect_sync_requests) |
157 controller_->AllowWokenUpBySyncWatchOnSameThread(); | 156 controller_->AllowWokenUpBySyncWatchOnSameThread(); |
158 } | 157 } |
159 | 158 |
160 InterfaceEndpointClient::~InterfaceEndpointClient() { | 159 InterfaceEndpointClient::~InterfaceEndpointClient() { |
161 DCHECK(thread_checker_.CalledOnValidThread()); | 160 DCHECK(thread_checker_.CalledOnValidThread()); |
162 | 161 |
163 handle_.router()->DetachEndpointClient(handle_); | 162 handle_.group_controller()->DetachEndpointClient(handle_); |
164 } | 163 } |
165 | 164 |
166 AssociatedGroup* InterfaceEndpointClient::associated_group() { | 165 AssociatedGroup* InterfaceEndpointClient::associated_group() { |
167 if (!associated_group_) | 166 if (!associated_group_) |
168 associated_group_ = handle_.router()->CreateAssociatedGroup(); | 167 associated_group_ = handle_.group_controller()->CreateAssociatedGroup(); |
169 return associated_group_.get(); | 168 return associated_group_.get(); |
170 } | 169 } |
171 | 170 |
172 uint32_t InterfaceEndpointClient::interface_id() const { | 171 uint32_t InterfaceEndpointClient::interface_id() const { |
173 DCHECK(thread_checker_.CalledOnValidThread()); | 172 DCHECK(thread_checker_.CalledOnValidThread()); |
174 return handle_.id(); | 173 return handle_.id(); |
175 } | 174 } |
176 | 175 |
177 ScopedInterfaceEndpointHandle InterfaceEndpointClient::PassHandle() { | 176 ScopedInterfaceEndpointHandle InterfaceEndpointClient::PassHandle() { |
178 DCHECK(thread_checker_.CalledOnValidThread()); | 177 DCHECK(thread_checker_.CalledOnValidThread()); |
179 DCHECK(!has_pending_responders()); | 178 DCHECK(!has_pending_responders()); |
180 | 179 |
181 if (!handle_.is_valid()) | 180 if (!handle_.is_valid()) |
182 return ScopedInterfaceEndpointHandle(); | 181 return ScopedInterfaceEndpointHandle(); |
183 | 182 |
184 controller_ = nullptr; | 183 controller_ = nullptr; |
185 handle_.router()->DetachEndpointClient(handle_); | 184 handle_.group_controller()->DetachEndpointClient(handle_); |
186 | 185 |
187 return std::move(handle_); | 186 return std::move(handle_); |
188 } | 187 } |
189 | 188 |
190 void InterfaceEndpointClient::RaiseError() { | 189 void InterfaceEndpointClient::RaiseError() { |
191 DCHECK(thread_checker_.CalledOnValidThread()); | 190 DCHECK(thread_checker_.CalledOnValidThread()); |
192 | 191 |
193 handle_.router()->RaiseError(); | 192 handle_.group_controller()->RaiseError(); |
194 } | 193 } |
195 | 194 |
196 bool InterfaceEndpointClient::Accept(Message* message) { | 195 bool InterfaceEndpointClient::Accept(Message* message) { |
197 DCHECK(thread_checker_.CalledOnValidThread()); | 196 DCHECK(thread_checker_.CalledOnValidThread()); |
198 DCHECK(controller_); | 197 DCHECK(controller_); |
199 DCHECK(!message->has_flag(kMessageExpectsResponse)); | 198 DCHECK(!message->has_flag(internal::kMessageExpectsResponse)); |
200 | 199 |
201 if (encountered_error_) | 200 if (encountered_error_) |
202 return false; | 201 return false; |
203 | 202 |
204 return controller_->SendMessage(message); | 203 return controller_->SendMessage(message); |
205 } | 204 } |
206 | 205 |
207 bool InterfaceEndpointClient::AcceptWithResponder(Message* message, | 206 bool InterfaceEndpointClient::AcceptWithResponder(Message* message, |
208 MessageReceiver* responder) { | 207 MessageReceiver* responder) { |
209 DCHECK(thread_checker_.CalledOnValidThread()); | 208 DCHECK(thread_checker_.CalledOnValidThread()); |
210 DCHECK(controller_); | 209 DCHECK(controller_); |
211 DCHECK(message->has_flag(kMessageExpectsResponse)); | 210 DCHECK(message->has_flag(internal::kMessageExpectsResponse)); |
212 | 211 |
213 if (encountered_error_) | 212 if (encountered_error_) |
214 return false; | 213 return false; |
215 | 214 |
216 // Reserve 0 in case we want it to convey special meaning in the future. | 215 // Reserve 0 in case we want it to convey special meaning in the future. |
217 uint64_t request_id = next_request_id_++; | 216 uint64_t request_id = next_request_id_++; |
218 if (request_id == 0) | 217 if (request_id == 0) |
219 request_id = next_request_id_++; | 218 request_id = next_request_id_++; |
220 | 219 |
221 message->set_request_id(request_id); | 220 message->set_request_id(request_id); |
222 | 221 |
223 bool is_sync = message->has_flag(kMessageIsSync); | 222 bool is_sync = message->has_flag(internal::kMessageIsSync); |
224 if (!controller_->SendMessage(message)) | 223 if (!controller_->SendMessage(message)) |
225 return false; | 224 return false; |
226 | 225 |
227 if (!is_sync) { | 226 if (!is_sync) { |
228 // We assume ownership of |responder|. | 227 // We assume ownership of |responder|. |
229 async_responders_[request_id] = base::WrapUnique(responder); | 228 async_responders_[request_id] = base::WrapUnique(responder); |
230 return true; | 229 return true; |
231 } | 230 } |
232 | 231 |
233 SyncCallRestrictions::AssertSyncCallAllowed(); | 232 SyncCallRestrictions::AssertSyncCallAllowed(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 if (encountered_error_) | 267 if (encountered_error_) |
269 return; | 268 return; |
270 encountered_error_ = true; | 269 encountered_error_ = true; |
271 if (!error_handler_.is_null()) | 270 if (!error_handler_.is_null()) |
272 error_handler_.Run(); | 271 error_handler_.Run(); |
273 } | 272 } |
274 | 273 |
275 bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { | 274 bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
276 DCHECK_EQ(handle_.id(), message->interface_id()); | 275 DCHECK_EQ(handle_.id(), message->interface_id()); |
277 | 276 |
278 if (message->has_flag(kMessageExpectsResponse)) { | 277 if (message->has_flag(internal::kMessageExpectsResponse)) { |
279 if (!incoming_receiver_) | 278 if (!incoming_receiver_) |
280 return false; | 279 return false; |
281 | 280 |
282 MessageReceiverWithStatus* responder = | 281 MessageReceiverWithStatus* responder = |
283 new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); | 282 new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); |
284 bool ok = incoming_receiver_->AcceptWithResponder(message, responder); | 283 bool ok = incoming_receiver_->AcceptWithResponder(message, responder); |
285 if (!ok) | 284 if (!ok) |
286 delete responder; | 285 delete responder; |
287 return ok; | 286 return ok; |
288 } else if (message->has_flag(kMessageIsResponse)) { | 287 } else if (message->has_flag(internal::kMessageIsResponse)) { |
289 uint64_t request_id = message->request_id(); | 288 uint64_t request_id = message->request_id(); |
290 | 289 |
291 if (message->has_flag(kMessageIsSync)) { | 290 if (message->has_flag(internal::kMessageIsSync)) { |
292 auto it = sync_responses_.find(request_id); | 291 auto it = sync_responses_.find(request_id); |
293 if (it == sync_responses_.end()) | 292 if (it == sync_responses_.end()) |
294 return false; | 293 return false; |
295 it->second->response.reset(new Message()); | 294 it->second->response.reset(new Message()); |
296 message->MoveTo(it->second->response.get()); | 295 message->MoveTo(it->second->response.get()); |
297 *it->second->response_received = true; | 296 *it->second->response_received = true; |
298 return true; | 297 return true; |
299 } | 298 } |
300 | 299 |
301 auto it = async_responders_.find(request_id); | 300 auto it = async_responders_.find(request_id); |
302 if (it == async_responders_.end()) | 301 if (it == async_responders_.end()) |
303 return false; | 302 return false; |
304 std::unique_ptr<MessageReceiver> responder = std::move(it->second); | 303 std::unique_ptr<MessageReceiver> responder = std::move(it->second); |
305 async_responders_.erase(it); | 304 async_responders_.erase(it); |
306 return responder->Accept(message); | 305 return responder->Accept(message); |
307 } else { | 306 } else { |
308 if (!incoming_receiver_) | 307 if (!incoming_receiver_) |
309 return false; | 308 return false; |
310 | 309 |
311 return incoming_receiver_->Accept(message); | 310 return incoming_receiver_->Accept(message); |
312 } | 311 } |
313 } | 312 } |
314 | 313 |
315 } // namespace internal | |
316 } // namespace mojo | 314 } // namespace mojo |
OLD | NEW |