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 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/logging.h" |
13 #include "base/macros.h" | 14 #include "base/macros.h" |
14 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
15 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
16 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
17 #include "mojo/public/cpp/bindings/associated_group.h" | 18 #include "mojo/public/cpp/bindings/associated_group.h" |
18 #include "mojo/public/cpp/bindings/associated_group_controller.h" | 19 #include "mojo/public/cpp/bindings/associated_group_controller.h" |
19 #include "mojo/public/cpp/bindings/interface_endpoint_controller.h" | 20 #include "mojo/public/cpp/bindings/interface_endpoint_controller.h" |
20 #include "mojo/public/cpp/bindings/lib/validation_util.h" | 21 #include "mojo/public/cpp/bindings/lib/validation_util.h" |
21 #include "mojo/public/cpp/bindings/sync_call_restrictions.h" | 22 #include "mojo/public/cpp/bindings/sync_call_restrictions.h" |
22 | 23 |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 ScopedInterfaceEndpointHandle::PEER_CLOSED_BEFORE_ASSOCIATION) { | 354 ScopedInterfaceEndpointHandle::PEER_CLOSED_BEFORE_ASSOCIATION) { |
354 task_runner_->PostTask(FROM_HERE, | 355 task_runner_->PostTask(FROM_HERE, |
355 base::Bind(&InterfaceEndpointClient::NotifyError, | 356 base::Bind(&InterfaceEndpointClient::NotifyError, |
356 weak_ptr_factory_.GetWeakPtr(), | 357 weak_ptr_factory_.GetWeakPtr(), |
357 handle_.disconnect_reason())); | 358 handle_.disconnect_reason())); |
358 } | 359 } |
359 } | 360 } |
360 | 361 |
361 bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { | 362 bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
362 DCHECK_EQ(handle_.id(), message->interface_id()); | 363 DCHECK_EQ(handle_.id(), message->interface_id()); |
363 DCHECK(!encountered_error_); | 364 |
| 365 if (encountered_error_) { |
| 366 // This message is received after error has been encountered. For associated |
| 367 // interfaces, this means the remote side sends a |
| 368 // PeerAssociatedEndpointClosed event but continues to send more messages |
| 369 // for the same interface. Close the pipe because this shouldn't happen. |
| 370 DVLOG(1) << "A message is received for an interface after it has been " |
| 371 << "disconnected. Closing the pipe."; |
| 372 return false; |
| 373 } |
364 | 374 |
365 if (message->has_flag(Message::kFlagExpectsResponse)) { | 375 if (message->has_flag(Message::kFlagExpectsResponse)) { |
366 MessageReceiverWithStatus* responder = | 376 MessageReceiverWithStatus* responder = |
367 new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); | 377 new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); |
368 bool ok = false; | 378 bool ok = false; |
369 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { | 379 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { |
370 ok = control_message_handler_.AcceptWithResponder(message, responder); | 380 ok = control_message_handler_.AcceptWithResponder(message, responder); |
371 } else { | 381 } else { |
372 ok = incoming_receiver_->AcceptWithResponder(message, responder); | 382 ok = incoming_receiver_->AcceptWithResponder(message, responder); |
373 } | 383 } |
(...skipping 20 matching lines...) Expand all Loading... |
394 return responder->Accept(message); | 404 return responder->Accept(message); |
395 } else { | 405 } else { |
396 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) | 406 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) |
397 return control_message_handler_.Accept(message); | 407 return control_message_handler_.Accept(message); |
398 | 408 |
399 return incoming_receiver_->Accept(message); | 409 return incoming_receiver_->Accept(message); |
400 } | 410 } |
401 } | 411 } |
402 | 412 |
403 } // namespace mojo | 413 } // namespace mojo |
OLD | NEW |