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, ¬es_);
103 return true;
104 }
105
106 } // namespace dynamic_depth
107