OLD | NEW |
1 size_t GetSerializedSize_({{union.name}}Ptr& input, | 1 {%- set mojom_type = union|get_qualified_name_for_kind %} |
2 bool inlined, | 2 {%- set data_type = union|get_qualified_name_for_kind(internal=True) %} |
3 mojo::internal::SerializationContext* context) { | 3 |
4 size_t size = 0U; | 4 namespace internal { |
5 if (!inlined) { | 5 |
6 size += sizeof(internal::{{union.name}}_Data); | 6 // static |
7 } | 7 size_t UnionSerializerImpl<{{mojom_type}}Ptr>::PrepareToSerialize( |
| 8 {{mojom_type}}Ptr& input, |
| 9 bool inlined, |
| 10 SerializationContext* context) { |
| 11 size_t size = inlined ? 0 : sizeof({{data_type}}); |
8 | 12 |
9 if (!input) | 13 if (!input) |
10 return size; | 14 return size; |
11 | 15 |
12 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); | 16 UnionAccessor<{{mojom_type}}> input_acc(input.get()); |
13 switch (input->which()) { | 17 switch (input->which()) { |
14 {% for field in union.fields %} | 18 {% for field in union.fields %} |
15 {% if field.kind|is_object_kind %} | 19 {% if field.kind|is_object_kind %} |
16 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} | 20 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} |
17 case {{union.name}}::Tag::{{field.name|upper}}: | 21 case {{mojom_type}}::Tag::{{field.name|upper}}: |
18 {% if field.kind|is_union_kind %} | 22 {% if field.kind|is_union_kind %} |
19 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false, con
text); | 23 size += mojo::internal::PrepareToSerialize<{{serializer_type}}>( |
20 {% elif field.kind|is_array_kind or field.kind|is_map_kind %} | 24 *(input_acc.data()->{{field.name}}), false, context); |
| 25 {% else %} |
21 size += mojo::internal::PrepareToSerialize<{{serializer_type}}>( | 26 size += mojo::internal::PrepareToSerialize<{{serializer_type}}>( |
22 *(input_acc.data()->{{field.name}}), context); | 27 *(input_acc.data()->{{field.name}}), context); |
23 {% else %} | |
24 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), context); | |
25 {% endif %} | 28 {% endif %} |
26 break; | 29 break; |
27 {%- endif %} | 30 {%- endif %} |
28 {%- endfor %} | 31 {%- endfor %} |
29 default: | 32 default: |
30 break; | 33 break; |
31 } | 34 } |
32 return size; | 35 return size; |
33 } | 36 } |
34 | 37 |
35 void SerializeUnion_({{union.name}}Ptr input, | 38 // static |
36 mojo::internal::Buffer* buf, | 39 void UnionSerializerImpl<{{mojom_type}}Ptr>::Serialize( |
37 internal::{{union.name}}_Data** output, | 40 {{mojom_type}}Ptr& input, |
38 bool inlined, | 41 Buffer* buf, |
39 mojo::internal::SerializationContext* context) { | 42 {{data_type}}** output, |
40 internal::{{union.name}}_Data* result = *output; | 43 bool inlined, |
| 44 SerializationContext* context) { |
| 45 {{data_type}}* result = *output; |
41 if (input) { | 46 if (input) { |
42 if (!inlined) { | 47 if (!inlined) |
43 result = internal::{{union.name}}_Data::New(buf); | 48 result = {{data_type}}::New(buf); |
44 } | 49 UnionAccessor<{{mojom_type}}> input_acc(input.get()); |
45 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); | |
46 // TODO(azani): Handle unknown and objects. | 50 // TODO(azani): Handle unknown and objects. |
47 // Set the not-null flag. | 51 // Set the not-null flag. |
48 result->size = 16; | 52 result->size = 16; |
49 result->tag = input->which(); | 53 result->tag = input->which(); |
50 switch (input->which()) { | 54 switch (input->which()) { |
51 {% for field in union.fields %} | 55 {% for field in union.fields %} |
52 case {{union.name}}::Tag::{{field.name|upper}}: { | 56 case {{mojom_type}}::Tag::{{field.name|upper}}: { |
53 {% if field.kind|is_object_kind %} | 57 {% if field.kind|is_object_kind %} |
54 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} | 58 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} |
55 {% if field.kind|is_string_kind %} | 59 {% if field.kind|is_union_kind %} |
56 Serialize_( | 60 mojo::internal::Serialize<{{serializer_type}}>( |
57 *(input_acc.data()->{{field.name}}), | 61 *(input_acc.data()->{{field.name}}), buf, |
58 buf, &result->data.f_{{field.name}}.ptr, context); | 62 &result->data.f_{{field.name}}.ptr, false, context); |
59 {% elif field.kind|is_struct_kind %} | |
60 Serialize_( | |
61 std::move(*(input_acc.data()->{{field.name}})), | |
62 buf, &result->data.f_{{field.name}}.ptr, context); | |
63 {% elif field.kind|is_union_kind %} | |
64 SerializeUnion_( | |
65 std::move(*(input_acc.data()->{{field.name}})), | |
66 buf, &result->data.f_{{field.name}}.ptr, false, context); | |
67 {% elif field.kind|is_array_kind or field.kind|is_map_kind %} | 63 {% elif field.kind|is_array_kind or field.kind|is_map_kind %} |
68 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params
( | 64 const ArrayValidateParams {{field.name}}_validate_params( |
69 {{field.kind|get_array_validate_params_ctor_args|indent(16)}}); | 65 {{field.kind|get_array_validate_params_ctor_args|indent(16)}}); |
70 mojo::internal::Serialize<{{serializer_type}}>( | 66 mojo::internal::Serialize<{{serializer_type}}>( |
71 *(input_acc.data()->{{field.name}}), buf, | 67 *(input_acc.data()->{{field.name}}), buf, |
72 &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params, | 68 &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params, |
73 context); | 69 context); |
| 70 {% else %} |
| 71 mojo::internal::Serialize<{{serializer_type}}>( |
| 72 *(input_acc.data()->{{field.name}}), buf, |
| 73 &result->data.f_{{field.name}}.ptr, context); |
74 {%- endif %} | 74 {%- endif %} |
75 {% elif field.kind|is_any_handle_kind %} | 75 {% elif field.kind|is_any_handle_kind %} |
76 result->data.f_{{field.name}} = context->handles.AddHandle( | 76 result->data.f_{{field.name}} = context->handles.AddHandle( |
77 input_acc.data()->{{field.name}}->release()); | 77 input_acc.data()->{{field.name}}->release()); |
78 {% elif field.kind|is_interface_kind %} | 78 {% elif field.kind|is_interface_kind %} |
79 mojo::internal::Interface_Data* {{field.name}} = | 79 Interface_Data* {{field.name}} = reinterpret_cast<Interface_Data*>( |
80 reinterpret_cast<mojo::internal::Interface_Data*>( | 80 &result->data.f_{{field.name}}); |
81 &result->data.f_{{field.name}}); | 81 InterfacePointerToData(std::move(*input_acc.data()->{{field.name}}), |
82 mojo::internal::InterfacePointerToData( | 82 {{field.name}}, context); |
83 std::move(*input_acc.data()->{{field.name}}), {{field.name}}, | |
84 context); | |
85 {%- elif field.kind|is_associated_kind %} | 83 {%- elif field.kind|is_associated_kind %} |
86 // TODO(yzshen): add seralization logic for associated kinds. | 84 // TODO(yzshen): add seralization logic for associated kinds. |
87 {% elif field.kind|is_enum_kind %} | 85 {% elif field.kind|is_enum_kind %} |
88 result->data.f_{{field.name}} = static_cast<int32_t>(input_acc.data()->{
{field.name}}); | 86 result->data.f_{{field.name}} = |
| 87 static_cast<int32_t>(input_acc.data()->{{field.name}}); |
89 {% else %} | 88 {% else %} |
90 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; | 89 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; |
91 {%- endif %} | 90 {%- endif %} |
92 break; | 91 break; |
93 } | 92 } |
94 {%- endfor %} | 93 {%- endfor %} |
95 } | 94 } |
96 } else if (inlined) { | 95 } else if (inlined) { |
97 result->set_null(); | 96 result->set_null(); |
98 } else { | 97 } else { |
99 result = nullptr; | 98 result = nullptr; |
100 } | 99 } |
101 *output = result; | 100 *output = result; |
102 } | 101 } |
103 | 102 |
104 bool Deserialize_(internal::{{union.name}}_Data* input, | 103 // static |
105 {{union.name}}Ptr* output, | 104 bool UnionSerializerImpl<{{mojom_type}}Ptr>::Deserialize( |
106 mojo::internal::SerializationContext* context) { | 105 {{data_type}}* input, |
| 106 {{mojom_type}}Ptr* output, |
| 107 SerializationContext* context) { |
107 bool success = true; | 108 bool success = true; |
108 if (input && !input->is_null()) { | 109 if (input && !input->is_null()) { |
109 {{union.name}}Ptr result({{union.name}}::New()); | 110 {{mojom_type}}Ptr result({{mojom_type}}::New()); |
110 mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get()); | 111 UnionAccessor<{{mojom_type}}> result_acc(result.get()); |
111 switch (input->tag) { | 112 switch (input->tag) { |
112 {% for field in union.fields %} | 113 {% for field in union.fields %} |
113 case {{union.name}}::Tag::{{field.name|upper}}: { | 114 case {{mojom_type}}::Tag::{{field.name|upper}}: { |
114 {% if field.kind|is_object_kind %} | 115 {% if field.kind|is_object_kind %} |
115 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} | 116 {%- set serializer_type = field.kind|unmapped_type_for_serializer %} |
116 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}}); | 117 result_acc.SwitchActive({{mojom_type}}::Tag::{{field.name|upper}}); |
117 {%- if field.kind|is_array_kind or field.kind|is_map_kind %} | |
118 if (!mojo::internal::Deserialize<{{serializer_type}}>( | 118 if (!mojo::internal::Deserialize<{{serializer_type}}>( |
119 input->data.f_{{field.name}}.ptr, | 119 input->data.f_{{field.name}}.ptr, |
120 result_acc.data()->{{field.name}}, context)) | 120 result_acc.data()->{{field.name}}, context)) |
121 success = false; | 121 success = false; |
122 {%- else %} | |
123 if (!Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{
{field.name}}, context)) | |
124 success = false; | |
125 {%- endif %} | |
126 {% elif field.kind|is_any_handle_kind %} | 122 {% elif field.kind|is_any_handle_kind %} |
127 {{field.kind|cpp_wrapper_type}} {{field.name}}; | 123 {{field.kind|cpp_wrapper_type}} {{field.name}}; |
128 {{field.name}} = context->handles.TakeHandleAs< | 124 {{field.name}} = context->handles.TakeHandleAs< |
129 typename decltype({{field.name}})::RawHandleType>( | 125 typename {{field.kind|cpp_wrapper_type}}::RawHandleType>( |
130 input->data.f_{{field.name}}); | 126 input->data.f_{{field.name}}); |
131 result->set_{{field.name}}(std::move({{field.name}})); | 127 result->set_{{field.name}}(std::move({{field.name}})); |
132 {% elif field.kind|is_interface_kind %} | 128 {% elif field.kind|is_interface_kind %} |
133 {{field.kind|cpp_wrapper_type}} {{field.name}}_out; | 129 {{field.kind|get_qualified_name_for_kind}}Ptr {{field.name}}_out; |
134 mojo::internal::Interface_Data* {{field.name}}_in = | 130 Interface_Data* {{field.name}}_in = reinterpret_cast<Interface_Data*>( |
135 reinterpret_cast<mojo::internal::Interface_Data*>( | 131 &input->data.f_{{field.name}}); |
136 &input->data.f_{{field.name}}); | 132 InterfaceDataToPointer({{field.name}}_in, &{{field.name}}_out, context); |
137 mojo::internal::InterfaceDataToPointer( | |
138 {{field.name}}_in, &{{field.name}}_out, context); | |
139 result->set_{{field.name}}(std::move({{field.name}}_out)); | 133 result->set_{{field.name}}(std::move({{field.name}}_out)); |
140 {%- elif field.kind|is_associated_kind %} | 134 {%- elif field.kind|is_associated_kind %} |
141 // TODO(yzshen): add deserialization logic for associated kinds. | 135 // TODO(yzshen): add deserialization logic for associated kinds. |
142 {% elif field.kind|is_enum_kind %} | 136 {% elif field.kind|is_enum_kind %} |
143 result->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>(
input->data.f_{{field.name}})); | 137 result->set_{{field.name}}( |
| 138 static_cast<{{field.kind|get_qualified_name_for_kind}}>( |
| 139 input->data.f_{{field.name}})); |
144 {% else %} | 140 {% else %} |
145 result->set_{{field.name}}(input->data.f_{{field.name}}); | 141 result->set_{{field.name}}(input->data.f_{{field.name}}); |
146 {%- endif %} | 142 {%- endif %} |
147 break; | 143 break; |
148 } | 144 } |
149 {%- endfor %} | 145 {%- endfor %} |
150 } | 146 } |
151 *output = std::move(result); | 147 *output = std::move(result); |
152 } else { | 148 } else { |
153 output->reset(); | 149 output->reset(); |
154 } | 150 } |
155 return success; | 151 return success; |
156 } | 152 } |
| 153 |
| 154 } // namespace internal |
OLD | NEW |