1size_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 11void 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{%- if pf.field.kind|is_any_array_kind %} 19 mojo::SerializeArray_<{{pf.field.kind|get_array_validate_params|indent(26)}}>( 20 mojo::internal::Forward(input->{{pf.field.name}}), buf, &result->{{pf.field.name}}.ptr); 21{%- else %} 22 Serialize_(mojo::internal::Forward(input->{{pf.field.name}}), buf, &result->{{pf.field.name}}.ptr); 23{%- endif %} 24{%- if not pf.field.kind|is_nullable_kind %} 25 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( 26 !result->{{pf.field.name}}.ptr, 27 mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, 28 "null {{pf.field.name}} field in {{struct.name}} struct"); 29{%- endif %} 30{%- elif pf.field.kind|is_any_handle_kind %} 31{%- if pf.field.kind|is_interface_kind %} 32 result->{{pf.field.name}} = input->{{pf.field.name}}.PassMessagePipe().release(); 33{%- else %} 34 result->{{pf.field.name}} = input->{{pf.field.name}}.release(); 35{%- endif %} 36{%- if not pf.field.kind|is_nullable_kind %} 37 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( 38 !result->{{pf.field.name}}.is_valid(), 39 mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, 40 "invalid {{pf.field.name}} field in {{struct.name}} struct"); 41{%- endif %} 42{%- else %} 43 result->{{pf.field.name}} = input->{{pf.field.name}}; 44{%- endif %} 45{%- endfor %} 46 *output = result; 47 } else { 48 *output = NULL; 49 } 50} 51 52void Deserialize_(internal::{{struct.name}}_Data* input, 53 {{struct.name}}Ptr* output) { 54 if (input) { 55 {{struct.name}}Ptr result({{struct.name}}::New()); 56{%- for pf in struct.packed.packed_fields %} 57{%- if pf.field.kind|is_object_kind %} 58 Deserialize_(input->{{pf.field.name}}.ptr, &result->{{pf.field.name}}); 59{%- elif pf.field.kind|is_interface_kind %} 60 if (input->{{pf.field.name}}.is_valid()) 61 result->{{pf.field.name}}.Bind(mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&input->{{pf.field.name}}))); 62{%- elif pf.field.kind|is_any_handle_kind %} 63 result->{{pf.field.name}}.reset(mojo::internal::FetchAndReset(&input->{{pf.field.name}})); 64{%- elif pf.field.kind|is_enum_kind %} 65 result->{{pf.field.name}} = static_cast<{{pf.field.kind|cpp_wrapper_type}}>( 66 input->{{pf.field.name}}); 67{%- else %} 68 result->{{pf.field.name}} = input->{{pf.field.name}}; 69{%- endif %} 70{%- endfor %} 71 *output = result.Pass(); 72 } else { 73 output->reset(); 74 } 75} 76