Chromium Code Reviews| 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..c0ce7a2292f12217e78d11b8c1d88f7b3a0f09d0 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,64 @@ 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; | 
| 
 
viettrungluu
2016/03/30 17:49:01
You probably shouldn't unconditionally have an |st
 
vardhan
2016/03/30 22:49:07
Done.
 
 | 
| + 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); | 
| } |