xref: /aosp_15_r20/external/dynamic_depth/internal/xmpmeta/xml/serializer.h (revision a62be0856e8e1158f43b03e41bbad10f4d005fde)
1*a62be085SSadaf Ebrahimi #ifndef DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SERIALIZER_H_  // NOLINT
2*a62be085SSadaf Ebrahimi #define DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SERIALIZER_H_  // NOLINT
3*a62be085SSadaf Ebrahimi 
4*a62be085SSadaf Ebrahimi #include <memory>
5*a62be085SSadaf Ebrahimi #include <string>
6*a62be085SSadaf Ebrahimi #include <vector>
7*a62be085SSadaf Ebrahimi 
8*a62be085SSadaf Ebrahimi #include "base/port.h"
9*a62be085SSadaf Ebrahimi 
10*a62be085SSadaf Ebrahimi namespace dynamic_depth {
11*a62be085SSadaf Ebrahimi namespace xmpmeta {
12*a62be085SSadaf Ebrahimi namespace xml {
13*a62be085SSadaf Ebrahimi 
14*a62be085SSadaf Ebrahimi // Serializes properties for a hierarchy of objects.
15*a62be085SSadaf Ebrahimi // Example:
16*a62be085SSadaf Ebrahimi //  BookSerializer serializer();
17*a62be085SSadaf Ebrahimi //  // Serialize a list of objects.
18*a62be085SSadaf Ebrahimi //  std::unique_ptr<Serializer> book_list_serializer =
19*a62be085SSadaf Ebrahimi //      serializer->CreateListSerializer("Books");
20*a62be085SSadaf Ebrahimi //  for (Book *book : book_list) {
21*a62be085SSadaf Ebrahimi //    std::unique_ptr<Serializer> book_serializer =
22*a62be085SSadaf Ebrahimi //        cameras_serializer->CreateItemSerializer("Book");
23*a62be085SSadaf Ebrahimi //    success &= book->Serialize(book_serializer.get());
24*a62be085SSadaf Ebrahimi //
25*a62be085SSadaf Ebrahimi //    // Write properties in an object.
26*a62be085SSadaf Ebrahimi //    // This would be called from the Book class.
27*a62be085SSadaf Ebrahimi //    string book_name("Book");
28*a62be085SSadaf Ebrahimi //    std::unique_ptr<Serializer> book_info_serializer =
29*a62be085SSadaf Ebrahimi //        book_serializer->CreateSerializer("Info");
30*a62be085SSadaf Ebrahimi //    book_info_serializer->WriteProperty("Author", "Cereal Eyser");
31*a62be085SSadaf Ebrahimi //    book_info_serializer->WriteProperty("ISBN", "314159265359");
32*a62be085SSadaf Ebrahimi //    std::unique_ptr<Serializer> genre_serializer =
33*a62be085SSadaf Ebrahimi //        book_serializer->CreateSeralizer("Genre", true);
34*a62be085SSadaf Ebrahimi //    std::unique_ptr<Serializer> fantasy_serializer =
35*a62be085SSadaf Ebrahimi //        genre_serializer->CreateSerialzer("Fantasy");
36*a62be085SSadaf Ebrahimi //    // Serialize genre properties here.
37*a62be085SSadaf Ebrahimi //  }
38*a62be085SSadaf Ebrahimi 
39*a62be085SSadaf Ebrahimi class Serializer {
40*a62be085SSadaf Ebrahimi  public:
~Serializer()41*a62be085SSadaf Ebrahimi   virtual ~Serializer() {}
42*a62be085SSadaf Ebrahimi 
43*a62be085SSadaf Ebrahimi   // Returns a Serializer for an object that is an item in a list.
44*a62be085SSadaf Ebrahimi   virtual std::unique_ptr<Serializer> CreateItemSerializer(
45*a62be085SSadaf Ebrahimi       const string& prefix, const string& item_name) const = 0;
46*a62be085SSadaf Ebrahimi 
47*a62be085SSadaf Ebrahimi   // Returns a Serializer for a list of objects.
48*a62be085SSadaf Ebrahimi   virtual std::unique_ptr<Serializer> CreateListSerializer(
49*a62be085SSadaf Ebrahimi       const string& prefix, const string& list_name) const = 0;
50*a62be085SSadaf Ebrahimi 
51*a62be085SSadaf Ebrahimi   // Creates a serializer from the current serializer.
52*a62be085SSadaf Ebrahimi   // node_ns_name is the XML namespace to which the newly created node belongs.
53*a62be085SSadaf Ebrahimi   // If this parameter is an empty string, the new node will not belong to a
54*a62be085SSadaf Ebrahimi   // namespace.
55*a62be085SSadaf Ebrahimi   // node_name is the name of the new node. This parameter cannot be an empty
56*a62be085SSadaf Ebrahimi   // string.
57*a62be085SSadaf Ebrahimi   virtual std::unique_ptr<Serializer> CreateSerializer(
58*a62be085SSadaf Ebrahimi       const string& node_ns_name, const string& node_name) const = 0;
59*a62be085SSadaf Ebrahimi 
60*a62be085SSadaf Ebrahimi   // Serializes a property with the given prefix.
61*a62be085SSadaf Ebrahimi   // Example: <NodeName PropertyPrefix:PropertyName="PropertyValue" />
62*a62be085SSadaf Ebrahimi   virtual bool WriteBoolProperty(const string& prefix, const string& name,
63*a62be085SSadaf Ebrahimi                                  bool value) const = 0;
64*a62be085SSadaf Ebrahimi   virtual bool WriteProperty(const string& prefix, const string& name,
65*a62be085SSadaf Ebrahimi                              const string& value) const = 0;
66*a62be085SSadaf Ebrahimi 
67*a62be085SSadaf Ebrahimi   // Serializes the collection of values.
68*a62be085SSadaf Ebrahimi   virtual bool WriteIntArray(const string& prefix, const string& array_name,
69*a62be085SSadaf Ebrahimi                              const std::vector<int>& values) const = 0;
70*a62be085SSadaf Ebrahimi   virtual bool WriteDoubleArray(const string& prefix, const string& array_name,
71*a62be085SSadaf Ebrahimi                                 const std::vector<double>& values) const = 0;
72*a62be085SSadaf Ebrahimi };
73*a62be085SSadaf Ebrahimi 
74*a62be085SSadaf Ebrahimi }  // namespace xml
75*a62be085SSadaf Ebrahimi }  // namespace xmpmeta
76*a62be085SSadaf Ebrahimi }  // namespace dynamic_depth
77*a62be085SSadaf Ebrahimi 
78*a62be085SSadaf Ebrahimi #endif // DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SERIALIZER_H_  // NOLINT
79