summaryrefslogtreecommitdiff
path: root/internal/xmpmeta/xml/deserializer_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'internal/xmpmeta/xml/deserializer_impl.h')
-rw-r--r--internal/xmpmeta/xml/deserializer_impl.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/internal/xmpmeta/xml/deserializer_impl.h b/internal/xmpmeta/xml/deserializer_impl.h
new file mode 100644
index 0000000..65df2d6
--- /dev/null
+++ b/internal/xmpmeta/xml/deserializer_impl.h
@@ -0,0 +1,93 @@
+#ifndef DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_DESERIALIZER_IMPL_H_ // NOLINT
+#define DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_DESERIALIZER_IMPL_H_ // NOLINT
+
+#include <libxml/tree.h>
+
+#include <map>
+#include <mutex> // NOLINT(build/c++11)
+#include <string>
+
+#include "base/port.h"
+#include "xmpmeta/xml/deserializer.h"
+
+namespace photos_editing_formats {
+namespace xml {
+
+// Deserializes an XML node.
+// Example:
+// xmlNodePtr device_node =
+// DepthFirstSearch(xmp.ExtendedSection(), "Device", "Description");
+// DeserializerImpl deserializer(device_node);
+// string revision;
+// deserializer.ParseString("Device", "Revision", &revision);
+// TODO(miraleung): Add example for list node deserializer.
+class DeserializerImpl : public Deserializer {
+ public:
+ // Creates a deserializer with a null rdf:Seq node.
+ explicit DeserializerImpl(const xmlNodePtr node);
+
+ // Returns a Deserializer.
+ // If prefix is empty, the deserializer will be created on the first node
+ // found with a name that matches child_name.
+ // child_name is the name of the next node to deserialize.
+ std::unique_ptr<Deserializer> CreateDeserializer(
+ const string& prefix, const string& child_name) const override;
+
+ // Returns a Deserializer from a list element node, if one is available as
+ // a descendant of node_.
+ // If prefix is empty, the deserializer will be created on the first node
+ // found with a name that matches child_name.
+ // Returns null if seq_node_ is null or if the index is out of range.
+ std::unique_ptr<Deserializer> CreateDeserializerFromListElementAt(
+ const string& prefix, const string& list_name, int index) const override;
+
+ // Parsers for XML properties.
+ // If prefix is empty, the node's namespace may be null. Otherwise, it must
+ // not be null.
+ bool ParseBase64(const string& prefix, const string& name,
+ string* value) const override;
+ bool ParseIntArrayBase64(const string& prefix, const string& name,
+ std::vector<int>* values) const override;
+ bool ParseFloatArrayBase64(const string& prefix, const string& name,
+ std::vector<float>* values) const override;
+ bool ParseDoubleArrayBase64(const string& prefix, const string& name,
+ std::vector<double>* values) const override;
+ bool ParseBoolean(const string& prefix, const string& name,
+ bool* value) const override;
+ bool ParseDouble(const string& prefix, const string& name,
+ double* value) const override;
+ bool ParseInt(const string& prefix, const string& name,
+ int* value) const override;
+ bool ParseFloat(const string& prefix, const string& name,
+ float* value) const override;
+ bool ParseLong(const string& prefix, const string& name,
+ int64* value) const override;
+ bool ParseString(const string& prefix, const string& name,
+ string* value) const override;
+
+ // Parses the numbers in an rdf:Seq list into the values collection.
+ // The given collection is cleared of any existing values, and the
+ // parsed numbers are written to it.
+ bool ParseIntArray(const string& prefix, const string& list_name,
+ std::vector<int>* values) const override;
+ bool ParseDoubleArray(const string& prefix, const string& list_name,
+ std::vector<double>* values) const override;
+
+ // Disallow copying.
+ DeserializerImpl(const DeserializerImpl&) = delete;
+ void operator=(const DeserializerImpl&) = delete;
+
+ private:
+ xmlNodePtr node_;
+ // Remembers the parent node of the last deserializer created on the rdf:Seq
+ // node. For performance reasons only, to avoid unnessarily traversing
+ // the XML document tree.
+ mutable xmlNodePtr list_node_;
+ // Lock modifications of list_node_ in const functions to make it thread-safe.
+ mutable std::mutex mtx_;
+};
+
+} // namespace xml
+} // namespace photos_editing_formats
+
+#endif // DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_DESERIALIZER_IMPL_H_ // NOLINT