| Index: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| index aef7e9d3d78ac3354f1183be91189099eb9fb8b1..2c87b642421040cdeaadf71414045314d5c92dcd 100644
|
| --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| @@ -5,7 +5,8 @@
|
| {%- set proxy_name = interface.name ~ "Proxy" %}
|
| {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
|
|
|
| -{%- macro alloc_params(struct, params, message, serialization_context) %}
|
| +{%- macro alloc_params(struct, params, message, error, create_error,
|
| + method_name, serialization_context) %}
|
| ({{params}})->DecodePointers();
|
| ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles());
|
| bool success = true;
|
| @@ -15,8 +16,11 @@
|
| {{struct.name}}DataView input_data_view({{params}},
|
| {{serialization_context}});
|
| {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
|
| - if (!success)
|
| + if (!success) {
|
| + *{{error}} = {{create_error}}("{{class_name}}", "{{method_name}}",
|
| + {{message}});
|
| return false;
|
| + }
|
| {%- endmacro %}
|
|
|
| {%- macro pass_params(parameters) %}
|
| @@ -82,7 +86,7 @@ class {{class_name}}_{{method.name}}_HandleSyncResponse
|
| {%- endfor %} {
|
| DCHECK(!*result_);
|
| }
|
| - bool Accept(mojo::Message* message) override;
|
| + bool Accept(mojo::Message* message, mojo::Error* error) override;
|
| private:
|
| mojo::internal::SerializationContext serialization_context_;
|
| bool* result_;
|
| @@ -92,12 +96,13 @@ class {{class_name}}_{{method.name}}_HandleSyncResponse
|
| DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
|
| };
|
| bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
|
| - mojo::Message* message) {
|
| + mojo::Message* message, mojo::Error* error) {
|
| internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
|
| reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
|
| message->mutable_payload());
|
|
|
| - {{alloc_params(method.response_param_struct, "params", "message",
|
| + {{alloc_params(method.response_param_struct, "params", "message", "error",
|
| + "mojo::Error::ForBadResponse", method.name,
|
| "&serialization_context_")}}
|
|
|
| {%- for param in method.response_parameters %}
|
| @@ -120,19 +125,20 @@ class {{class_name}}_{{method.name}}_ForwardToCallback
|
| scoped_refptr<mojo::internal::MultiplexRouter> router)
|
| : callback_(callback), serialization_context_(std::move(router)) {
|
| }
|
| - bool Accept(mojo::Message* message) override;
|
| + bool Accept(mojo::Message* message, mojo::Error* error) override;
|
| private:
|
| {{class_name}}::{{method.name}}Callback callback_;
|
| mojo::internal::SerializationContext serialization_context_;
|
| DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
|
| };
|
| bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
|
| - mojo::Message* message) {
|
| + mojo::Message* message, mojo::Error* error) {
|
| internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
|
| reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
|
| message->mutable_payload());
|
|
|
| - {{alloc_params(method.response_param_struct, "params", "message",
|
| + {{alloc_params(method.response_param_struct, "params", "message", "error",
|
| + "mojo::Error::ForBadResponse", method.name,
|
| "&serialization_context_")}}
|
| callback_.Run({{pass_params(method.response_parameters)}});
|
| return true;
|
| @@ -171,8 +177,11 @@ bool {{proxy_name}}::{{method.name}}(
|
| {%- for param in method.response_parameters -%}
|
| , param_{{param.name}}
|
| {%- endfor %});
|
| - if (!receiver_->AcceptWithResponder(builder.message(), responder))
|
| + mojo::Error send_error;
|
| + if (!receiver_->AcceptWithResponder(builder.message(), responder,
|
| + &send_error)) {
|
| delete responder;
|
| + }
|
| return result;
|
| }
|
| {%- endif %}
|
| @@ -193,11 +202,16 @@ void {{proxy_name}}::{{method.name}}(
|
|
|
| {%- if method.response_parameters != None %}
|
| mojo::MessageReceiver* responder =
|
| - new {{class_name}}_{{method.name}}_ForwardToCallback(callback, serialization_context_.router);
|
| - if (!receiver_->AcceptWithResponder(builder.message(), responder))
|
| + new {{class_name}}_{{method.name}}_ForwardToCallback(
|
| + callback, serialization_context_.router);
|
| + mojo::Error send_error;
|
| + if (!receiver_->AcceptWithResponder(builder.message(), responder,
|
| + &send_error)) {
|
| delete responder;
|
| + }
|
| {%- else %}
|
| - bool ok = receiver_->Accept(builder.message());
|
| + mojo::Error send_response_error;
|
| + bool ok = receiver_->Accept(builder.message(), &send_response_error);
|
| // This return value may be ignored as !ok implies the Connector has
|
| // encountered an error, which will be visible through other means.
|
| ALLOW_UNUSED_LOCAL(ok);
|
| @@ -261,7 +275,8 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
|
| is_sync_ ? mojo::internal::kMessageIsSync : 0);
|
| {{build_message(response_params_struct, "in_%s", params_description,
|
| "&serialization_context_")}}
|
| - bool ok = responder_->Accept(builder.message());
|
| + mojo::Error send_response_error;
|
| + bool ok = responder_->Accept(builder.message(), &send_response_error);
|
| ALLOW_UNUSED_LOCAL(ok);
|
| // TODO(darin): !ok returned here indicates a malformed message, and that may
|
| // be good reason to close the connection. However, we don't have a way to do
|
| @@ -281,9 +296,9 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
|
|
|
| {#--- Stub definition #}
|
|
|
| -bool {{class_name}}Stub::Accept(mojo::Message* message) {
|
| +bool {{class_name}}Stub::Accept(mojo::Message* message, mojo::Error* error) {
|
| if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
|
| - return control_message_handler_.Accept(message);
|
| + return control_message_handler_.Accept(message, error);
|
| {%- if interface.methods %}
|
| switch (message->header()->name) {
|
| {%- for method in interface.methods %}
|
| @@ -293,7 +308,8 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
|
| reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
|
| message->mutable_payload());
|
|
|
| - {{alloc_params(method.param_struct, "params", "message",
|
| + {{alloc_params(method.param_struct, "params", "message", "error",
|
| + "mojo::Error::ForBadRequest", method.name,
|
| "&serialization_context_")|indent(4)}}
|
| // A null |sink_| means no implementation was bound.
|
| assert(sink_);
|
| @@ -311,9 +327,13 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
|
| }
|
|
|
| bool {{class_name}}Stub::AcceptWithResponder(
|
| - mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
|
| - if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
|
| - return control_message_handler_.AcceptWithResponder(message, responder);
|
| + mojo::Message* message,
|
| + mojo::MessageReceiverWithStatus* responder,
|
| + mojo::Error* error) {
|
| + if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
|
| + return control_message_handler_.AcceptWithResponder(message, responder,
|
| + error);
|
| + }
|
| {%- if interface.methods %}
|
| switch (message->header()->name) {
|
| {%- for method in interface.methods %}
|
| @@ -323,7 +343,8 @@ bool {{class_name}}Stub::AcceptWithResponder(
|
| reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
|
| message->mutable_payload());
|
|
|
| - {{alloc_params(method.param_struct, "params", "message",
|
| + {{alloc_params(method.param_struct, "params", "message", "error",
|
| + "mojo::Error::ForBadRequest", method.name,
|
| "&serialization_context_")|indent(4)}}
|
| {{class_name}}::{{method.name}}Callback::Runnable* runnable =
|
| new {{class_name}}_{{method.name}}_ProxyToResponder(
|
| @@ -354,30 +375,41 @@ bool {{class_name}}Stub::AcceptWithResponder(
|
| mojo::MessageReceiver* sink) : MessageFilter(sink) {
|
| }
|
|
|
| -bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
|
| +bool {{class_name}}RequestValidator::Accept(mojo::Message* message,
|
| + mojo::Error* error) {
|
| assert(sink_);
|
|
|
| if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
|
| - if (!mojo::internal::ValidateControlRequest(message))
|
| + if (!mojo::internal::ValidateControlRequest(message)) {
|
| + *error = mojo::Error::ForBadControlMessage("{{class_name}}", message);
|
| return false;
|
| - return sink_->Accept(message);
|
| + }
|
| + return sink_->Accept(message, error);
|
| }
|
|
|
| switch (message->header()->name) {
|
| {%- for method in interface.methods %}
|
| case internal::k{{class_name}}_{{method.name}}_Name: {
|
| {%- if method.response_parameters != None %}
|
| - if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message))
|
| + if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message)) {
|
| + *error = mojo::Error::ForBadRequest(
|
| + "{{class_name}}", "{{method.name}}", message);
|
| return false;
|
| + }
|
| {%- else %}
|
| - if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message))
|
| + if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message)) {
|
| + *error = mojo::Error::ForBadRequest(
|
| + "{{class_name}}", "{{method.name}}", message);
|
| return false;
|
| + }
|
| {%- endif %}
|
| if (!mojo::internal::ValidateMessagePayload<
|
| internal::{{class_name}}_{{method.name}}_Params_Data>(message)) {
|
| + *error = mojo::Error::ForBadRequest(
|
| + "{{class_name}}", "{{method.name}}", message);
|
| return false;
|
| }
|
| - return sink_->Accept(message);
|
| + return sink_->Accept(message, error);
|
| }
|
| {%- endfor %}
|
| default:
|
| @@ -396,25 +428,33 @@ bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
|
| mojo::MessageReceiver* sink) : MessageFilter(sink) {
|
| }
|
|
|
| -bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
|
| +bool {{class_name}}ResponseValidator::Accept(mojo::Message* message,
|
| + mojo::Error* error) {
|
| assert(sink_);
|
|
|
| if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
|
| - if (!mojo::internal::ValidateControlResponse(message))
|
| + if (!mojo::internal::ValidateControlResponse(message)) {
|
| + *error = mojo::Error::ForBadControlMessage("{{class_name}}", message);
|
| return false;
|
| - return sink_->Accept(message);
|
| + }
|
| + return sink_->Accept(message, error);
|
| }
|
|
|
| - if (!mojo::internal::ValidateMessageIsResponse(message))
|
| + if (!mojo::internal::ValidateMessageIsResponse(message)) {
|
| + *error = mojo::Error::ForUnexpectedRequest("{{class_name}}", message);
|
| return false;
|
| + }
|
| switch (message->header()->name) {
|
| {%- for method in interface.methods if method.response_parameters != None %}
|
| case internal::k{{class_name}}_{{method.name}}_Name: {
|
| if (!mojo::internal::ValidateMessagePayload<
|
| - internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(message)) {
|
| + internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
|
| + message)) {
|
| + *error = mojo::Error::ForBadResponse(
|
| + "{{class_name}}", "{{method.name}}", message);
|
| return false;
|
| }
|
| - return sink_->Accept(message);
|
| + return sink_->Accept(message, error);
|
| }
|
| {%- endfor %}
|
| default:
|
| @@ -424,6 +464,7 @@ bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
|
| // Unrecognized message.
|
| ReportValidationError(
|
| mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
|
| + *error = mojo::Error::ForUnexpectedResponse("{{class_name}}", message);
|
| return false;
|
| }
|
| {%- endif -%}
|
|
|