////////////////////////////////////////////////////////////////////
// ConfigTable.h
//
// Copyright 2007 cDc@seacave
// Distributed under the Boost Software License, Version 1.0
// (See http://www.boost.org/LICENSE_1_0.txt)

#ifndef __SEACAVE_CONFIGTABLE_H__
#define __SEACAVE_CONFIGTABLE_H__


// I N C L U D E S /////////////////////////////////////////////////

#include "SML.h"


// D E F I N E S ///////////////////////////////////////////////////


namespace SEACAVE {

// S T R U C T S ///////////////////////////////////////////////////

typedef struct CFGITEM_TYPE {
	enum {
		NA = 0, // no special states available
		TEMP = (1 << 0), // this item lives only this instance and it will not be save
	};
	Flags state;
	String name;
	String desc;
	String defval;
	StringArr vals;
} CFGITEM;


// P R O T O T Y P E S /////////////////////////////////////////////

/**
 * Configuration table interface.
 */

class GENERAL_API CConfigTable
{
public:
	CConfigTable(const String&);
	~CConfigTable();

	void			Release();

	// main methods
				 void		Insert(const String&);
				 void		Remove(const String&);
		  const  SML&		GetConfig(const String&) const;
				 SML&		GetConfig(const String&);
		  const  SML&		GetConfig() const						{ return m_oSML; }
				 SML&		GetConfig()								{ return m_oSML; }
	inline	SMLVALUE&		operator[] (const String& name)			{ return m_oSML[name]; }
	inline		 IDX		InsertChild(CConfigTable& oCfg)			{ oCfg.SetParent(this); return m_oSML.InsertChild(&oCfg.m_oSML); }
	inline		 void		RemoveChild(CConfigTable& oCfg)			{ oCfg.SetParent(NULL); m_oSML.RemoveChild(oCfg.m_oSML.GetName()); }

	// misc methods
				 bool		Load(const String&);
				 bool		Load(ISTREAM&);
				 bool		Save(const String&, SML::SAVEFLAG=SML::NONE) const;
				 bool		Save(OSTREAM&, SML::SAVEFLAG=SML::NONE) const;
	inline const String&	GetName() const							{ return m_oSML.GetName(); }
	inline CConfigTable*	GetParent() const						{ return m_pParent; }
	inline void				SetParent(CConfigTable* pParent)		{ m_pParent = pParent; }
	static void STCALL		ItemInitData(const String&, SMLVALUE&, void*);
	static bool STCALL		ItemSaveData(const SMLVALUE&, void*);
	static void STCALL		ItemReleaseData(SMLVALUE&, void*);

private:
	SML				m_oSML;
	CConfigTable*	m_pParent;
};
/*----------------------------------------------------------------*/

} // namespace SEACAVE

#endif // __SEACAVE_CONFIGTABLE_H__
