diff options
author | rockot <rockot@chromium.org> | 2016-02-23 01:20:03 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-23 09:20:58 +0000 |
commit | 05b616cfea71b208b2aea4ebc025793272e2f2ff (patch) | |
tree | 6f634ff5e60adcbf19500f49e3f3ac98a9c57ba3 /mojo/public/tools/bindings/generators | |
parent | 11efbc5592132de8ad0f2e5ef158ecaf91cb8861 (diff) | |
download | chromium_src-05b616cfea71b208b2aea4ebc025793272e2f2ff.zip chromium_src-05b616cfea71b208b2aea4ebc025793272e2f2ff.tar.gz chromium_src-05b616cfea71b208b2aea4ebc025793272e2f2ff.tar.bz2 |
Mojo bindings: Add string support to StructTraits
This CL enables string-typed fields in structs to be
serialized and deserialized via StructTraits using
base::StringPiece as an intermediate interface between
the native type and the message buffer.
BUG=577686
R=yzshen@chromium.org
Review URL: https://codereview.chromium.org/1719183002
Cr-Commit-Position: refs/heads/master@{#376952}
Diffstat (limited to 'mojo/public/tools/bindings/generators')
3 files changed, 70 insertions, 7 deletions
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl index 2691e772..fa7dd15 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl @@ -18,6 +18,7 @@ #include <stdint.h> #include <ostream> +#include "base/strings/string_piece.h" #include "mojo/public/cpp/bindings/array.h" #include "mojo/public/cpp/bindings/associated_interface_ptr.h" #include "mojo/public/cpp/bindings/associated_interface_ptr_info.h" diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl index a2cee64..d0ef30a4 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl @@ -53,8 +53,13 @@ class {{struct.name}}_Reader { {%- for pf in struct.packed.packed_fields_in_ordinal_order %} {%- set kind = pf.field.kind -%} {%- set name = pf.field.name -%} +{%- if kind|is_nullable_kind %} + bool has_{{name}}() const; +{%- endif %} {%- if kind|is_struct_kind and not kind|is_native_only_kind %} {{kind|get_name_for_kind}}::Reader {{name}}() const; +{%- elif kind|is_string_kind %} + base::StringPiece {{name}}() const; {%- elif kind|is_union_kind %} // TODO(rockot): Support reading unions. ({{name}}() omitted) {%- elif kind|is_object_kind %} @@ -86,10 +91,21 @@ struct {{struct.name}}_SerializerTraits_ { static size_t GetSize(const NativeType& input) { size_t size = sizeof(internal::{{struct.name}}_Data); {%- for pf in struct.packed.packed_fields_in_ordinal_order %} -{%- if pf.field.kind|is_object_kind %} - NOTREACHED() << "Mojom struct traits only support POD fields at this time. " - << "Cannot determine the size of field {{pf.field.name}}"; + do { +{%- if pf.field.kind|is_nullable_kind %} + if (!mojo::StructTraits<{{struct.name}}, NativeType> + ::has_{{pf.field.name}}(input)) + break; +{%- endif %} +{%- if pf.field.kind|is_string_kind %} + size += mojo::internal::String_Data::Traits::GetStorageSize( + static_cast<uint32_t>(mojo::StructTraits<{{struct.name}}, NativeType> + ::{{pf.field.name}}(input).size())); +{%- elif pf.field.kind|is_object_kind %} + NOTREACHED() << "Unsupported field type for StructTraits: " + << "{{pf.field.name}}"; {%- endif %} + } while (false); {%- endfor %} return size; } @@ -99,11 +115,30 @@ struct {{struct.name}}_SerializerTraits_ { internal::{{struct.name}}_Data** output) { internal::{{struct.name}}_Data* result = internal::{{struct.name}}_Data::New(buffer); -{%- for pf in struct.packed.packed_fields_in_ordinal_order %} +{%- for pf in struct.packed.packed_fields_in_ordinal_order -%} {%- set name = pf.field.name -%} {%- set kind = pf.field.kind %} - result->{{name}} = mojo::StructTraits<{{struct.name}}, NativeType> - ::{{name}}(input); + do { +{%- if kind|is_nullable_kind %} + if (!mojo::StructTraits<{{struct.name}}, NativeType> + ::has_{{name}}(input)) + break; +{%- endif %} +{%- if kind|is_string_kind %} + base::StringPiece input_{{name}} = + mojo::StructTraits<{{struct.name}}, NativeType>::{{name}}(input); + result->{{name}}.ptr = + mojo::internal::String_Data::New(input_{{name}}.size(), buffer); + memcpy(result->{{name}}.ptr->storage(), input_{{name}}.data(), + input_{{name}}.size()); +{%- elif kind|is_object_kind %} + NOTREACHED() << "Unsupported field type for StructTraits: " + << "{{pf.field.name}}"; +{%- else %} + result->{{name}} = mojo::StructTraits<{{struct.name}}, NativeType> + ::{{name}}(input); +{%- endif %} + } while (false); {%- endfor %} *output = result; } 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 e6577b9..485a8ec 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 @@ -39,11 +39,38 @@ bool Deserialize_(internal::{{struct.name}}_Data* input, {%- for pf in struct.packed.packed_fields_in_ordinal_order %} {%- set name = pf.field.name -%} -{%- set kind = pf.field.kind -%} +{%- set kind = pf.field.kind %} +{%- if kind|is_nullable_kind %} +bool {{struct.name}}_Reader::has_{{name}}() const { +{%- if kind|is_union_kind %} + return !data_->{{name}}.is_null(); +{%- elif kind|is_object_kind %} + return data_->{{name}}.ptr != nullptr; +{%- elif kind|is_interface_kind %} + return data_->{{name}}.handle.is_valid(); +{%- elif kind|is_interface_request_kind %} + return data_->{{name}}.is_valid(); +{%- elif kind|is_associated_interface_kind %} + return data_->{{name}}.interface_id == mojo::internal::kInvalidInterfaceId; +{%- elif kind|is_associated_interface_request_kind %} + return data_->{{name}} == mojo::internal::kInvalidInterfaceId; +{%- elif kind|is_any_handle_kind %} + return data_->{{name}}.is_valid(); +{%- else %} + return !!data_->{{name}}; +{%- endif %} +} +{%- endif %} {%- if kind|is_struct_kind and not kind|is_native_only_kind %} {{kind|get_name_for_kind}}_Reader {{struct.name}}_Reader::{{name}}() const { return {{kind|get_name_for_kind}}_Reader(data_->{{name}}.ptr, context_); } +{%- elif kind|is_string_kind %} +base::StringPiece {{struct.name}}_Reader::{{name}}() const { + DCHECK(data_->{{name}}.ptr); + return base::StringPiece(data_->{{name}}.ptr->storage(), + data_->{{name}}.ptr->size()); +} {%- endif %} {%- endfor %} |