#pragma once
#include "TextTools.h"

/*!
	例外
*/
class CXMLTextParserException
{
public:
	CXMLTextParserException() {};
	CXMLTextParserException(CString error, int point)
	{
		m_error = error;
		m_point = point;
	};

	CString	m_error;
	int		m_point;
};

/*!
	タグオプション
*/
class CTagOption
{
public:
	CTagOption() {};
	CTagOption(LPSTR key, LPSTR data)
	{
		m_key = key;
		m_data = data;
	};

	LPSTR	m_key;
	LPSTR	m_data;
};

/*!
	配列型
*/
class CTagOptionArray : public CArray<CTagOption> {};

/*!
	超簡易ＸＭＬ解析器
	CWorkspaceクラスの読み書き専用
*/
class CXMLTextParser
{
public:
	CXMLTextParser(void);
	virtual ~CXMLTextParser(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	開始
	/////////////////////////////////////////////////////////////////////////////////////
	//!	スキャン
	void StartScan(CString xml);

	//!	ファイルから取得
	CString LoadXmlFile(CString path);

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	タグ
	/////////////////////////////////////////////////////////////////////////////////////
	//!	インデックスの作成
	void BuildTagIndex();

	//!	開始タグ切り出し
	int ParseNextTag();

	//!	データ切り出し
	void ParseData(CString &data);

	//!	タグオプションの解析
	void ParseTagOption(LPSTR tag, CTagOptionArray &keys);

	/////////////////////////////////////////////////////////////////////////////////////
	//	実装
	/////////////////////////////////////////////////////////////////////////////////////
	//!	開始タグ
	virtual void OnStartTag(LPCSTR tag, CTagOptionArray &keys) {/* TRACE(_T("StartTag : %s\n"), tag); */};

	//!	終了タグ
	virtual void OnEndTag(LPCSTR tag) {/* TRACE(_T("EndTag : %s\n"), tag); */};

	//!	特殊タグ
	virtual void OnSpecialTag(LPCSTR tag) {/* TRACE(_T("SpecialTag : %s\n"), tag); */};

	//!	データ
	virtual void OnData(LPCSTR data) {/* TRACE(_T("Data : %s\n"), data); */};

	/////////////////////////////////////////////////////////////////////////////////////
	//	ツール
	/////////////////////////////////////////////////////////////////////////////////////
	//!	指定した文字までを切り出す
	_inline int GetNextToken(CString &src, CString find, CString &token, int tokenStart = 0, int removeToken = 1);

	//!	次のタグを取得
	_inline int GetNextTag(LPSTR *tag, LPSTR *data);

	//!	タグを分離
	_inline void SplitTag(LPSTR tag, LPSTR *tagOption);

	//!	タグタイプ取得
	_inline int GetTagType(LPSTR *tag);

	//!	指定した文字までを切り出す
//	_inline int GetNextToken(LPSTR *src, LPSTR splitter, LPSTR *token);

	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	データ
	CString		m_xmlData;

	//!	データ長さ
	int			m_dataLen;

	//!	エスケープ
	CTextEscape	m_escape;

	//!	タグ位置
	CArray<int>	m_tagIndexes;

	//!	データバッファ
	LPSTR		m_lpXml;

	//!	タグ
	CTypedPtrArray<CPtrArray,LPSTR>	m_tags;

	//!	データ
	CTypedPtrArray<CPtrArray,LPSTR>	m_datas;

	//!	カウンタ
	int			m_tagCounter;
};
