diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-05-13 14:20:36 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-05-13 14:20:36 +0100 |
| commit | 797916ae28d976f3c5be62d37b45864219af6098 (patch) | |
| tree | a9bf9231987085c0eb9b6c3ce7427e1489929ec8 /src/xml.h | |
| parent | d77d0d1bd972f6343752ca45a3d5e0a0924e2d50 (diff) | |
Use libcxml. Lump all static configuration flags into one.
Diffstat (limited to 'src/xml.h')
| -rw-r--r-- | src/xml.h | 156 |
1 files changed, 72 insertions, 84 deletions
@@ -1,103 +1,91 @@ -#ifndef LIBDCP_XML_H -#define LIBDCP_XML_H +/* + Copyright (C) 2013 Carl Hetherington <cth@carlh.net> -#include <string> -#include <list> -#include <stdint.h> -#include <glibmm.h> -#include <boost/shared_ptr.hpp> -#include <boost/optional.hpp> -#include "types.h" -#include "exceptions.h" -#include "dcp_time.h" + This program 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. -namespace xmlpp { - class Node; - class DomParser; -} + This program 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. -namespace libdcp { + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -/** @brief A helper class for XML nodes */ -class XMLNode -{ -public: - XMLNode (); - XMLNode (xmlpp::Node const * node); +*/ - std::string string_child (std::string); - std::string optional_string_child (std::string); - ContentKind kind_child (std::string); - Fraction fraction_child (std::string); - int64_t int64_child (std::string); - int64_t optional_int64_child (std::string); - float float_child (std::string); - void ignore_child (std::string); - void done (); +#ifndef LIBDCP_XML_H +#define LIBDCP_XML_H - Time time_attribute (std::string); - float float_attribute (std::string); - std::string string_attribute (std::string); - std::string optional_string_attribute (std::string); - int64_t int64_attribute (std::string); - int64_t optional_int64_attribute (std::string); - boost::optional<bool> optional_bool_attribute (std::string); - boost::optional<Color> optional_color_attribute (std::string); +#include <libcxml/cxml.h> +#include "exceptions.h" - std::string content (); +namespace libdcp +{ - template <class T> - boost::shared_ptr<T> type_child (std::string name) { - return boost::shared_ptr<T> (new T (node_child (name))); +template <class T> +boost::shared_ptr<T> +optional_type_child (cxml::Node const & node, std::string name) +{ + std::list<boost::shared_ptr<cxml::Node> > n = node.node_children (name); + if (n.size() > 1) { + throw XMLError ("duplicate XML tag"); + } else if (n.empty ()) { + return boost::shared_ptr<T> (); } - template <class T> - boost::shared_ptr<T> optional_type_child (std::string name) { - std::list<xmlpp::Node*> n = node_children (name); - if (n.size() > 1) { - throw XMLError ("duplicate XML tag"); - } else if (n.empty ()) { - return boost::shared_ptr<T> (); - } - - return boost::shared_ptr<T> (new T (n.front ())); - } + return boost::shared_ptr<T> (new T (n.front ())); +} + +template <class T> +boost::shared_ptr<T> type_child (boost::shared_ptr<const cxml::Node> node, std::string name) { + return boost::shared_ptr<T> (new T (node->node_child (name))); +} - template <class T> - std::list<boost::shared_ptr<T> > type_children (std::string name) { - std::list<xmlpp::Node*> n = node_children (name); - std::list<boost::shared_ptr<T> > r; - for (typename std::list<xmlpp::Node*>::iterator i = n.begin(); i != n.end(); ++i) { - r.push_back (boost::shared_ptr<T> (new T (*i))); - } - return r; - } +template <class T> +boost::shared_ptr<T> +optional_type_child (boost::shared_ptr<const cxml::Node> node, std::string name) +{ + return optional_type_child<T> (*node.get(), name); +} - template <class T> - std::list<boost::shared_ptr<T> > type_grand_children (std::string name, std::string sub) { - XMLNode p (node_child (name)); - return p.type_children<T> (sub); +template <class T> +std::list<boost::shared_ptr<T> > +type_children (cxml::Node const & node, std::string name) +{ + std::list<boost::shared_ptr<cxml::Node> > n = node.node_children (name); + std::list<boost::shared_ptr<T> > r; + for (typename std::list<boost::shared_ptr<cxml::Node> >::iterator i = n.begin(); i != n.end(); ++i) { + r.push_back (boost::shared_ptr<T> (new T (*i))); } + return r; +} - xmlpp::Node const * _node; - -private: - xmlpp::Node* node_child (std::string); - std::list<xmlpp::Node*> node_children (std::string); - std::list<Glib::ustring> _taken; -}; - -/** @brief A helper class for XML files */ -class XMLFile : public XMLNode +template <class T> +std::list<boost::shared_ptr<T> > +type_children (boost::shared_ptr<const cxml::Node> node, std::string name) { -public: - XMLFile (std::string file, std::string root_name); - virtual ~XMLFile (); - -private: - xmlpp::DomParser* _parser; -}; + return type_children<T> (*node.get(), name); +} + +template <class T> +std::list<boost::shared_ptr<T> > +type_grand_children (cxml::Node const & node, std::string name, std::string sub) +{ + boost::shared_ptr<const cxml::Node> p = node.node_child (name); + return type_children<T> (p, sub); +} +template <class T> +std::list<boost::shared_ptr<T> > +type_grand_children (boost::shared_ptr<const cxml::Node> node, std::string name, std::string sub) +{ + return type_grand_children<T> (*node.get(), name, sub); +} + } #endif |
