//--------------------------------------------------------------------------------------
// Copyright (C) 2008 http://shift.delblanco.es
//--------------------------------------------------------------------------------------
// SHIFT Videogame 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 3 of the License, or later version.
//
// 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.
//--------------------------------------------------------------------------------------
/// \file XMLIO.h
/// Clase para manejar la entrada y salida de ficheros XML. Se usa para la carga y
/// almacenamiento persistente de datos de configuración, datos de programa o
/// propiedades de objetos.
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __CXMLIO_H__
#define __CXMLIO_H__

// Librerías para el manejo de XML
#include <msxml2.h>
#include <atlcomcli.h>

//--------------------------------------------------------------------------------------
/// Clase para manejar la entrada y salida de ficheros XML
//--------------------------------------------------------------------------------------
class CXMLIO
{
private:  // Campos miembro

    /// Objeto COM para el manejo de XML
    IXMLDOMDocument *m_pXMLDoc;
    /// Puntero al nodo actual del fichero
    CComPtr<IXMLDOMElement> m_pThisElm;
    /// Puntero para accesos a subnodos del nodo actual
    CComPtr<IXMLDOMElement> m_pSubElm;
    /// Flag que indica si hay un fichero abierto
    bool m_Opened;

    /// Almacena en 'm_pSubElm' el elemento hijo indicado del elemento actual y fichero XML actual
    bool SubElement(LPWSTR Element, bool create=false, long num=0);

public: // Métodos públicos

    /// Constructor
    CXMLIO();
    /// Destructor
    ~CXMLIO();

    /// Carga un fichero
    bool LoadFile(LPCWSTR FileName);
    /// Guarda el fichero actual
    bool SaveFile(LPCWSTR FileName);
    /// Crea un fichero con el elemento raíz
    bool CreateFile(LPCWSTR FileName, LPCWSTR Root);


    /// Toma el valor de un atributo del elemento y fichero actuales
    bool GetAttribute(LPCWSTR Attribute, LPWSTR Value);

    /// Fija el valor de un atributo del elemento y fichero actuales
    bool SetAttribute(LPCWSTR Attribute, LPCWSTR Value);

    /// Toma el valor del elemento actual del fichero actual
    bool GetElement(LPWSTR Value);

    /// Fija el valor del elemento actual del fichero actual
    bool SetElement(LPCWSTR Value);

    /// Toma el valor de un atributo de un sub-elemento del elemento y fichero actuales
    bool GetSubAttribute(LPWSTR Element, LPCWSTR Attribute, LPWSTR Value, long num=0);

    /// Fija el valor de un atributo de un sub-elemento del elemento y fichero actuales
    bool SetSubAttribute(LPWSTR Element, LPCWSTR Attribute, LPCWSTR Value, long num=0);

    /// Toma el valor de un sub-elemento del elemento y fichero actuales
    bool GetSubElement(LPWSTR Element, LPWSTR Value, long num=0);

    /// Fija el valor de un sub-elemento del elemento y fichero actuales
    bool SetSubElement(LPWSTR Element, LPCWSTR Value, long num=0);

    /// Moverse al elemento hijo indicado del elemento actual y fichero XML actual
    bool MoveSubElement(LPWSTR Element, long num=0);

    /// Moverse al elemento padre del elemento actual y fichero XML actual
    bool MoveParent(void);

    /// Moverse al elemento raíz del fichero XML actual
    bool MoveRoot(void);
};

#endif
