Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / mojo / public / tools / bindings / generators / cpp_templates / struct_serialization_definition.tmpl
1 size_t GetSerializedSize_(const {{struct.name}}Ptr& input) {
2   if (!input)
3     return 0;
4   size_t size = sizeof(internal::{{struct.name}}_Data);
5 {%- for pf in struct.packed.packed_fields if pf.field.kind|is_object_kind %}
6   size += GetSerializedSize_(input->{{pf.field.name}});
7 {%- endfor %}
8   return size;
9 }
10
11 void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buf,
12                 internal::{{struct.name}}_Data** output) {
13   if (input) {
14     internal::{{struct.name}}_Data* result =
15         internal::{{struct.name}}_Data::New(buf);
16 {%- for pf in struct.packed.packed_fields %}
17 {%-   if pf.field.kind|is_object_kind %}
18     Serialize_(mojo::internal::Forward(input->{{pf.field.name}}), buf, &result->{{pf.field.name}}.ptr);
19 {%-   elif pf.field.kind|is_interface_kind %}
20     result->{{pf.field.name}} = input->{{pf.field.name}}.PassMessagePipe().release();
21 {%-   elif pf.field.kind|is_any_handle_kind %}
22     result->{{pf.field.name}} = input->{{pf.field.name}}.release();
23 {%-   else %}
24     result->{{pf.field.name}} = input->{{pf.field.name}};
25 {%-   endif %}
26 {%- endfor %}
27     *output = result;
28   } else {
29     *output = NULL;
30   }
31 }
32
33 void Deserialize_(internal::{{struct.name}}_Data* input,
34                   {{struct.name}}Ptr* output) {
35   if (input) {
36     {{struct.name}}Ptr result({{struct.name}}::New());
37 {%- for pf in struct.packed.packed_fields %}
38 {%-   if pf.field.kind|is_object_kind %}
39     Deserialize_(input->{{pf.field.name}}.ptr, &result->{{pf.field.name}});
40 {%-   elif pf.field.kind|is_interface_kind %}
41     if (input->{{pf.field.name}}.is_valid())
42       result->{{pf.field.name}}.Bind(mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&input->{{pf.field.name}})));
43 {%-   elif pf.field.kind|is_any_handle_kind %}
44     result->{{pf.field.name}}.reset(mojo::internal::FetchAndReset(&input->{{pf.field.name}}));
45 {%-   elif pf.field.kind|is_enum_kind %}
46     result->{{pf.field.name}} = static_cast<{{pf.field.kind|cpp_wrapper_type}}>(
47       input->{{pf.field.name}});
48 {%-   else %}
49     result->{{pf.field.name}} = input->{{pf.field.name}};
50 {%-   endif %}
51 {%- endfor %}
52     *output = result.Pass();
53   } else {
54     output->reset();
55   }
56 }