#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, CUTF8String path, CUTF8String workspaceClassType = _U8("CWorkspace"));

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

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

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

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

	/////////////////////////////////////////////////////////////////////////////////////
	//	補助
	/////////////////////////////////////////////////////////////////////////////////////
	//!	複数の文字列と or 比較
	int MultiMatch(LPCU8STR tag, LPCSTR str1, LPCSTR str2 = NULL, LPCSTR str3 = NULL);

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

	//!	キーフラグ
	int				m_inKeyLeaf;

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

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

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

	//!	深さカウンタ
	CPtrArrayTemplate<CWorkspaceNode*>	m_depth;

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