summaryrefslogtreecommitdiffstats
path: root/mojo/public/tools/bindings/generators
diff options
context:
space:
mode:
authorrockot <rockot@chromium.org>2016-02-23 01:20:03 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-23 09:20:58 +0000
commit05b616cfea71b208b2aea4ebc025793272e2f2ff (patch)
tree6f634ff5e60adcbf19500f49e3f3ac98a9c57ba3 /mojo/public/tools/bindings/generators
parent11efbc5592132de8ad0f2e5ef158ecaf91cb8861 (diff)
downloadchromium_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')
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl1
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl47
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl29
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 %}