#include "StdAfx.h"
#include "DAVPropfindReqParser.h"

CDAVPropfindReqParser::CDAVPropfindReqParser(void)
{
}

CDAVPropfindReqParser::~CDAVPropfindReqParser(void)
{
}

/*!
	パースを実行
*/
int CDAVPropfindReqParser::ParsePropfind(CBinaryData &xml, CWorkspaceAccess propertys)
{
	try
	{
		m_propertys = propertys;
		m_inPropfind = 0;
		m_inProp = 0;

		StartScan(xml);
	}
	catch(CXMLTextParserException err)
	{
		TRACE(_T("%s\n"), err.GetErrorInfo());
		return(-1);
	}
	return(0);
}


/////////////////////////////////////////////////////////////////////////////////////
//	実装
/////////////////////////////////////////////////////////////////////////////////////
/*!
	開始タグ
*/
void CDAVPropfindReqParser::OnStartTag(LPCSTR tag, LPCSTR *atts, int attsCount)
{
	CString	csTag = tag;

	//	タグで分岐
	if(csTag.CompareNoCase("DAV:propfind") == 0)
	{
		if(m_inPropfind)
			throw CXMLTextParserException(_T("DAV:Propfindが入れ子になってます"));
		m_inPropfind = 1;
	}
	else if(csTag.CompareNoCase("DAV:prop") == 0)
	{
		if(!m_inPropfind)
			throw CXMLTextParserException(_T("DAV:Propfindの外にDAV:Propが見つかりました"));
		if(m_inProp)
			throw CXMLTextParserException(_T("DAV:Propが入れ子になってます"));
		m_inProp = 1;
	}
	else
	{
		if(m_inProp)
		{
			//	Worspace禁止文字
			if(csTag.Find(_T("::")) == -1)
			{
				m_propertys.SetKeyInt(csTag, 0);
				TRACE("DAV:Propaty : %s\n", csTag);
			}
		}
	}
}

/*!
	終了タグ
*/
void CDAVPropfindReqParser::OnEndTag(LPCSTR tag)
{
	CString	csTag = tag;

	if(csTag.CompareNoCase("DAV:propfind") == 0)
	{
		m_inPropfind = 0;
	}
	else if(csTag.CompareNoCase("DAV:prop") == 0)
	{
		m_inProp = 0;
	}
}

/*!
	データ
*/
void CDAVPropfindReqParser::OnData(const char *data, int len)
{
}
