Index: mojo/public/cpp/bindings/lib/interface_endpoint_client.cc |
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc |
index a79316c0b8232f38c94048461c5276504849070d..0f15398545073e92465b29a7bf217756288238a9 100644 |
--- a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc |
+++ b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc |
@@ -17,6 +17,7 @@ |
#include "mojo/public/cpp/bindings/associated_group.h" |
#include "mojo/public/cpp/bindings/associated_group_controller.h" |
#include "mojo/public/cpp/bindings/interface_endpoint_controller.h" |
+#include "mojo/public/cpp/bindings/lib/validation_util.h" |
#include "mojo/public/cpp/bindings/sync_call_restrictions.h" |
namespace mojo { |
@@ -134,7 +135,8 @@ InterfaceEndpointClient::InterfaceEndpointClient( |
MessageReceiverWithResponderStatus* receiver, |
std::unique_ptr<MessageReceiver> payload_validator, |
bool expect_sync_requests, |
- scoped_refptr<base::SingleThreadTaskRunner> runner) |
+ scoped_refptr<base::SingleThreadTaskRunner> runner, |
+ uint32_t interface_version) |
: handle_(std::move(handle)), |
incoming_receiver_(receiver), |
thunk_(this), |
@@ -142,6 +144,8 @@ InterfaceEndpointClient::InterfaceEndpointClient( |
next_request_id_(1), |
encountered_error_(false), |
task_runner_(std::move(runner)), |
+ control_message_proxy_(this), |
+ control_message_handler_(interface_version), |
weak_ptr_factory_(this) { |
DCHECK(handle_.is_valid()); |
DCHECK(handle_.is_local()); |
@@ -275,6 +279,8 @@ void InterfaceEndpointClient::NotifyError() { |
// longer. |
async_responders_.clear(); |
+ control_message_proxy_.OnConnectionError(); |
+ |
if (!error_handler_.is_null()) |
error_handler_.Run(); |
} |
@@ -284,12 +290,14 @@ bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
DCHECK(!encountered_error_); |
if (message->has_flag(Message::kFlagExpectsResponse)) { |
- if (!incoming_receiver_) |
- return false; |
- |
MessageReceiverWithStatus* responder = |
new ResponderThunk(weak_ptr_factory_.GetWeakPtr(), task_runner_); |
- bool ok = incoming_receiver_->AcceptWithResponder(message, responder); |
+ bool ok = false; |
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { |
+ ok = control_message_handler_.AcceptWithResponder(message, responder); |
+ } else { |
+ ok = incoming_receiver_->AcceptWithResponder(message, responder); |
+ } |
if (!ok) |
delete responder; |
return ok; |
@@ -312,8 +320,8 @@ bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
async_responders_.erase(it); |
return responder->Accept(message); |
} else { |
- if (!incoming_receiver_) |
- return false; |
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) |
+ return control_message_handler_.Accept(message); |
return incoming_receiver_->Accept(message); |
} |