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 bb5b777346b0ac9fed58efb2bbf4c5ad5def354e..9cade2d118c5b6c9db554f18a709a3095fff7c8b 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,14 @@ |
{%- macro alloc_params(parameters) %} |
{%- for param in parameters %} |
-{%- if param.kind|is_object_kind %} |
+{%- if param.kind|is_map_kind %} |
+mojo::Array<{{param.kind.key_kind|cpp_result_type}}> p{{loop.index}}_keys; |
+Deserialize_(params->{{param.name}}_keys.ptr, &p{{loop.index}}_keys); |
+mojo::Array<{{param.kind.value_kind|cpp_result_type}}> p{{loop.index}}_values; |
+Deserialize_(params->{{param.name}}_values.ptr, &p{{loop.index}}_values); |
+{{param.kind|cpp_result_type}} p{{loop.index}}(p{{loop.index}}_keys.Pass(), |
+ p{{loop.index}}_values.Pass()); |
+{%- elif param.kind|is_object_kind %} |
{{param.kind|cpp_result_type}} p{{loop.index}}; |
Deserialize_(params->{{param.name}}.ptr, &p{{loop.index}}); |
{% endif -%} |
@@ -33,12 +40,27 @@ params->{{param.name}} |
{%- endfor %} |
{%- endmacro %} |
+{%- macro mapping_prelude(parameters) -%} |
+{%- for param in parameters %} |
+{%- if param.kind|is_map_kind %} |
+ mojo::Array<{{param.kind.key_kind|cpp_result_type}}> in_{{param.name}}_keys; |
+ mojo::Array<{{param.kind.value_kind|cpp_result_type}}> in_{{param.name}}_values; |
+ in_{{param.name}}.DecomposeMapTo(&in_{{param.name}}_keys, |
+ &in_{{param.name}}_values); |
+{%- endif -%} |
+{%- endfor -%} |
+{%- endmacro %} |
+ |
+ |
{%- macro compute_payload_size(params_name, parameters) -%} |
size_t payload_size = |
mojo::internal::Align(sizeof({{params_name}})); |
{#--- Computes #} |
{%- for param in parameters %} |
-{%- if param.kind|is_object_kind %} |
+{%- if param.kind|is_map_kind %} |
+ payload_size += GetSerializedSize_(in_{{param.name}}_keys); |
+ payload_size += GetSerializedSize_(in_{{param.name}}_values); |
+{%- elif param.kind|is_object_kind %} |
payload_size += GetSerializedSize_(in_{{param.name}}); |
{%- endif %} |
{%- endfor %} |
@@ -55,14 +77,30 @@ params->{{param.name}} |
{%- if param.kind|is_any_array_kind %} |
mojo::SerializeArray_<{{param.kind|get_array_validate_params|indent(24)}}>( |
mojo::internal::Forward(in_{{param.name}}), builder.buffer(), ¶ms->{{param.name}}.ptr); |
+{%- elif param.kind|is_map_kind %} |
+ mojo::SerializeArray_<{{param.kind.key_kind|get_map_validate_params|indent(24)}}>( |
+ mojo::internal::Forward(in_{{param.name}}_keys), builder.buffer(), ¶ms->{{param.name}}_keys.ptr); |
+ mojo::SerializeArray_<{{param.kind.value_kind|get_map_validate_params|indent(24)}}>( |
+ mojo::internal::Forward(in_{{param.name}}_values), builder.buffer(), ¶ms->{{param.name}}_values.ptr); |
{%- else %} |
Serialize_(mojo::internal::Forward(in_{{param.name}}), builder.buffer(), ¶ms->{{param.name}}.ptr); |
{%- endif %} |
{%- if not param.kind|is_nullable_kind %} |
+{%- if param.kind|is_map_kind %} |
+ MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( |
+ !params->{{param.name}}_keys.ptr, |
+ mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
+ "null key array for {{param.name}} argument in {{params_description}}"); |
+ MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( |
+ !params->{{param.name}}_values.ptr, |
+ mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
+ "null key array for {{param.name}} argument in {{params_description}}"); |
+{%- else %} |
MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( |
!params->{{param.name}}.ptr, |
mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
"null {{param.name}} argument in {{params_description}}"); |
+{%- endif %} |
{%- endif %} |
{%- elif param.kind|is_any_handle_kind %} |
{%- if param.kind|is_interface_kind or |
@@ -138,6 +176,8 @@ bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( |
"%s.%s request"|format(interface.name, method.name) %} |
void {{proxy_name}}::{{method.name}}( |
{{interface_macros.declare_request_params("in_", method)}}) { |
+ {{mapping_prelude(method.parameters)}} |
+ |
{{compute_payload_size(params_name, method.parameters)}} |
{%- if method.response_parameters != None %} |
@@ -193,6 +233,8 @@ class {{class_name}}_{{method.name}}_ProxyToResponder |
}; |
void {{class_name}}_{{method.name}}_ProxyToResponder::Run( |
{{interface_macros.declare_params("in_", method.response_parameters)}}) const { |
+ {{mapping_prelude(method.response_parameters)}} |
+ |
{{compute_payload_size(params_name, method.response_parameters)}} |
mojo::internal::ResponseMessageBuilder builder( |
{{message_name}}, payload_size, request_id_); |