#include "StdAfx.h"
#include "configaccess.h"
#include "config.h"

CConfigAccess::CConfigAccess()
{
	m_path = "";
	m_root = NULL;
}

CConfigAccess::CConfigAccess(CConfig *root,CString path)
{
	if(path.GetLength() >= 2)
	{
		if(path.Right(2) != "::")
			path += "::";
	}
	else
		path += "::";

	m_path = path;
	m_root = root;
}

CConfigAccess::~CConfigAccess(void)
{
}


/*!
 *	データの設定
 *
 *	@param key	キー
 *	@param data	設定するデータ
 */
void CConfigAccess::SetConfig(CString key, CString data)
{
	ASSERT(m_root != NULL);

	m_root->SetConfig(m_path + key,data);
}

/*!
 *	データの設定
 *
 *	@param key	キー
 *	@param data	設定するデータ
 */
void CConfigAccess::SetConfig(CString key, int data)
{
	ASSERT(m_root != NULL);

	char	buf[80];

	m_root->SetConfig(m_path + key,itoa(data,buf,10));
}


/*!
 *	データの設定
 *
 *	@param key	キー
 *	@param data	設定するデータ
 */
void CConfigAccess::SetConfig(CString key, UINT data)
{
	ASSERT(m_root != NULL);

	char	buf[80];

	m_root->SetConfig(m_path + key,_ui64toa(data,buf,10));
}


/*!
 *	データの設定
 *
 *	@param key	キー
 *	@param data	設定するデータ
 */
void CConfigAccess::SetConfig(CString key, __int64 data)
{
	ASSERT(m_root != NULL);

	char	buf[80];

	m_root->SetConfig(m_path + key,_i64toa(data,buf,10));
}


/*!
 *	データの取得
 *
 *	@param key			キー
 *	@param noCase		大文字小文字の区別
 *	@param defaultData	デフォルト
 */
CString CConfigAccess::GetConfig(CString key, CString defaultData,int noCase)
{
	ASSERT(m_root != NULL);

	return(m_root->GetConfig(m_path + key,defaultData,noCase));
}

/*!
 *	データの取得
 *
 *	@param key			キー
 *	@param noCase		大文字小文字の区別
 *	@param defaultData	デフォルト
 */
int CConfigAccess::GetConfig(CString key, int defaultData,int noCase)
{
	ASSERT(m_root != NULL);

	char	buf[40];
	CString ret = m_root->GetConfig(m_path + key,itoa(defaultData,buf,10),noCase);
	return(atoi(ret));
}

/*!
 *	データの取得
 *
 *	@param key			キー
 *	@param noCase		大文字小文字の区別
 *	@param defaultData	デフォルト
 */
UINT CConfigAccess::GetConfig(CString key, UINT defaultData,int noCase)
{
	ASSERT(m_root != NULL);

	char	buf[40];
	CString ret = m_root->GetConfig(m_path + key,_ui64toa(defaultData,buf,10),noCase);
	return(atoi(ret));
}

/*!
 *	データの取得
 *
 *	@param key			キー
 *	@param noCase		大文字小文字の区別
 *	@param defaultData	デフォルト
 */
__int64 CConfigAccess::GetConfig(CString key, __int64 defaultData,int noCase)
{
	ASSERT(m_root != NULL);

	char	buf[80];
	CString ret = m_root->GetConfig(m_path + key,_i64toa(defaultData,buf,10),noCase);
	return(atoi(ret));
}


/*!
 *	全てのキーを取得
 *
 *	@param list	キーリスト
 *	@return		キー数
 */
int CConfigAccess::GetAllKey(CStringArray &list)
{
	ASSERT(m_root != NULL);

	return(m_root->GetAllKey(m_path,list));
}


/*!
 *	全てのサブノードを取得
 *
 *	@param list	ノードリスト
 *	@return		ノード数
 */
int CConfigAccess::GetAllSubNode(CStringArray &list)
{
	ASSERT(m_root != NULL);

	return(m_root->GetAllSubNode(m_path,list));
}

/*!
 *	全てのキー数を取得
 *
 *	@return		キー数
 */
int CConfigAccess::GetKeyCount()
{
	ASSERT(m_root != NULL);

	return(m_root->GetKeyCount(m_path));
}


/*!
 *	全てのサブノード数を取得
 *
 *	@return		ノード数
 */
int CConfigAccess::GetSubNodeCount()
{
	ASSERT(m_root != NULL);

	return(m_root->GetSubNodeCount(m_path));
}


/*!
 *	サブクラスのアクセスクラスの取得
 *
 *	@param subPath	パス
 *	@return			CConfigAccess *
 */
CConfigAccess CConfigAccess::GetAccess(CString subPath)
{
	ASSERT(m_root != NULL);

	return CConfigAccess(m_root,m_path + subPath);
}

/*!
 *	CConfig取得
 *
 *	@return			CConfig *
 */
CConfig * CConfigAccess::GetRoot()
{
	ASSERT(m_root != NULL);

	return(m_root);
}


/*!
 *	クリア
 *
 */
void CConfigAccess::Clear()
{
	ASSERT(m_root != NULL);

	m_root->Clear(m_path);
}

/*!
 *	ノード削除
 *
 *	@param name	ノード名
 */
void CConfigAccess::DeleteNode(CString name)
{
	ASSERT(m_root != NULL);

	m_root->DeleteNode(m_path + name);
}

/*!
 *	キー削除
 *
 *	@param name	キー名
 */
void CConfigAccess::DeleteKey(CString name)
{
	ASSERT(m_root != NULL);

	m_root->DeleteKey(m_path + name);
}

/*!
 *	複製
 *
 *	@param other	コピー元
 */
void CConfigAccess::Copy(CConfigAccess &other)
{
	ASSERT(m_root != NULL);

	m_root->Copy(m_path,other.m_path,other.m_root);
}

/*!
 *	キー名で置き換えた文字列を取得
 *
 *	@param str		文字列
 *	@param noData	該当しない置き換えの処置
 *	@return			文字列
 */
CString CConfigAccess::GetKeySwapString(CString str, CString noData)
{
	ASSERT(m_root != NULL);

	return(m_root->GetKeySwapString(m_path,str,noData));
}
