Chromium Code Reviews| 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; |