Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(693)

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

Issue 1701423002: Mojo C++ bindings: support sync methods - part 1. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 edf2a0a5323ed16f7e68feb7c0e1e31acf5922b5..1031ba665bfb1bce1d63f65412a40384de1be7d9 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -26,8 +26,8 @@ p_{{param.name}}
{%- endfor %}
{%- endmacro %}
-{%- macro build_message(struct, struct_display_name) -%}
- {{struct_macros.serialize(struct, struct_display_name, "in_%s", "params", "builder.buffer()")}}
+{%- macro build_message(struct, input_pattern, struct_display_name) -%}
+ {{struct_macros.serialize(struct, struct_display_name, input_pattern, "params", "builder.buffer()")}}
params->EncodePointersAndHandles(builder.message()->mutable_handles());
{%- endmacro %}
@@ -47,6 +47,51 @@ MOJO_STATIC_CONST_MEMBER_DEFINITION const {{constant.kind|cpp_pod_type}} {{inter
{#--- ForwardToCallback definition #}
{%- for method in interface.methods -%}
{%- if method.response_parameters != None %}
+{%- if method.sync %}
+class {{class_name}}_{{method.name}}_HandleSyncResponse
+ : public mojo::MessageReceiver {
+ public:
+ {{class_name}}_{{method.name}}_HandleSyncResponse(
+ scoped_refptr<mojo::internal::MultiplexRouter> router, bool* result
+{%- for param in method.response_parameters -%}
+ , {{param.kind|cpp_wrapper_type}}* out_{{param.name}}
+{%- endfor %})
+ : serialization_context_(std::move(router)), result_(result)
+{%- for param in method.response_parameters -%}
+ , out_{{param.name}}_(out_{{param.name}})
+{%- endfor %} {
+ DCHECK(!*result_);
+ }
+ bool Accept(mojo::Message* message) override;
+ private:
+ mojo::internal::SerializationContext serialization_context_;
+ bool* result_;
+{%- for param in method.response_parameters %}
+ {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_;
+{%- endfor -%}
+ DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
+};
+bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
+ mojo::Message* message) {
+ internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
+ reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
+ message->mutable_payload());
+
+ params->DecodePointersAndHandles(message->mutable_handles());
+ {{alloc_params(method.response_param_struct, "&serialization_context_")}}
+
+{%- for param in method.response_parameters %}
+{%- if param.kind|is_move_only_kind %}
+ *out_{{param.name}}_ = std::move(p_{{param.name}});
+{%- else %}
+ *out_{{param.name}}_ = p_{{param.name}};
+{%- endif %}
+{%- endfor %}
+ *result_ = true;
+ return true;
+}
+{%- endif %}
+
class {{class_name}}_{{method.name}}_ForwardToCallback
: public mojo::MessageReceiver {
public:
@@ -59,7 +104,7 @@ class {{class_name}}_{{method.name}}_ForwardToCallback
private:
{{class_name}}::{{method.name}}Callback callback_;
mojo::internal::SerializationContext serialization_context_;
- MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
+ DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
};
bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
mojo::Message* message) {
@@ -87,6 +132,29 @@ bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
{%- set params_struct = method.param_struct %}
{%- set params_description =
"%s.%s request"|format(interface.name, method.name) %}
+{%- if method.sync %}
+bool {{proxy_name}}::{{method.name}}(
+ {{interface_macros.declare_sync_method_params("param_", method)}}) {
+ {{struct_macros.get_serialized_size(params_struct, "param_%s")}}
+
+ mojo::internal::RequestMessageBuilder builder({{message_name}}, size,
+ mojo::internal::kMessageIsSync);
+
+ {{build_message(params_struct, "param_%s", params_description)}}
+
+ bool result = false;
+ mojo::MessageReceiver* responder =
+ new {{class_name}}_{{method.name}}_HandleSyncResponse(
+ serialization_context_.router, &result
+{%- for param in method.response_parameters -%}
+ , param_{{param.name}}
+{%- endfor %});
+ if (!receiver_->AcceptWithResponder(builder.message(), responder))
+ delete responder;
+ return result;
+}
+{%- endif %}
+
void {{proxy_name}}::{{method.name}}(
{{interface_macros.declare_request_params("in_", method)}}) {
{{struct_macros.get_serialized_size(params_struct, "in_%s")}}
@@ -97,7 +165,7 @@ void {{proxy_name}}::{{method.name}}(
mojo::internal::MessageBuilder builder({{message_name}}, size);
{%- endif %}
- {{build_message(params_struct, params_description)}}
+ {{build_message(params_struct, "in_%s", params_description)}}
{%- if method.response_parameters != None %}
mojo::MessageReceiver* responder =
@@ -138,8 +206,10 @@ class {{class_name}}_{{method.name}}_ProxyToResponder
{{class_name}}_{{method.name}}_ProxyToResponder(
uint64_t request_id,
+ bool is_sync,
mojo::MessageReceiverWithStatus* responder)
: request_id_(request_id),
+ is_sync_(is_sync),
responder_(responder) {
}
@@ -147,15 +217,17 @@ class {{class_name}}_{{method.name}}_ProxyToResponder
private:
uint64_t request_id_;
+ bool is_sync_;
mutable mojo::MessageReceiverWithStatus* responder_;
- MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
+ DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
};
void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
{{interface_macros.declare_params("in_", method.response_parameters)}}) const {
{{struct_macros.get_serialized_size(response_params_struct, "in_%s")}}
mojo::internal::ResponseMessageBuilder builder(
- {{message_name}}, size, request_id_);
- {{build_message(response_params_struct, params_description)}}
+ {{message_name}}, size, request_id_,
+ is_sync_ ? mojo::internal::kMessageIsSync : 0);
+ {{build_message(response_params_struct, "in_%s", params_description)}}
bool ok = responder_->Accept(builder.message());
MOJO_ALLOW_UNUSED_LOCAL(ok);
// TODO(darin): !ok returned here indicates a malformed message, and that may
@@ -222,7 +294,9 @@ bool {{class_name}}Stub::AcceptWithResponder(
{{alloc_params(method.param_struct, "&serialization_context_")|indent(4)}}
{{class_name}}::{{method.name}}Callback::Runnable* runnable =
new {{class_name}}_{{method.name}}_ProxyToResponder(
- message->request_id(), responder);
+ message->request_id(),
+ message->has_flag(mojo::internal::kMessageIsSync),
+ responder);
{{class_name}}::{{method.name}}Callback callback(runnable);
// A null |sink_| means no implementation was bound.
assert(sink_);

Powered by Google App Engine
This is Rietveld 408576698