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..8875e02a072f0d5fd9e08225f111ff22aee4d4d5 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()); |
@@ -149,6 +153,7 @@ InterfaceEndpointClient::InterfaceEndpointClient( |
// TODO(yzshen): the way to use validator (or message filter in general) |
// directly is a little awkward. |
filters_.Append(std::move(payload_validator)); |
+ filters_.Append(base::MakeUnique<internal::ControlMessageValidator>()); |
yzshen1
2016/08/29 23:24:58
I took a different approach for pipe-control messa
Sam McNally
2016/08/30 03:05:51
Done.
|
controller_ = handle_.group_controller()->AttachEndpointClient( |
handle_, this, task_runner_); |
@@ -275,6 +280,8 @@ void InterfaceEndpointClient::NotifyError() { |
// longer. |
async_responders_.clear(); |
+ control_message_proxy_.OnConnectionError(); |
+ |
if (!error_handler_.is_null()) |
error_handler_.Run(); |
} |
@@ -284,12 +291,19 @@ bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
DCHECK(!encountered_error_); |
if (message->has_flag(Message::kFlagExpectsResponse)) { |
- if (!incoming_receiver_) |
+ if (!incoming_receiver_ && |
yzshen1
2016/08/29 23:24:58
nit: maybe we could remove this check and let it c
Sam McNally
2016/08/30 03:05:51
Done. This should never happen because validation
|
+ !mojo::internal::ControlMessageHandler::IsControlMessage(message)) { |
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,6 +326,9 @@ bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) { |
async_responders_.erase(it); |
return responder->Accept(message); |
} else { |
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) |
+ return control_message_handler_.Accept(message); |
+ |
if (!incoming_receiver_) |
return false; |