Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / mojo / public / tools / bindings / generators / js_templates / struct_definition.tmpl
1 {#--- Begin #}
2   function {{struct.name}}(values) {
3     this.initDefaults_();
4     this.initFields_(values);
5   }
6
7 {#--- Enums #}
8 {%- from "enum_definition.tmpl" import enum_def %}
9 {%  for enum in struct.enums %}
10   {{enum_def("%s.%s"|format(struct.name, enum.name), enum, module)}}
11 {%-  endfor %}
12
13 {#--- Constants #}
14 {%  for constant in struct.constants %}
15   {{struct.name}}.{{constant.name}} = {{constant.value|expression_to_text}};
16 {%-  endfor %}
17
18 {#--- initDefaults() #}
19   {{struct.name}}.prototype.initDefaults_ = function() {
20 {%- for packed_field in struct.packed.packed_fields %}
21     this.{{packed_field.field.name}} = {{packed_field.field|default_value}};
22 {%- endfor %}
23   };
24
25 {#--- initFields() #}
26   {{struct.name}}.prototype.initFields_ = function(fields) {
27     for(var field in fields) {
28         if (this.hasOwnProperty(field))
29           this[field] = fields[field];
30     }
31   };
32
33 {#--- Validation #}
34
35   {{struct.name}}.validate = function(messageValidator, offset) {
36     var err;
37 {% macro check_err() -%}
38     if (err !== validator.validationError.NONE)
39         return err;
40 {%- endmacro %}
41     err = messageValidator.validateStructHeader(offset, {{struct.name}}.encodedSize, {{struct.packed.packed_fields|length}});
42     {{check_err()}}
43
44 {%- for packed_field in struct.packed.packed_fields %}
45 {%-   set field_name = packed_field.field.name %}
46 {%-   if packed_field.field|is_string_pointer_field %}
47     // validate {{struct.name}}.{{field_name}}
48     err = messageValidator.validateStringPointer({{packed_field|validate_string_params}})
49     {{check_err()}}
50 {%-   elif packed_field.field|is_array_pointer_field %}
51     // validate {{struct.name}}.{{field_name}}
52     err = messageValidator.validateArrayPointer({{packed_field|validate_array_params}});
53     {{check_err()}}
54 {%-   elif packed_field.field|is_struct_pointer_field %}
55     // validate {{struct.name}}.{{field_name}}
56     err = messageValidator.validateStructPointer({{packed_field|validate_struct_params}});
57     {{check_err()}}
58 {%-   elif packed_field.field|is_handle_field %}
59     // validate {{struct.name}}.{{field_name}}
60     err = messageValidator.validateHandle({{packed_field|validate_handle_params}})
61     {{check_err()}}
62 {%-   endif %}
63 {%- endfor %}
64
65     return validator.validationError.NONE;
66   };
67
68 {#--- Encoding and decoding #}
69
70   {{struct.name}}.encodedSize = codec.kStructHeaderSize + {{struct.packed|payload_size}};
71
72   {{struct.name}}.decode = function(decoder) {
73     var packed;
74     var val = new {{struct.name}}();
75     var numberOfBytes = decoder.readUint32();
76     var numberOfFields = decoder.readUint32();
77 {%- for byte in struct.bytes %}
78 {%-   if byte.packed_fields|length > 1 %}
79     packed = decoder.readUint8();
80 {%-     for packed_field in byte.packed_fields %}
81     val.{{packed_field.field.name}} = (packed >> {{packed_field.bit}}) & 1 ? true : false;
82 {%-     endfor %}
83 {%-   else %}
84 {%-     for packed_field in byte.packed_fields %}
85     val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_snippet}};
86 {%-     endfor %}
87 {%-   endif %}
88 {%-   if byte.is_padding %}
89     decoder.skip(1);
90 {%-   endif %}
91 {%- endfor %}
92     return val;
93   };
94
95   {{struct.name}}.encode = function(encoder, val) {
96     var packed;
97     encoder.writeUint32({{struct.name}}.encodedSize);
98     encoder.writeUint32({{struct.packed.packed_fields|length}});
99
100 {%- for byte in struct.bytes %}
101 {%-   if byte.packed_fields|length > 1 %}
102     packed = 0;
103 {%-     for packed_field in byte.packed_fields %}
104     packed |= (val.{{packed_field.field.name}} & 1) << {{packed_field.bit}}
105 {%-     endfor %}
106     encoder.writeUint8(packed);
107 {%-   else %}
108 {%-     for packed_field in byte.packed_fields %}
109     encoder.{{packed_field.field.kind|encode_snippet}}val.{{packed_field.field.name}});
110 {%-     endfor %}
111 {%-   endif %}
112 {%-   if byte.is_padding %}
113     encoder.skip(1);
114 {%-   endif %}
115 {%- endfor %}
116   };