#include "StdAfx.h"
#include "WorkspaceXMLWriter.h"
#include "TextTools.h"
#include "TypedBuffer.h"

CWorkspaceXMLWriter::CWorkspaceXMLWriter(void)
{
}

CWorkspaceXMLWriter::~CWorkspaceXMLWriter(void)
{
}

//!	XML出力(throw CWorkspaceXMLWriterException)
CStringA CWorkspaceXMLWriter::ToString(CWorkspaceNode *root, CString workspaceClassType)
{
	m_xml.Empty();
	m_workspaceClassType = workspaceClassType;

	//	ヘッダ出力
	WriteHeader();

	//	データ出力
	WriteSubNode(root, "\t");

	//	フッタ出力
	WriteFooter();

	return m_xml;
}

/*!
	ファイルへ出力
*/
void CWorkspaceXMLWriter::SaveToFile(CWorkspaceNode *root, CString path, CString workspaceClassType)
{
	m_xml.Empty();
	m_workspaceClassType = workspaceClassType;

	//	ヘッダ出力
	WriteHeader();

	//	データ出力
	WriteSubNode(root, "\t");

	//	フッタ出力
	WriteFooter();

	//	UTF16へ変換
	CStringW			utf16(m_xml);

	//	UTF8へ変換
	int mbLen = WideCharToMultiByte(CP_UTF8, 0, utf16.GetBuffer(0), utf16.GetLength(), NULL, 0, NULL, NULL);
	CTypedBuffer<char>	utf8(mbLen);
	WideCharToMultiByte(CP_UTF8, 0, utf16.GetBuffer(0), utf16.GetLength(), utf8.GetPtr(), utf8.GetCount(), NULL, NULL);

	//	開く
	FILE	*out;
	if(_tfopen_s(&out, path, _T("wb")) != 0)
		throw CWorkspaceXMLWriterException(_T("ファイルのオープンに失敗しました"));

	fwrite(utf8.GetPtr(), mbLen, 1, out);
	fclose(out);
}


/////////////////////////////////////////////////////////////////////////////
//	出力関数
/////////////////////////////////////////////////////////////////////////////
/*!
	ヘッダーを出力
*/
void CWorkspaceXMLWriter::WriteHeader()
{
	m_xml += CTextTools::GetFormat(_T("<?xml version=\"1.0\"?>\r\n<!--Soft3304 CWorkspace class.-->\r\n<CWorkspaceClass type=\"%s\">\r\n"), m_workspaceClassType, m_workspaceClassType);
}

/*!
	フッター出力
*/
void CWorkspaceXMLWriter::WriteFooter()
{
	m_xml += CString(_T("</CWorkspaceClass>\r\n"));
}


/*!
	１ノード出力
*/
void CWorkspaceXMLWriter::WriteSubNode(CWorkspaceNode *node, CString tab)
{
	//	自分を出力
	m_xml += CTextTools::GetFormat(_T("%s<Subnode name=\"%s\">\r\n"), tab, node->GetNodeName());

	//	キー出力
	for(int i=0;;i++)
	{
		CKeyData *key = node->GetKeyByIndex(i);
		if(key == NULL)
			break;

		//	変換
		CTextEscape	escape;
		escape.AddEscape(_T("<"), _T("&lt;"));
		escape.AddEscape(_T(">"), _T("&gt;"));
		escape.AddEscape(_T("&"), _T("&amp;"));
		CString data = escape.Escape(key->m_data);


		//	出力
		m_xml += CTextTools::GetFormat(_T("%s\t<Key name=\"%s\">%s</Key>\r\n"), tab, key->m_key, data);
	}

	//	サブノード出力
	for(int i=0;;i++)
	{
		CWorkspaceNode *subnode = node->GetSubNodeByIndex(i);
		if(subnode == NULL)
			break;

		//	出力
		WriteSubNode(subnode, tab + "\t");
	}

	//	自分を閉じる
	m_xml += CTextTools::GetFormat(_T("%s</Subnode>\r\n"), tab);
}
