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 -%} |