1 #ifndef DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_ITEM_H_ // NOLINT 2 #define DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_ITEM_H_ // NOLINT 3 4 #include <memory> 5 #include <string> 6 #include <unordered_map> 7 8 #include "dynamic_depth/dimension.h" 9 #include "dynamic_depth/element.h" 10 #include "dynamic_depth/point.h" 11 #include "xmpmeta/xml/deserializer.h" 12 #include "xmpmeta/xml/serializer.h" 13 14 namespace dynamic_depth { 15 struct ItemParams { 16 // Required fields. 17 string mime; // Must not be empty. 18 unsigned int length; // Must not be zero. 19 20 // Optional. 21 unsigned int padding; 22 string data_uri; 23 24 // Only for final file serialization - not used in XMP metadata I/O. 25 // IMPORTANT: Callers should enforce that this file exists. 26 // TODO(miraleung): This could be stored as char* to optimize performance. 27 string payload_to_serialize; 28 ItemParamsItemParams29 ItemParams(const string& in_mime, unsigned int len) 30 : mime(in_mime), 31 length(len), 32 padding(0), 33 data_uri(""), 34 payload_to_serialize("") {} ItemParamsItemParams35 ItemParams(const string& in_mime, unsigned int len, const string& uri) 36 : mime(in_mime), 37 length(len), 38 padding(0), 39 data_uri(uri), 40 payload_to_serialize("") {} 41 42 inline bool operator==(const ItemParams& other) const { 43 return mime == other.mime && length == other.length && 44 padding == other.padding && data_uri == other.data_uri && 45 payload_to_serialize == other.payload_to_serialize; 46 } 47 48 inline bool operator!=(const ItemParams& other) const { 49 return !(*this == other); 50 } 51 }; 52 53 class Item : public Element { 54 public: 55 void GetNamespaces( 56 std::unordered_map<string, string>* ns_name_href_map) override; 57 58 bool Serialize( 59 ::dynamic_depth::xmpmeta::xml::Serializer* serializer) const override; 60 61 static std::unique_ptr<Item> FromData(const ItemParams& params); 62 63 // Returns the deserialized item elements, null if parsing failed for all 64 // items. 65 static std::unique_ptr<Item> FromDeserializer( 66 const ::dynamic_depth::xmpmeta::xml::Deserializer& parent_deserializer); 67 68 const string& GetMime() const; 69 unsigned int GetLength() const; 70 const string& GetDataUri() const; 71 unsigned int GetPadding() const; 72 const string& GetPayloadToSerialize() const; 73 74 // Disallow copying. 75 Item(const Item&) = delete; 76 void operator=(const Item&) = delete; 77 78 private: 79 Item(const ItemParams& params); 80 static std::unique_ptr<Item> FromDataInternal(const ItemParams& params, 81 bool check_filepath); 82 83 ItemParams params_; 84 }; 85 86 } // namespace dynamic_depth 87 88 #endif // DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_ITEM_H_ // NOLINT 89