1 #include "dynamic_depth/vendor_info.h"
2 
3 #include "android-base/logging.h"
4 #include "dynamic_depth/const.h"
5 #include "xmpmeta/base64.h"
6 #include "xmpmeta/xml/utils.h"
7 
8 using ::dynamic_depth::xmpmeta::xml::Deserializer;
9 using ::dynamic_depth::xmpmeta::xml::Serializer;
10 
11 namespace dynamic_depth {
12 namespace {
13 
14 const char kPropertyPrefix[] = "VendorInfo";
15 const char kModel[] = "Model";
16 const char kManufacturer[] = "Manufacturer";
17 const char kNotes[] = "Notes";
18 
19 const char kNamespaceHref[] = "http://ns.google.com/photos/dd/1.0/vendorinfo/";
20 
21 }  // namespace
22 
23 // Private constructor.
VendorInfo()24 VendorInfo::VendorInfo() : manufacturer_(""), model_(""), notes_("") {}
25 
26 // Public methods.
GetNamespaces(std::unordered_map<string,string> * ns_name_href_map)27 void VendorInfo::GetNamespaces(
28     std::unordered_map<string, string>* ns_name_href_map) {
29   if (ns_name_href_map == nullptr) {
30     LOG(ERROR) << "Namespace list or own namespace is null";
31     return;
32   }
33   ns_name_href_map->insert(
34       std::pair<string, string>(kPropertyPrefix, kNamespaceHref));
35 }
36 
FromData(const string & manufacturer,const string & model,const string & notes)37 std::unique_ptr<VendorInfo> VendorInfo::FromData(const string& manufacturer,
38                                                  const string& model,
39                                                  const string& notes) {
40   if (manufacturer.empty()) {
41     LOG(ERROR) << "No manufacturer data given";
42     return nullptr;
43   }
44   std::unique_ptr<VendorInfo> vendor_info(new VendorInfo());
45   vendor_info->model_ = model;
46   vendor_info->manufacturer_ = manufacturer;
47   vendor_info->notes_ = notes;
48   return vendor_info;
49 }
50 
FromDeserializer(const Deserializer & parent_deserializer,const string & namespace_str)51 std::unique_ptr<VendorInfo> VendorInfo::FromDeserializer(
52     const Deserializer& parent_deserializer, const string& namespace_str) {
53   std::unique_ptr<Deserializer> deserializer =
54       parent_deserializer.CreateDeserializer(namespace_str, kPropertyPrefix);
55   if (deserializer == nullptr) {
56     return nullptr;
57   }
58 
59   std::unique_ptr<VendorInfo> vendor_info(new VendorInfo());
60   if (!vendor_info->ParseFields(*deserializer)) {
61     return nullptr;
62   }
63   return vendor_info;
64 }
65 
GetManufacturer() const66 const string& VendorInfo::GetManufacturer() const { return manufacturer_; }
GetModel() const67 const string& VendorInfo::GetModel() const { return model_; }
GetNotes() const68 const string& VendorInfo::GetNotes() const { return notes_; }
69 
Serialize(Serializer * serializer) const70 bool VendorInfo::Serialize(Serializer* serializer) const {
71   if (serializer == nullptr) {
72     LOG(ERROR) << "Serializer is null";
73     return false;
74   }
75 
76   // Write required field.
77   if (!serializer->WriteProperty(DynamicDepthConst::VendorInfo(), kManufacturer,
78                                  manufacturer_)) {
79     return false;
80   }
81 
82   // Write optional fields.
83   if (!model_.empty()) {
84     serializer->WriteProperty(DynamicDepthConst::VendorInfo(), kModel, model_);
85   }
86   if (!notes_.empty()) {
87     serializer->WriteProperty(DynamicDepthConst::VendorInfo(), kNotes, notes_);
88   }
89   return true;
90 }
91 
92 // Private methods.
ParseFields(const Deserializer & deserializer)93 bool VendorInfo::ParseFields(const Deserializer& deserializer) {
94   // Required field.
95   if (!deserializer.ParseString(DynamicDepthConst::VendorInfo(), kManufacturer,
96                                 &manufacturer_)) {
97     return false;
98   }
99 
100   // Optional fields.
101   deserializer.ParseString(DynamicDepthConst::VendorInfo(), kModel, &model_);
102   deserializer.ParseString(DynamicDepthConst::VendorInfo(), kNotes, &notes_);
103   return true;
104 }
105 
106 }  // namespace dynamic_depth
107