#pragma once
#include "ExpatXmlParser.h"
#include "WorkspaceNode.h"

class CWorkspaceXMLReader :
	protected CExpatXmlParser
{
public:
	CWorkspaceXMLReader(void);
	virtual ~CWorkspaceXMLReader(void);

	//!	XML読み込み(throw CXMLTextParserException)
	void LoadFromFile(CWorkspaceNode *root, CString path, CString workspaceClassType = _T("CWorkspace"));

	//!	XML読み込み(throw CXMLTextParserException)
	void FromString(CWorkspaceNode *root, CString str, CString workspaceClassType = _T("CWorkspace"));

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	実装
	/////////////////////////////////////////////////////////////////////////////////////
	//!	開始タグ
	virtual void OnStartTag(LPCSTR tag, LPCSTR *atts);

	//!	終了タグ
	virtual void OnEndTag(LPCSTR tag);

	//!	データ
	virtual void OnData(const CHAR *data, int len);

/*	//!	開始タグ
	virtual void OnStartTag(CString tag, CTagOptionArray &keys);

	//!	終了タグ
	virtual void OnEndTag(CString tag);

	//!	特殊タグ
	virtual void OnSpecialTag(CString tag);

	//!	データ
	virtual void OnData(CString data);
*/
	/////////////////////////////////////////////////////////////////////////////////////
	//	実装 - サブ
	/////////////////////////////////////////////////////////////////////////////////////
	//!	CWorkspaceClass 開始


	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	現在のノード
	CWorkspaceNode *m_curNode;

	//!	キーフラグ
	int		m_inKeyLeaf;

	//!	データコールバック再突入フラグ
	int		m_onDataCount;

	//!	現在のキー名
	CString	m_keyName;

	//!	現在のデータ
	CString	m_keyData;

	//!	深さカウンタ
	CTypedPtrList<CPtrList,CWorkspaceNode*>	m_depth;

	//!	ワークスペース名
	CString	m_workspaceClassType;
};
