// Boost.Geometry (aka GGL, Generic Geometry Library)
//
// Copyright (c) 2010-2011 Barend Gehrels, Amsterdam, the Netherlands.
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
//
#ifndef RAPIDXML_UTIL_HPP
#define RAPIDXML_UTIL_HPP


#include <string>
#include <rapidxml.hpp>

class xml_doc : public rapidxml::xml_document<>
{
    public :
        xml_doc(const char* xml)
        {
            // Make a copy because rapidxml destructs string
            m_copy = new char[strlen(xml) + 1];
            strcpy(m_copy, xml);
            this->parse<0>(m_copy);
        };
        virtual ~xml_doc()
        {
            delete[] m_copy;
        }
    private :
        char* m_copy;

};

inline std::string get_attribute(rapidxml::xml_node<>* node, const char* name)
{
    rapidxml::xml_attribute<> *attr = node->first_attribute(name);
    std::string value;
    if (attr)
    {
        value = attr->value();
    }
    return value;
}

inline void get_contents(rapidxml::xml_node<>* node, std::string& contents)
{
    if (node != NULL)
    {
        if (node->type() == rapidxml::node_element)
        {
            //std::cout << "ELEMENT: " << node->name() << "=" << node->value() << std::endl;
        }
        else if (node->type() == rapidxml::node_data)
        {
            contents += node->value();
            //std::cout << "DATA: " << node->name() << "=" << node->value() << std::endl;
        }
        else
        {
            //std::cout << "OTHER: " << node->name() << "=" << node->value() << std::endl;
        }
        get_contents(node->first_node(), contents);
        get_contents(node->next_sibling(), contents);
    }
}

#endif // RAPIDXML_UTIL_HPP
