diff options
author | Hidehiko Abe <hidehiko@google.com> | 2018-04-23 20:01:13 -0700 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-04-23 20:01:13 -0700 |
commit | ed7128dca79cff94e99465e3c1bc31d91d83c76d (patch) | |
tree | bd2d04362f66c36d4279f7a9735ba21ea3a2a021 /mojo/public/tools/bindings/generators/java_templates | |
parent | d6187ab7d79d95d101c2ecb83aa98c05bcdcccd1 (diff) | |
parent | 0ab20ac2283987e63b0e7c1318db2a5cf7c668d2 (diff) | |
download | libchrome-ed7128dca79cff94e99465e3c1bc31d91d83c76d.tar.gz |
Migrate libmojo repository into libchrome, part 2. am: b268b43ac6
am: 0ab20ac228
Change-Id: I1b1afe0c902f1d122b100f5bf56d1df4a94eb090
Diffstat (limited to 'mojo/public/tools/bindings/generators/java_templates')
11 files changed, 806 insertions, 0 deletions
diff --git a/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl new file mode 100644 index 0000000000..db193e29a3 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl @@ -0,0 +1,3 @@ +{% macro constant_def(constant) %} +public static final {{constant.kind|java_type}} {{constant|name}} = {{constant|constant_value}}; +{% endmacro %} diff --git a/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl new file mode 100644 index 0000000000..0a4e29956b --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl @@ -0,0 +1,12 @@ +{% from "constant_definition.tmpl" import constant_def %} +{% include "header.java.tmpl" %} + +public final class {{main_entity}} { +{% for constant in constants %} + + {{constant_def(constant)|indent(4)}} +{% endfor %} + + private {{main_entity}}() {} + +} diff --git a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl new file mode 100644 index 0000000000..4c0823cce6 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl @@ -0,0 +1,418 @@ +{%- from "constant_definition.tmpl" import constant_def %} +{%- from "enum_definition.tmpl" import enum_def %} + +{%- macro equality(kind, v1, v2, ne=False) -%} +{%- if kind|is_reference_kind -%} +{%- if kind|is_array_kind -%} +{%- if kind.kind|is_reference_kind -%} +{%- if ne %}!{%- endif %}java.util.Arrays.deepEquals({{v1}}, {{v2}}) +{%- else -%} +{%- if ne %}!{%- endif %}java.util.Arrays.equals({{v1}}, {{v2}}) +{%- endif -%} +{%- else -%} +{%- if ne %}!{%- endif %}org.chromium.mojo.bindings.BindingsHelper.equals({{v1}}, {{v2}}) +{%- endif -%} +{%- else -%} +{{v1}} {%- if ne %}!={%- else %}=={%- endif %} {{v2}} +{%- endif -%} +{%- endmacro -%} + +{%- macro hash(kind, v) -%} +{%- if kind|is_array_kind -%} +{%- if kind.kind|is_reference_kind -%} +java.util.Arrays.deepHashCode({{v}}) +{%- else -%} +java.util.Arrays.hashCode({{v}}) +{%- endif -%} +{%- else -%} +org.chromium.mojo.bindings.BindingsHelper.hashCode({{v}}) +{%- endif -%} +{%- endmacro -%} + +{%- macro array_element_size(kind) -%} +{%- if kind|is_union_kind %} +org.chromium.mojo.bindings.BindingsHelper.UNION_SIZE +{%- else -%} +org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE +{%- endif -%} +{%- endmacro -%} + +{%- macro encode(variable, kind, offset, bit, level=0, check_for_null=True) %} +{%- if kind|is_pointer_array_kind or kind|is_union_array_kind %} +{%- set sub_kind = kind.kind %} +{%- if check_for_null %} +if ({{variable}} == null) { + encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}}); +} else { +{%- else %} +{ +{%- endif %} +{%- if kind|is_pointer_array_kind %} +{%- set encodePointer = 'encodePointerArray' %} +{%- else %} +{%- set encodePointer = 'encodeUnionArray' %} +{%- endif %} + org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.{{encodePointer}}({{variable}}.length, {{offset}}, {{kind|array_expected_length}}); + for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) { + {{encode(variable~'[i'~level~']', sub_kind, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + ' ~ array_element_size(sub_kind) ~ ' * i'~level, 0, level+1)|indent(8)}} + } +} +{%- elif kind|is_map_kind %} +if ({{variable}} == null) { + encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}}); +} else { + org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.encoderForMap({{offset}}); + int size{{level}} = {{variable}}.size(); + {{kind.key_kind|java_type}}[] keys{{level}} = {{kind.key_kind|array|new_array('size'~level)}}; + {{kind.value_kind|java_type}}[] values{{level}} = {{kind.value_kind|array|new_array('size'~level)}}; + int index{{level}} = 0; + for (java.util.Map.Entry<{{kind.key_kind|java_type(true)}}, {{kind.value_kind|java_type(true)}}> entry{{level}} : {{variable}}.entrySet()) { + keys{{level}}[index{{level}}] = entry{{level}}.getKey(); + values{{level}}[index{{level}}] = entry{{level}}.getValue(); + ++index{{level}}; + } + {{encode('keys'~level, kind.key_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0, level+1, False)|indent(4)}} + {{encode('values'~level, kind.value_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE', 0, level+1, False)|indent(4)}} +} +{%- else %} +encoder{{level}}.{{kind|encode_method(variable, offset, bit)}}; +{%- endif %} +{%- endmacro %} + +{%- macro decode(variable, kind, offset, bit, level=0) %} +{%- if kind|is_struct_kind or + kind|is_pointer_array_kind or + kind|is_union_array_kind or + kind|is_map_kind %} +org.chromium.mojo.bindings.Decoder decoder{{level+1}} = decoder{{level}}.readPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}}); +{%- if kind|is_struct_kind %} +{{variable}} = {{kind|java_type}}.decode(decoder{{level+1}}); +{%- else %}{# kind|is_pointer_array_kind or is_map_kind #} +{%- if kind|is_nullable_kind %} +if (decoder{{level+1}} == null) { + {{variable}} = null; +} else { +{%- else %} +{ +{%- endif %} +{%- if kind|is_map_kind %} + decoder{{level+1}}.readDataHeaderForMap(); + {{kind.key_kind|java_type}}[] keys{{level}}; + {{kind.value_kind|java_type}}[] values{{level}}; + { + {{decode('keys'~level, kind.key_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0, level+1)|indent(8)}} + } + { + {{decode('values'~level, kind.value_kind|array('keys'~level~'.length'), 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE', 0, level+1)|indent(8)}} + } + {{variable}} = new java.util.HashMap<{{kind.key_kind|java_type(true)}}, {{kind.value_kind|java_type(true)}}>(); + for (int index{{level}} = 0; index{{level}} < keys{{level}}.length; ++index{{level}}) { + {{variable}}.put(keys{{level}}[index{{level}}], values{{level}}[index{{level}}]); + } +{%- else %} + org.chromium.mojo.bindings.DataHeader si{{level+1}} = decoder{{level+1}}.readDataHeaderForPointerArray({{kind|array_expected_length}}); + {{variable}} = {{kind|new_array('si'~(level+1)~'.elementsOrVersion')}}; + for (int i{{level+1}} = 0; i{{level+1}} < si{{level+1}}.elementsOrVersion; ++i{{level+1}}) { + {{decode(variable~'[i'~(level+1)~']', kind.kind, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + ' ~ array_element_size(kind.kind) ~' * i'~(level+1), 0, level+1)|indent(8)}} + } +{%- endif %} +} +{%- endif %} +{%- elif kind|is_union_kind %} +{{variable}} = {{kind|java_type}}.decode(decoder{{level}}, {{offset}}); +{%- else %} +{{variable}} = decoder{{level}}.{{kind|decode_method(offset, bit)}}; +{%- if kind|is_array_kind and kind.kind|is_enum_kind %} +{%- if kind|is_nullable_kind %} +if ({{variable}} != null) { +{%- else %} +{ +{%- endif %} + for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) { + {{kind.kind|java_class_for_enum}}.validate({{variable}}[i{{level}}]); + } +} +{%- elif kind|is_enum_kind %} + {{kind|java_class_for_enum}}.validate({{variable}}); +{%- endif %} +{%- endif %} +{%- endmacro %} + +{%- macro struct_def(struct, inner_class=False) %} +{{'static' if inner_class else 'public'}} final class {{struct|name}} extends org.chromium.mojo.bindings.Struct { + + private static final int STRUCT_SIZE = {{struct.versions[-1].num_bytes}}; + private static final org.chromium.mojo.bindings.DataHeader[] VERSION_ARRAY = new org.chromium.mojo.bindings.DataHeader[] { +{%- for version in struct.versions -%} + new org.chromium.mojo.bindings.DataHeader({{version.num_bytes}}, {{version.version}}){%- if not loop.last %}, {%- endif -%} +{%- endfor -%} + }; + private static final org.chromium.mojo.bindings.DataHeader DEFAULT_STRUCT_INFO = VERSION_ARRAY[{{struct.versions|length - 1}}]; +{%- for constant in struct.constants %} + + {{constant_def(constant)|indent(4)}} +{%- endfor %} +{%- for enum in struct.enums %} + + {{enum_def(enum, false)|indent(4)}} +{%- endfor %} +{%- if struct.fields %} + +{%- for field in struct.fields %} + public {{field.kind|java_type}} {{field|name}}; +{%- endfor %} +{%- endif %} + + private {{struct|name}}(int version) { + super(STRUCT_SIZE, version); +{%- for field in struct.fields %} +{%- if field.default %} + {{field|name}} = {{field|default_value}}; +{%- elif field.kind|is_any_handle_kind %} + {{field|name}} = org.chromium.mojo.system.InvalidHandle.INSTANCE; +{%- endif %} +{%- endfor %} + } + + public {{struct|name}}() { + this({{struct.versions[-1].version}}); + } + + public static {{struct|name}} deserialize(org.chromium.mojo.bindings.Message message) { + return decode(new org.chromium.mojo.bindings.Decoder(message)); + } + + /** + * Similar to the method above, but deserializes from a |ByteBuffer| instance. + * + * @throws org.chromium.mojo.bindings.DeserializationException on deserialization failure. + */ + public static {{struct|name}} deserialize(java.nio.ByteBuffer data) { + if (data == null) + return null; + + return deserialize(new org.chromium.mojo.bindings.Message( + data, new java.util.ArrayList<org.chromium.mojo.system.Handle>())); + } + + @SuppressWarnings("unchecked") + public static {{struct|name}} decode(org.chromium.mojo.bindings.Decoder decoder0) { + if (decoder0 == null) { + return null; + } + decoder0.increaseStackDepth(); + {{struct|name}} result; + try { + org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY); + result = new {{struct|name}}(mainDataHeader.elementsOrVersion); +{%- for byte in struct.bytes %} +{%- for packed_field in byte.packed_fields %} + if (mainDataHeader.elementsOrVersion >= {{packed_field.min_version}}) { + {{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(16)}} + } +{%- endfor %} +{%- endfor %} + } finally { + decoder0.decreaseStackDepth(); + } + return result; + } + + @SuppressWarnings("unchecked") + @Override + protected final void encode(org.chromium.mojo.bindings.Encoder encoder) { +{%- if not struct.bytes %} + encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO); +{%- else %} + org.chromium.mojo.bindings.Encoder encoder0 = encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO); +{%- endif %} +{%- for byte in struct.bytes %} +{%- for packed_field in byte.packed_fields %} + {{encode(packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(8)}} +{%- endfor %} +{%- endfor %} + } + + /** + * @see Object#equals(Object) + */ + @Override + public boolean equals(Object object) { + if (object == this) + return true; + if (object == null) + return false; + if (getClass() != object.getClass()) + return false; +{%- if struct.fields|length %} + {{struct|name}} other = ({{struct|name}}) object; +{%- for field in struct.fields %} + if ({{equality(field.kind, 'this.'~field|name, 'other.'~field|name, True)}}) + return false; +{%- endfor %} +{%- endif %} + return true; + } + + /** + * @see Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = prime + getClass().hashCode(); +{%- for field in struct.fields %} + result = prime * result + {{hash(field.kind, field|name)}}; +{%- endfor %} + return result; + } +} +{%- endmacro %} + + +{%- macro union_def(union) %} +public final class {{union|name}} extends org.chromium.mojo.bindings.Union { + + public static final class Tag { +{%- for field in union.fields %} + public static final int {{field|ucc}} = {{loop.index0}}; +{%- endfor %} + }; + + private int mTag_ = -1; +{%- for field in union.fields %} + private {{field.kind|java_type}} m{{field|ucc}}; +{%- endfor %} + + public int which() { + return mTag_; + } + + public boolean isUnknown() { + return mTag_ == -1; + } +{%- for field in union.fields %} + + // TODO(rockot): Fix the findbugs error and remove this suppression. + // See http://crbug.com/570386. + @SuppressFBWarnings("EI_EXPOSE_REP2") + public void set{{field|ucc}}({{field.kind|java_type}} {{field|name}}) { + mTag_ = Tag.{{field|ucc}}; + m{{field|ucc}} = {{field|name}}; + } + + // TODO(rockot): Fix the findbugs error and remove this suppression. + // See http://crbug.com/570386. + @SuppressFBWarnings("EI_EXPOSE_REP") + public {{field.kind|java_type}} get{{field|ucc}}() { + assert mTag_ == Tag.{{field|ucc}}; + return m{{field|ucc}}; + } +{%- endfor %} + + + @Override + protected final void encode(org.chromium.mojo.bindings.Encoder encoder0, int offset) { + encoder0.encode(org.chromium.mojo.bindings.BindingsHelper.UNION_SIZE, offset); + encoder0.encode(mTag_, offset + 4); + switch (mTag_) { +{%- for field in union.fields %} + case Tag.{{field|ucc}}: { +{%- if field.kind|is_union_kind %} + if (m{{field|ucc}} == null) { + encoder0.encodeNullPointer(offset + 8, {{field.kind|is_nullable_kind|java_true_false}}); + } else { + m{{field|ucc}}.encode(encoder0.encoderForUnionPointer(offset + 8), 0); + } +{%- else %} + {{encode('m' ~ field|ucc, field.kind, 'offset + 8', 0)|indent(16)}} +{%- endif %} + break; + } +{%- endfor %} + default: { + break; + } + } + } + + public static {{union|name}} deserialize(org.chromium.mojo.bindings.Message message) { + return decode(new org.chromium.mojo.bindings.Decoder(message).decoderForSerializedUnion(), 0); + } + + public static final {{union|name}} decode(org.chromium.mojo.bindings.Decoder decoder0, int offset) { + org.chromium.mojo.bindings.DataHeader dataHeader = decoder0.readDataHeaderForUnion(offset); + if (dataHeader.size == 0) { + return null; + } + {{union|name}} result = new {{union|name}}(); + switch (dataHeader.elementsOrVersion) { +{%- for field in union.fields %} + case Tag.{{field|ucc}}: { +{%- if field.kind|is_union_kind %} + org.chromium.mojo.bindings.Decoder decoder1 = decoder0.readPointer(offset + org.chromium.mojo.bindings.DataHeader.HEADER_SIZE, {{field.kind|is_nullable_kind|java_true_false}}); + if (decoder1 != null) { + result.m{{field|ucc}} = {{field.kind|name}}.decode(decoder1, 0); + } +{%- else %} + {{decode('result.m'~field|ucc, field.kind, 'offset + org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0)|indent(16)}} +{%- endif %} + result.mTag_ = Tag.{{field|ucc}}; + break; + } +{%- endfor %} + default: { + break; + } + } + return result; + } + + /** + * @see Object#equals(Object) + */ + @Override + public boolean equals(Object object) { + if (object == this) + return true; + if (object == null) + return false; + if (getClass() != object.getClass()) + return false; + {{union|name}} other = ({{union|name}}) object; + if (mTag_ != other.mTag_) + return false; + switch (mTag_) { +{%- for field in union.fields %} + case Tag.{{field|ucc}}: + return {{equality(field.kind, 'm'~field|ucc, 'other.m'~field|ucc)}}; +{%- endfor %} + default: + break; + } + return false; + } + + /** + * @see Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = prime + getClass().hashCode(); + result = prime * result + org.chromium.mojo.bindings.BindingsHelper.hashCode(mTag_); + switch (mTag_) { +{%- for field in union.fields %} + case Tag.{{field|ucc}}: { + result = prime * result + {{hash(field.kind, 'm'~field|ucc)}}; + break; + } +{%- endfor %} + default: { + break; + } + } + return result; + } +} +{%- endmacro %} diff --git a/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl new file mode 100644 index 0000000000..7096a18747 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl @@ -0,0 +1,4 @@ +{% from "enum_definition.tmpl" import enum_def %} +{% include "header.java.tmpl" %} + +{{enum_def(enum, true)}} diff --git a/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl new file mode 100644 index 0000000000..d37288ac5d --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl @@ -0,0 +1,42 @@ +{%- macro enum_value(enum, field, index) -%} +{%- if field.value -%} +(int) ({{field.value|expression_to_text('i32')}}) +{%- elif index == 0 -%} +0 +{%- else -%} +{{enum.fields[index - 1]|name}} + 1 +{%- endif -%} +{%- endmacro -%} + +{%- macro enum_def(enum, top_level) -%} +public {{ 'static ' if not top_level }}final class {{enum|name}} { + +{% for field in enum.fields %} + public static final int {{field|name}} = {{enum_value(enum, field, loop.index0)}}; +{% endfor %} + + private static final boolean IS_EXTENSIBLE = {% if enum.extensible %}true{% else %}false{% endif %}; + + public static boolean isKnownValue(int value) { +{%- if enum.fields %} + switch (value) { +{%- for enum_field in enum.fields|groupby('numeric_value') %} + case {{enum_field[0]}}: +{%- endfor %} + return true; + } +{%- endif %} + return false; + } + + public static void validate(int value) { + if (IS_EXTENSIBLE || isKnownValue(value)) + return; + + throw new DeserializationException("Invalid enum value."); + } + + private {{enum|name}}() {} + +} +{%- endmacro -%} diff --git a/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl new file mode 100644 index 0000000000..1d67890452 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl @@ -0,0 +1,14 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is autogenerated by: +// mojo/public/tools/bindings/mojom_bindings_generator.py +// For: +// {{module.path}} +// + +package {{package}}; + +import org.chromium.base.annotations.SuppressFBWarnings; +import org.chromium.mojo.bindings.DeserializationException;
\ No newline at end of file diff --git a/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl new file mode 100644 index 0000000000..a13be3ef60 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl @@ -0,0 +1,4 @@ +{% from "interface_definition.tmpl" import interface_def %} +{% include "header.java.tmpl" %} + +{{ interface_def(interface) }} diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl new file mode 100644 index 0000000000..a723f8c393 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl @@ -0,0 +1,297 @@ +{% from "constant_definition.tmpl" import constant_def %} +{% from "enum_definition.tmpl" import enum_def %} +{% from "data_types_definition.tmpl" import struct_def %} + +{%- macro declare_params(parameters, boxed=false) %} +{%- for param in parameters -%} +{{param.kind|java_type(boxed)}} {{param|name}} +{%- if not loop.last %}, {% endif %} +{%- endfor %} +{%- endmacro %} + +{% macro declare_request_params(method) %} +{{declare_params(method.parameters)}} +{%- if method.response_parameters != None -%} +{%- if method.parameters %}, {% endif %} +{{method|interface_response_name}} callback +{%- endif -%} +{% endmacro %} + +{%- macro declare_callback(method) -%} + +interface {{method|interface_response_name}} extends org.chromium.mojo.bindings.Callbacks.Callback{{method.response_parameters|length}}{% if method.response_parameters %}< +{%- for param in method.response_parameters -%} +{{param.kind|java_type(True)}} +{%- if not loop.last %}, {% endif %} +{%- endfor -%} +>{% endif %} { } +{%- endmacro -%} + +{%- macro run_callback(variable, parameters) -%} +{%- if parameters -%} +{%- for param in parameters -%} +{{variable}}.{{param|name}} +{%- if not loop.last %}, {% endif %} +{%- endfor -%} +{%- endif -%} +{%- endmacro -%} + +{%- macro flags_for_method(method, is_request) -%} +{{flags(method.response_parameters != None, is_request)}} +{%- endmacro -%} + +{%- macro flags(use_response_flag, is_request) -%} +{%- if not use_response_flag -%} +org.chromium.mojo.bindings.MessageHeader.NO_FLAG +{%- elif is_request: -%} +org.chromium.mojo.bindings.MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG +{%- else -%} +org.chromium.mojo.bindings.MessageHeader.MESSAGE_IS_RESPONSE_FLAG +{%- endif -%} +{%- endmacro -%} + +{%- macro manager_class(interface, fully_qualified=False) -%} +{% if fully_qualified %}org.chromium.mojo.bindings.Interface.{% endif %}Manager<{{interface|name}}, {{interface|name}}.Proxy> +{%- endmacro -%} + +{%- macro manager_def(interface) -%} +public static final {{manager_class(interface, True)}} MANAGER = + new {{manager_class(interface, True)}}() { + + public String getName() { + return "{{namespace|replace(".","::")}}::{{interface.name}}"; + } + + public int getVersion() { + return {{interface.version}}; + } + + public Proxy buildProxy(org.chromium.mojo.system.Core core, + org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) { + return new Proxy(core, messageReceiver); + } + + public Stub buildStub(org.chromium.mojo.system.Core core, {{interface|name}} impl) { + return new Stub(core, impl); + } + + public {{interface|name}}[] buildArray(int size) { + return new {{interface|name}}[size]; + } +}; +{%- endmacro -%} + +{%- macro accept_body(interface, with_response) -%} +try { + org.chromium.mojo.bindings.ServiceMessage messageWithHeader = + message.asServiceMessage(); + org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader(); + if (!header.validateHeader({{flags(with_response, True)}})) { + return false; + } + switch(header.getType()) { +{% if with_response %} + case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_MESSAGE_ID: + return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRun( + getCore(), {{interface|name}}_Internal.MANAGER, messageWithHeader, receiver); +{% else %} + case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID: + return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRunOrClosePipe( + {{interface|name}}_Internal.MANAGER, messageWithHeader); +{% endif %} +{% for method in interface.methods %} +{% if (with_response and method.response_parameters != None) or + (not with_response and method.response_parameters == None) %} +{% set request_struct = method.param_struct %} +{% if with_response %} +{% set response_struct = method.response_param_struct %} +{% endif %} + case {{method|method_ordinal_name}}: { +{% if method.parameters %} + {{request_struct|name}} data = + {{request_struct|name}}.deserialize(messageWithHeader.getPayload()); +{% else %} + {{request_struct|name}}.deserialize(messageWithHeader.getPayload()); +{% endif %} + try { + getImpl().{{method|name}}({{run_callback('data', method.parameters)}}{% if with_response %}{% if method.parameters %}, {% endif %}new {{response_struct|name}}ProxyToResponder(getCore(), receiver, header.getRequestId()){% endif %}); + } catch (RuntimeException e) { + // TODO(lhchavez): Remove this hack. See b/28814913 for details. + android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e); + } + return true; + } +{% endif %} +{% endfor %} + default: + return false; + } +} catch (org.chromium.mojo.bindings.DeserializationException e) { + System.err.println(e.toString()); + return false; +} +{%- endmacro -%} + +{% macro interface_def(interface) %} +public interface {{interface|name}} extends org.chromium.mojo.bindings.Interface { +{% for constant in interface.constants %} + + {{constant_def(constant)|indent(4)}} +{% endfor %} +{% for enum in interface.enums %} + + {{enum_def(enum, false)|indent(4)}} +{% endfor %} + + public interface Proxy extends {{interface|name}}, org.chromium.mojo.bindings.Interface.Proxy { + } + + {{manager_class(interface)}} MANAGER = {{interface|name}}_Internal.MANAGER; +{% for method in interface.methods %} + + void {{method|name}}({{declare_request_params(method)}}); +{% if method.response_parameters != None %} + {{declare_callback(method)|indent(4)}} +{% endif %} +{% endfor %} +} +{% endmacro %} + +{% macro interface_internal_def(interface) %} +class {{interface|name}}_Internal { + + {{manager_def(interface)|indent(4)}} + +{% for method in interface.methods %} + private static final int {{method|method_ordinal_name}} = {{method.ordinal}}; +{% endfor %} + + static final class Proxy extends org.chromium.mojo.bindings.Interface.AbstractProxy implements {{interface|name}}.Proxy { + + Proxy(org.chromium.mojo.system.Core core, + org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) { + super(core, messageReceiver); + } +{% for method in interface.methods %} + + @Override + public void {{method|name}}({{declare_request_params(method)}}) { +{% set request_struct = method.param_struct %} + {{request_struct|name}} _message = new {{request_struct|name}}(); +{% for param in method.parameters %} + _message.{{param|name}} = {{param|name}}; +{% endfor %} +{% if method.response_parameters != None %} + getProxyHandler().getMessageReceiver().acceptWithResponder( + _message.serializeWithHeader( + getProxyHandler().getCore(), + new org.chromium.mojo.bindings.MessageHeader( + {{method|method_ordinal_name}}, + {{flags_for_method(method, True)}}, + 0)), + new {{method.response_param_struct|name}}ForwardToCallback(callback)); +{% else %} + getProxyHandler().getMessageReceiver().accept( + _message.serializeWithHeader( + getProxyHandler().getCore(), + new org.chromium.mojo.bindings.MessageHeader({{method|method_ordinal_name}}))); +{% endif %} + } +{% endfor %} + + } + + static final class Stub extends org.chromium.mojo.bindings.Interface.Stub<{{interface|name}}> { + + Stub(org.chromium.mojo.system.Core core, {{interface|name}} impl) { + super(core, impl); + } + + @Override + public boolean accept(org.chromium.mojo.bindings.Message message) { + {{accept_body(interface, False)|indent(12)}} + } + + @Override + public boolean acceptWithResponder(org.chromium.mojo.bindings.Message message, org.chromium.mojo.bindings.MessageReceiver receiver) { + {{accept_body(interface, True)|indent(12)}} + } + } +{% for method in interface.methods %} + + {{ struct_def(method.param_struct, True)|indent(4) }} +{% if method.response_parameters != None %} +{% set response_struct = method.response_param_struct %} + + {{ struct_def(response_struct, True)|indent(4) }} + + static class {{response_struct|name}}ForwardToCallback extends org.chromium.mojo.bindings.SideEffectFreeCloseable + implements org.chromium.mojo.bindings.MessageReceiver { + private final {{interface|name}}.{{method|interface_response_name}} mCallback; + + {{response_struct|name}}ForwardToCallback({{interface|name}}.{{method|interface_response_name}} callback) { + this.mCallback = callback; + } + + @Override + public boolean accept(org.chromium.mojo.bindings.Message message) { + try { + org.chromium.mojo.bindings.ServiceMessage messageWithHeader = + message.asServiceMessage(); + org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader(); + if (!header.validateHeader({{method|method_ordinal_name}}, + {{flags_for_method(method, False)}})) { + return false; + } +{% if method.response_parameters|length %} + {{response_struct|name}} response = {{response_struct|name}}.deserialize(messageWithHeader.getPayload()); +{% endif %} + try { + mCallback.call({{run_callback('response', method.response_parameters)}}); + } catch (RuntimeException e) { + // TODO(lhchavez): Remove this hack. See b/28814913 for details. + android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e); + } + return true; + } catch (org.chromium.mojo.bindings.DeserializationException e) { + return false; + } + } + } + + static class {{response_struct|name}}ProxyToResponder implements {{interface|name}}.{{method|interface_response_name}} { + + private final org.chromium.mojo.system.Core mCore; + private final org.chromium.mojo.bindings.MessageReceiver mMessageReceiver; + private final long mRequestId; + + {{response_struct|name}}ProxyToResponder( + org.chromium.mojo.system.Core core, + org.chromium.mojo.bindings.MessageReceiver messageReceiver, + long requestId) { + mCore = core; + mMessageReceiver = messageReceiver; + mRequestId = requestId; + } + + @Override + public void call({{declare_params(method.response_parameters, true)}}) { + {{response_struct|name}} _response = new {{response_struct|name}}(); +{% for param in method.response_parameters %} + _response.{{param|name}} = {{param|name}}; +{% endfor %} + org.chromium.mojo.bindings.ServiceMessage _message = + _response.serializeWithHeader( + mCore, + new org.chromium.mojo.bindings.MessageHeader( + {{method|method_ordinal_name}}, + {{flags_for_method(method, False)}}, + mRequestId)); + mMessageReceiver.accept(_message); + } + } +{% endif %} +{% endfor %} + +} +{% endmacro %} diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl new file mode 100644 index 0000000000..50c7a7bf94 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl @@ -0,0 +1,4 @@ +{% from "interface_definition.tmpl" import interface_internal_def %} +{% include "header.java.tmpl" %} + +{{ interface_internal_def(interface) }} diff --git a/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl new file mode 100644 index 0000000000..e28ba19c8b --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl @@ -0,0 +1,4 @@ +{% from "data_types_definition.tmpl" import struct_def %} +{% include "header.java.tmpl" %} + +{{ struct_def(struct) }} diff --git a/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl new file mode 100644 index 0000000000..b8cd4aa2e0 --- /dev/null +++ b/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl @@ -0,0 +1,4 @@ +{% from "data_types_definition.tmpl" import union_def %} +{% include "header.java.tmpl" %} + +{{ union_def(union) }} |