#include "StdAfx.h"
#include "SettingManager.h"
#include "ServerStartErrorException.h"
#include "Dir.h"

#define	CLASS_NAME	"SettingManager"

CSettingManager::CSettingManager(void) :
	m_settingRoot("04WebServer2")
{
	m_serverSetting = m_settingRoot.GetAccess("Setting");
}

CSettingManager::~CSettingManager(void)
{
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CSettingManager::Start(IServerToolIIPtr serverTool)
{
	ASSERT(!m_init);
	m_init = TRUE;

	//	設定のロード
	if(m_settingRoot.LoadFromXMLFile(SETTING_FILE))
		throw CServerStartErrorException(CLASS_NAME, "設定ファイル [" + SETTING_FILE + "] の読み込みに失敗しました。");

	//	置き換え
	OverwriteSetting(m_serverSetting);

	//	標準の自動置き換え
	EnableAutoSwapDefault();

	//	リードオンリーに
	m_settingRoot.SetReadOnly(TRUE);
}

/*!
	停止
*/
void CSettingManager::Stop()
{
	//	初期化チェック
	if(!m_init)
		return;
	m_init = FALSE;

}

///////////////////////////////////////////////////////////////////////////////////////////////////
//	設定上書き
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	設定を上書きする(再帰)
*/
void CSettingManager::OverwriteSetting(CWorkspaceAccess overwrite)
{
	OverwriteOneSetting(overwrite);

	//	全サブノードを取得
	CStringArray	nodes;
	overwrite.GetAllSubNode(nodes);

	//	下位を書き換え
	for(int i=0;i<nodes.GetCount();i++)
		OverwriteSetting(overwrite.GetAccess(nodes[i]));
}

/*!
	設定を上書きする
*/
void CSettingManager::OverwriteOneSetting(CWorkspaceAccess overwrite)
{
	//	全キーを取得
	CStringArray	keys;
	overwrite.GetAllKey(keys);

	//	すべて上書き
	for(int i=0;i<keys.GetCount();i++)
	{
		CString	data = overwrite.GetKeyStr(keys[i], "");

		//	サーバルート
		data.Replace("%ServerRoot%", CPathTools::GetAppPath());

		overwrite.SetKeyStr(keys[i], data);
	}
}


/*!
	デフォルト値の自動書き換えを有効に

	指定されるデフォルト値に置き換えが含まれていた時の対策
*/
void CSettingManager::EnableAutoSwapDefault()
{
	//	サーバルート
	m_settingSwap.AddSwap("%ServerRoot%", CPathTools::GetAppPath());

	//	書き換えを設定(デフォルト値が指定されている場合のみ)
	m_settingRoot.SetAutoSwapDefault(IWorkspaceAutoSwapRet(&m_settingSwap, FALSE));
}

/*!
	通常の取得
*/
CString CSettingWorkspaceSwap::GetKeyDataSwap(IWorkspace *workspace, const LPCSTR orgKey, CString orgData)
{
	SCOPE_LOCK();

	if(orgData.Find("%") != -1)
	{
		for(int i=0;i<m_keyData.GetCount();i++)
		{
			orgData.Replace(m_keyData[i].m_key, m_keyData[i].m_data);
		}
	}

	return(orgData);
}

/*!
	置き換えを追加
*/
void CSettingWorkspaceSwap::AddSwap(CString key, CString swap)
{
	SCOPE_LOCK();

	m_keyData.Add(key, swap);
}
