qsr@chromium.org | 7a0001b | 2014-06-25 22:28:50 +0900 | [diff] [blame] | 1 | {% from "constant_definition.tmpl" import constant_def %} |
| 2 | {% from "enum_definition.tmpl" import enum_def %} |
| 3 | |
qsr@chromium.org | 05b1fbe | 2014-07-03 21:42:52 +0900 | [diff] [blame] | 4 | {% macro encode(variable, kind, offset, bit, level=0) %} |
| 5 | {% if kind|is_pointer_array_kind %} |
| 6 | {% set sub_kind = kind.kind %} |
| 7 | if ({{variable}} == null) { |
| 8 | encoder{{level}}.encodeNullPointer({{offset}}); |
| 9 | } else { |
| 10 | org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.encodePointerArray({{variable}}.length, {{offset}}); |
| 11 | for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) { |
| 12 | {{encode(variable~'[i'~level~']', sub_kind, 'DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE * i'~level, 0, level+1)|indent(8)}} |
| 13 | } |
| 14 | } |
| 15 | {% else %} |
| 16 | encoder{{level}}.{{kind|encode_method(variable, offset, bit)}}; |
| 17 | {% endif %} |
| 18 | {% endmacro %} |
| 19 | |
| 20 | {% macro decode(variable, kind, offset, bit, level=0) %} |
| 21 | {% if kind|is_struct_kind or kind|is_pointer_array_kind %} |
| 22 | org.chromium.mojo.bindings.Decoder decoder{{level+1}} = decoder{{level}}.readPointer({{offset}}); |
| 23 | {% if kind|is_struct_kind %} |
| 24 | {{variable}} = {{kind|java_type}}.decode(decoder{{level+1}}); |
| 25 | {% else %}{# kind|is_pointer_array_kind #} |
| 26 | if (decoder{{level+1}} == null) { |
| 27 | {{variable}} = null; |
| 28 | } else { |
| 29 | DataHeader si{{level+1}} = decoder{{level+1}}.readDataHeader(); |
| 30 | {{variable}} = {{kind|new_array('si'~(level+1)~'.numFields')}}; |
| 31 | for (int i{{level+1}} = 0; i{{level+1}} < si{{level+1}}.numFields; ++i{{level+1}}) { |
| 32 | {{decode(variable~'[i'~(level+1)~']', kind.kind, 'DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE * i'~(level+1), 0, level+1)|indent(8)}} |
| 33 | } |
| 34 | } |
| 35 | {% endif %} |
| 36 | {% else %} |
| 37 | {{variable}} = decoder{{level}}.{{kind|decode_method(offset, bit)}}; |
| 38 | {% endif %} |
| 39 | {% endmacro %} |
| 40 | |
qsr@chromium.org | 7a0001b | 2014-06-25 22:28:50 +0900 | [diff] [blame] | 41 | {% macro struct_def(struct, inner_class=False) %} |
| 42 | {{'static' if inner_class else 'public'}} final class {{struct|name}} extends org.chromium.mojo.bindings.Struct { |
qsr@chromium.org | 05b1fbe | 2014-07-03 21:42:52 +0900 | [diff] [blame] | 43 | |
| 44 | private static final int STRUCT_SIZE = {{struct.packed|struct_size}}; |
| 45 | private static final DataHeader DEFAULT_STRUCT_INFO = new DataHeader(STRUCT_SIZE, {{struct.packed.packed_fields|length}}); |
qsr@chromium.org | 7a0001b | 2014-06-25 22:28:50 +0900 | [diff] [blame] | 46 | {% for constant in struct.constants %} |
| 47 | |
| 48 | {{constant_def(constant)|indent(4)}} |
| 49 | {% endfor %} |
| 50 | {% for enum in struct.enums %} |
| 51 | |
| 52 | {{enum_def(enum, false)|indent(4)}} |
| 53 | {% endfor %} |
| 54 | {% if struct.fields %} |
| 55 | |
| 56 | {% for field in struct.fields %} |
| 57 | public {{field.kind|java_type}} {{field|name}}; |
| 58 | {% endfor %} |
| 59 | {% endif %} |
| 60 | |
| 61 | public {{struct|name}}() { |
qsr@chromium.org | 05b1fbe | 2014-07-03 21:42:52 +0900 | [diff] [blame] | 62 | super(STRUCT_SIZE); |
qsr@chromium.org | 7a0001b | 2014-06-25 22:28:50 +0900 | [diff] [blame] | 63 | {% for field in struct.fields %} |
| 64 | {% if field.default %} |
| 65 | {{field|name}} = {{field|default_value}}; |
| 66 | {% elif field.kind|is_handle %} |
| 67 | {{field|name}} = org.chromium.mojo.system.InvalidHandle.INSTANCE; |
| 68 | {% endif %} |
| 69 | {% endfor %} |
| 70 | } |
| 71 | |
qsr@chromium.org | 05b1fbe | 2014-07-03 21:42:52 +0900 | [diff] [blame] | 72 | public static {{struct|name}} deserialize(org.chromium.mojo.bindings.Message message) { |
| 73 | return decode(new org.chromium.mojo.bindings.Decoder(message)); |
| 74 | } |
| 75 | |
| 76 | public static {{struct|name}} decode(org.chromium.mojo.bindings.Decoder decoder0) { |
| 77 | if (decoder0 == null) { |
| 78 | return null; |
| 79 | } |
| 80 | {{struct|name}} result = new {{struct|name}}(); |
| 81 | DataHeader mainDataHeader = decoder0.readDataHeader(); |
| 82 | {% for byte in struct.bytes %} |
| 83 | {% for packed_field in byte.packed_fields %} |
| 84 | if (mainDataHeader.numFields > {{packed_field.ordinal}}) { |
| 85 | {{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(12)}} |
| 86 | } |
| 87 | {% endfor %} |
| 88 | {% endfor %} |
| 89 | return result; |
| 90 | } |
| 91 | |
| 92 | @Override |
| 93 | protected final void encode(org.chromium.mojo.bindings.Encoder encoder) { |
| 94 | org.chromium.mojo.bindings.Encoder encoder0 = encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO); |
| 95 | {% for byte in struct.bytes %} |
| 96 | {% for packed_field in byte.packed_fields %} |
| 97 | {{encode(packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(8)}} |
| 98 | {% endfor %} |
| 99 | {% endfor %} |
| 100 | } |
qsr@chromium.org | 7a0001b | 2014-06-25 22:28:50 +0900 | [diff] [blame] | 101 | } |
| 102 | {% endmacro %} |