Index: mojo/public/cpp/bindings/struct_traits.h |
diff --git a/mojo/public/cpp/bindings/struct_traits.h b/mojo/public/cpp/bindings/struct_traits.h |
index fb7290b20ab7c4effc89177a64250606d6868dca..ee9a336ba186e1f15b6bcfe6e57427069284e32e 100644 |
--- a/mojo/public/cpp/bindings/struct_traits.h |
+++ b/mojo/public/cpp/bindings/struct_traits.h |
@@ -10,22 +10,97 @@ namespace mojo { |
// This must be specialized for any type |T| to be serialized/deserialized as |
// a mojom struct of type |MojomType|. |
// |
-// Each specialization must implement a few things: |
-// |
+// Each specialization needs to implement a few things: |
// 1. Static getters for each field in the Mojom type. These should be |
// of the form: |
// |
-// static <return type> <field name>(const T&) |
+// static <return type> <field name>(const T& input); |
// |
// and should return a serializable form of the named field as extracted |
-// from the referenced |T| instance. |
+// from |input|. |
+// |
+// Serializable form of a field: |
+// Value or reference of the same type used in |MojomType|, or the |
+// following alternatives: |
+// - string: |
+// Value or reference of any type that has a StringTraits defined. |
+// Supported by default: base::StringPiece, std::string. |
+// |
+// - array: |
+// Value or reference of any type that has an ArrayTraits defined. |
+// Supported by default: std::vector, WTF::Vector (in blink). |
+// |
+// - struct: |
+// Value or reference of any type that has a StructTraits defined. |
+// |
+// 2. A static Read() method to set the contents of a |T| instance from a |
+// |MojomType|DataView (e.g., if |MojomType| is test::Example, the data |
+// view will be test::ExampleDataView). |
+// |
+// static bool Read(|MojomType|DataView data, T* output); |
+// |
+// The generated |MojomType|DataView type provides a convenient, |
+// inexpensive view of a serialized struct's field data. |
+// |
+// Returning false indicates invalid incoming data and causes the message |
+// pipe receiving it to be disconnected. Therefore, you can do custom |
+// validation for |T| in this method. |
+// |
+// 3. [Optional] A static IsNull() method indicating whether a given |T| |
+// instance is null: |
+// |
+// static bool IsNull(const T& input); |
+// |
+// If this method returns true, it is guaranteed that none of the getters |
+// (described in section 1) will be called for the same |input|. So you |
+// don't have to check whether |input| is null in those getters. |
+// |
+// If it is not defined, |T| instances are always considered non-null. |
+// |
+// [Optional] A static SetToNull() method to set the contents of a given |
+// |T| instance to null. |
+// |
+// static void SetToNull(T* output); |
+// |
+// When a null serialized struct is received, the deserialization code |
+// calls this method instead of Read(). |
+// |
+// NOTE: It is to set |*output|'s contents to a null state, not to set the |
+// |output| pointer itself to null. "Null state" means whatever state you |
+// think it makes sense to map a null serialized struct to. |
+// |
+// If it is not defined, null is not allowed to be converted to |T|. In |
+// that case, an incoming null value is considered invalid and causes the |
+// message pipe to be disconnected. |
+// |
+// EXAMPLE: |
+// |
+// Mojom definition: |
+// struct Bar {}; |
+// struct Foo { |
+// int32 f_integer; |
+// string f_string; |
+// array<string> f_string_array; |
+// Bar f_bar; |
+// }; |
// |
-// 2. A static Read method to initialize a new |T| from a MojomType::Reader: |
+// StructTraits for Foo: |
+// template <> |
+// struct StructTraits<Foo, CustomFoo> { |
+// // Optional methods dealing with null: |
+// static bool IsNull(const CustomFoo& input); |
+// static void SetToNull(CustomFoo* output); |
// |
-// static bool Read(MojomType::Reader r, T* out); |
+// // Field getters: |
+// static int32_t f_integer(const CustomFoo& input); |
+// static const std::string& f_string(const CustomFoo& input); |
+// static const std::vector<std::string>& f_string_array( |
+// const CustomFoo& input); |
+// // Assuming there is a StructTraits<Bar, CustomBar> defined. |
+// static const CustomBar& f_bar(const CustomFoo& input); |
// |
-// The generated MojomType::Reader type provides a convenient, inexpensive |
-// view of a serialized struct's field data. |
+// static bool Read(FooDataView data, CustomFoo* output); |
+// }; |
// |
template <typename MojomType, typename T> |
struct StructTraits; |