X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fxml.h;h=582965a21113942052e19b11b994272295a8178b;hb=b509d21444a1f486b8713a1a652c0f816b2af0cb;hp=85589a0f41d885e52913bd82da40a2d38ffa3d63;hpb=4c987f7feb504fe4011b52ffeb231e3b25823de1;p=libdcp.git diff --git a/src/xml.h b/src/xml.h index 85589a0f..582965a2 100644 --- a/src/xml.h +++ b/src/xml.h @@ -1,95 +1,104 @@ +/* + Copyright (C) 2013-2014 Carl Hetherington + + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + libdcp is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with libdcp. If not, see . + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + #ifndef LIBDCP_XML_H #define LIBDCP_XML_H -#include -#include -#include -#include -#include -#include "types.h" #include "exceptions.h" -#include "dcp_time.h" - -namespace xmlpp { - class Node; - class DomParser; -} +#include -namespace libdcp { +namespace dcp +{ -class XMLNode +template +boost::shared_ptr +optional_type_child (cxml::Node const & node, std::string name) { -public: - XMLNode (); - XMLNode (xmlpp::Node const * node); - -protected: - std::string string_node (std::string); - std::string optional_string_node (std::string); - ContentKind kind_node (std::string); - Fraction fraction_node (std::string); - int64_t int64_node (std::string); - int64_t optional_int64_node (std::string); - float float_node (std::string); - void ignore_node (std::string); - void done (); - - Time time_attribute (std::string); - float float_attribute (std::string); - std::string string_attribute (std::string); - - std::string content (); - - template - boost::shared_ptr sub_node (std::string name) { - return boost::shared_ptr (new T (xml_node (name))); + std::list > n = node.node_children (name); + if (n.size() > 1) { + throw XMLError ("duplicate XML tag"); + } else if (n.empty ()) { + return boost::shared_ptr (); } - template - boost::shared_ptr optional_sub_node (std::string name) { - std::list n = xml_nodes (name); - if (n.size() > 1) { - throw XMLError ("duplicate XML tag"); - } else if (n.empty ()) { - return boost::shared_ptr (); - } - - return boost::shared_ptr (new T (n.front ())); - } - - template - std::list > sub_nodes (std::string name) { - std::list n = xml_nodes (name); - std::list > r; - for (typename std::list::iterator i = n.begin(); i != n.end(); ++i) { - r.push_back (boost::shared_ptr (new T (*i))); - } - return r; - } + return boost::shared_ptr (new T (n.front ())); +} - template - std::list > sub_nodes (std::string name, std::string sub) { - XMLNode p (xml_node (name)); - return p.sub_nodes (sub); - } +template +boost::shared_ptr type_child (boost::shared_ptr node, std::string name) { + return boost::shared_ptr (new T (node->node_child (name))); +} + +template +boost::shared_ptr +optional_type_child (boost::shared_ptr node, std::string name) +{ + return optional_type_child (*node.get(), name); +} - xmlpp::Node const * _node; +template +std::list > +type_children (cxml::Node const & node, std::string name) +{ + std::list > n = node.node_children (name); + std::list > r; + for (typename std::list >::iterator i = n.begin(); i != n.end(); ++i) { + r.push_back (boost::shared_ptr (new T (*i))); + } + return r; +} -private: - xmlpp::Node* xml_node (std::string); - std::list xml_nodes (std::string); - std::list _taken; -}; +template +std::list > +type_children (boost::shared_ptr node, std::string name) +{ + return type_children (*node.get(), name); +} -class XMLFile : public XMLNode +template +std::list > +type_grand_children (cxml::Node const & node, std::string name, std::string sub) { -public: - XMLFile (std::string file, std::string root_name); - virtual ~XMLFile (); + boost::shared_ptr p = node.node_child (name); + return type_children (p, sub); +} -private: - xmlpp::DomParser* _parser; -}; +template +std::list > +type_grand_children (boost::shared_ptr node, std::string name, std::string sub) +{ + return type_grand_children (*node.get(), name, sub); +} }