| Index: mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
|
| diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
|
| index 6ac6a3ea7ab800b3cc6c36cc7b4f17847e995f78..e80b405d5506046414e64172b562a542f3876b36 100644
|
| --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
|
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
|
| @@ -5,34 +5,70 @@ size_t {{struct.name}}::GetSerializedSize() const {
|
| }
|
|
|
| bool {{struct.name}}::Serialize(void* buf,
|
| - size_t buf_size) {
|
| + size_t buf_size,
|
| + size_t* bytes_written) {
|
| + MOJO_DCHECK(buf);
|
| +
|
| mojo::internal::FixedBuffer overlay_buf;
|
| overlay_buf.Initialize(buf, buf_size);
|
|
|
| internal::{{struct.name}}_Data* output_ptr;
|
| - if (Serialize_(this, &overlay_buf, &output_ptr) !=
|
| - mojo::internal::ValidationError::NONE) {
|
| + auto err = Serialize_(this, &overlay_buf, &output_ptr);
|
| + if (err != mojo::internal::ValidationError::NONE) {
|
| // TODO(vardhan): Once Serialize_() outputs handles that it serialized
|
| // (even partially, if there are failures), we should CHECK fail here if
|
| // handles are non-empty.
|
| + MOJO_DLOG(ERROR) << "Could not serialize: " <<
|
| + mojo::internal::ValidationErrorToString(err);
|
| +
|
| + if (bytes_written)
|
| + *bytes_written = overlay_buf.BytesUsed();
|
| return false;
|
| }
|
|
|
| std::vector<mojo::Handle> handles;
|
| output_ptr->EncodePointersAndHandles(&handles);
|
| -
|
| MOJO_CHECK(handles.empty()) << "Serialize() does not support handles.";
|
|
|
| + if (bytes_written)
|
| + *bytes_written = overlay_buf.BytesUsed();
|
| + return true;
|
| +}
|
| +
|
| +bool {{struct.name}}::Deserialize(void* buf, size_t buf_size) {
|
| + MOJO_DCHECK(buf);
|
| +
|
| + mojo::internal::BoundsChecker checker(buf, buf_size, 0);
|
| +
|
| + std::string* err_str = nullptr;
|
| +#if !defined(NDEBUG)
|
| + std::string err_str2;
|
| + err_str = &err_str2;
|
| +#endif
|
| +
|
| + mojo::internal::ValidationError err =
|
| + internal::{{struct.name}}_Data::Validate(buf, &checker, err_str);
|
| + if (err != mojo::internal::ValidationError::NONE) {
|
| + MOJO_DLOG(ERROR) << "Deserialization error "
|
| + << mojo::internal::ValidationErrorToString(err)
|
| + << ": " << *err_str;
|
| + return false;
|
| + }
|
| +
|
| + DeserializeWithoutValidation(buf);
|
| return true;
|
| }
|
|
|
| -void {{struct.name}}::Deserialize(void* buf) {
|
| +// TODO(vardhan): Make this |buf| a |const void*| once deserialization becomes
|
| +// immutable.
|
| +void {{struct.name}}::DeserializeWithoutValidation(void* buf) {
|
| + MOJO_DCHECK(buf);
|
| +
|
| internal::{{struct.name}}_Data* input =
|
| static_cast<internal::{{struct.name}}_Data*>(buf);
|
| -
|
| std::vector<mojo::Handle> handles;
|
| input->DecodePointersAndHandles(&handles);
|
| - MOJO_CHECK(handles.empty()) << "Deserialize() does not support handles.";
|
| + MOJO_CHECK(handles.empty()) << "Deserialization does not support handles.";
|
|
|
| Deserialize_(input, this);
|
| }
|
|
|