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/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 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 FROM_HERE, | 63 FROM_HERE, |
64 base::Bind(&InterfaceEndpointClient::RaiseError, endpoint_client_)); | 64 base::Bind(&InterfaceEndpointClient::RaiseError, endpoint_client_)); |
65 } | 65 } |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 // MessageReceiver implementation: | 69 // MessageReceiver implementation: |
70 bool Accept(Message* message) override { | 70 bool Accept(Message* message) override { |
71 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 71 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
72 accept_was_invoked_ = true; | 72 accept_was_invoked_ = true; |
73 DCHECK(message->has_flag(internal::kMessageIsResponse)); | 73 DCHECK(message->has_flag(Message::kFlagIsResponse)); |
74 | 74 |
75 bool result = false; | 75 bool result = false; |
76 | 76 |
77 if (endpoint_client_) | 77 if (endpoint_client_) |
78 result = endpoint_client_->Accept(message); | 78 result = endpoint_client_->Accept(message); |
79 | 79 |
80 return result; | 80 return result; |
81 } | 81 } |
82 | 82 |
83 // MessageReceiverWithStatus implementation: | 83 // MessageReceiverWithStatus implementation: |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 | 188 |
189 void InterfaceEndpointClient::RaiseError() { | 189 void InterfaceEndpointClient::RaiseError() { |
190 DCHECK(thread_checker_.CalledOnValidThread()); | 190 DCHECK(thread_checker_.CalledOnValidThread()); |
191 | 191 |
192 handle_.group_controller()->RaiseError(); | 192 handle_.group_controller()->RaiseError(); |
193 } | 193 } |
194 | 194 |
195 bool InterfaceEndpointClient::Accept(Message* message) { | 195 bool InterfaceEndpointClient::Accept(Message* message) { |
196 DCHECK(thread_checker_.CalledOnValidThread()); | 196 DCHECK(thread_checker_.CalledOnValidThread()); |
197 DCHECK(controller_); | 197 DCHECK(controller_); |
198 DCHECK(!message->has_flag(internal::kMessageExpectsResponse)); | 198 DCHECK(!message->has_flag(Message::kFlagExpectsResponse)); |
199 | 199 |
200 if (encountered_error_) | 200 if (encountered_error_) |
201 return false; | 201 return false; |
202 | 202 |
203 return controller_->SendMessage(message); | 203 return controller_->SendMessage(message); |
204 } | 204 } |
205 | 205 |
206 bool InterfaceEndpointClient::AcceptWithResponder(Message* message, | 206 bool InterfaceEndpointClient::AcceptWithResponder(Message* message, |
207 MessageReceiver* responder) { | 207 MessageReceiver* responder) { |
208 DCHECK(thread_checker_.CalledOnValidThread()); | 208 DCHECK(thread_checker_.CalledOnValidThread()); |
209 DCHECK(controller_); | 209 DCHECK(controller_); |
210 DCHECK(message->has_flag(internal::kMessageExpectsResponse)); | 210 DCHECK(message->has_flag(Message::kFlagExpectsResponse)); |
211 | 211 |
212 if (encountered_error_) | 212 if (encountered_error_) |
213 return false; | 213 return false; |
214 | 214 |
215 // 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. |
216 uint64_t request_id = next_request_id_++; | 216 uint64_t request_id = next_request_id_++; |
217 if (request_id == 0) | 217 if (request_id == 0) |
218 request_id = next_request_id_++; | 218 request_id = next_request_id_++; |
219 | 219 |
220 message->set_request_id(request_id); | 220 message->set_request_id(request_id); |
221 | 221 |
222 bool is_sync = message->has_flag(internal::kMessageIsSync); | 222 bool is_sync = message->has_flag(Message::kFlagIsSync); |
223 if (!controller_->SendMessage(message)) | 223 if (!controller_->SendMessage(message)) |
224 return false; | 224 return false; |
225 | 225 |
226 if (!is_sync) { | 226 if (!is_sync) { |
227 // We assume ownership of |responder|. | 227 // We assume ownership of |responder|. |
228 async_responders_[request_id] = base::WrapUnique(responder); | 228 async_responders_[request_id] = base::WrapUnique(responder); |
229 return true; | 229 return true; |
230 } | 230 } |
231 | 231 |
232 SyncCallRestrictions::AssertSyncCallAllowed(); | 232 SyncCallRestrictions::AssertSyncCallAllowed(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 if (encountered_error_) | 267 if (encountered_error_) |
268 return; | 268 return; |
269 encountered_error_ = true; | 269 encountered_error_ = true; |
270 if (!error_handler_.is_null()) | 270 if (!error_handler_.is_null()) |
271 error_handler_.Run(); | 271 error_handler_.Run(); |
272 } | 272 } |
273 | 273 |
274 bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { | 274 bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
275 DCHECK_EQ(handle_.id(), message->interface_id()); | 275 DCHECK_EQ(handle_.id(), message->interface_id()); |
276 | 276 |
277 if (message->has_flag(internal::kMessageExpectsResponse)) { | 277 if (message->has_flag(Message::kFlagExpectsResponse)) { |
278 if (!incoming_receiver_) | 278 if (!incoming_receiver_) |
279 return false; | 279 return false; |
280 | 280 |
281 MessageReceiverWithStatus* responder = | 281 MessageReceiverWithStatus* responder = |
282 new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); | 282 new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); |
283 bool ok = incoming_receiver_->AcceptWithResponder(message, responder); | 283 bool ok = incoming_receiver_->AcceptWithResponder(message, responder); |
284 if (!ok) | 284 if (!ok) |
285 delete responder; | 285 delete responder; |
286 return ok; | 286 return ok; |
287 } else if (message->has_flag(internal::kMessageIsResponse)) { | 287 } else if (message->has_flag(Message::kFlagIsResponse)) { |
288 uint64_t request_id = message->request_id(); | 288 uint64_t request_id = message->request_id(); |
289 | 289 |
290 if (message->has_flag(internal::kMessageIsSync)) { | 290 if (message->has_flag(Message::kFlagIsSync)) { |
291 auto it = sync_responses_.find(request_id); | 291 auto it = sync_responses_.find(request_id); |
292 if (it == sync_responses_.end()) | 292 if (it == sync_responses_.end()) |
293 return false; | 293 return false; |
294 it->second->response.reset(new Message()); | 294 it->second->response.reset(new Message()); |
295 message->MoveTo(it->second->response.get()); | 295 message->MoveTo(it->second->response.get()); |
296 *it->second->response_received = true; | 296 *it->second->response_received = true; |
297 return true; | 297 return true; |
298 } | 298 } |
299 | 299 |
300 auto it = async_responders_.find(request_id); | 300 auto it = async_responders_.find(request_id); |
301 if (it == async_responders_.end()) | 301 if (it == async_responders_.end()) |
302 return false; | 302 return false; |
303 std::unique_ptr<MessageReceiver> responder = std::move(it->second); | 303 std::unique_ptr<MessageReceiver> responder = std::move(it->second); |
304 async_responders_.erase(it); | 304 async_responders_.erase(it); |
305 return responder->Accept(message); | 305 return responder->Accept(message); |
306 } else { | 306 } else { |
307 if (!incoming_receiver_) | 307 if (!incoming_receiver_) |
308 return false; | 308 return false; |
309 | 309 |
310 return incoming_receiver_->Accept(message); | 310 return incoming_receiver_->Accept(message); |
311 } | 311 } |
312 } | 312 } |
313 | 313 |
314 } // namespace mojo | 314 } // namespace mojo |
OLD | NEW |