#include "StdAfx.h"
#include "WorkspaceAccess.h"


/////////////////////////////////////////////////////////////////////////////
//	コンストラクタ
/////////////////////////////////////////////////////////////////////////////
/*!
	コンストラクタ
*/
CWorkspaceAccess::CWorkspaceAccess(void)
{
	m_path = _U8("");
	m_root = NULL;
}

/*!
	コンストラクタ(IWorkspaceAccessPtr)
*/
CWorkspaceAccess::CWorkspaceAccess(IWorkspaceAccessPtr access)
{
	CIStringWrap	path;
	access->GetAccessPath(&path);
	
	Init(access->GetIWorkspacePtr(), path);
}

/*!
	コンストラクタ(IWorkspacePtr)
*/
CWorkspaceAccess::CWorkspaceAccess(IWorkspacePtr root, CUTF8String path)
{
	Init(root, path);
}


/////////////////////////////////////////////////////////////////////////////
//	内部初期化
/////////////////////////////////////////////////////////////////////////////
/*!
	内部初期化
*/
void CWorkspaceAccess::Init(IWorkspacePtr root, CUTF8String path)
{
	//	ノードパスへ変換
	if(path.GetLength() >= 2)
	{
		if(path.Right(2) != _U8("::"))
			path += _U8("::");
	}
	else
		path += _U8("::");

	m_path = path;
	m_root = root;
}


/////////////////////////////////////////////////////////////////////////////
//	初期化など
/////////////////////////////////////////////////////////////////////////////
/*!
	全データクリア
*/
void CWorkspaceAccess::Clear(void)
{
	ASSERT(m_root != NULL);

	m_root->Clear(m_path);
}


/*!
	複製する
*/
void CWorkspaceAccess::Copy(CWorkspaceAccess &src)
{
	ASSERT(m_root != NULL);

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


/*!
	アクセスクラス取得
*/
CWorkspaceAccess CWorkspaceAccess::GetAccess(CUTF8String subPath)
{
	ASSERT(m_root != NULL);

	return CWorkspaceAccess(m_root,m_path + subPath);
}


/*!
	ルートを取得
*/
IWorkspacePtr CWorkspaceAccess::GetRoot()
{
	return(m_root);
}

/*!
	名前を取得
*/
CUTF8String CWorkspaceAccess::GetNodeName()
{
	//	後ろの２文字を消す
	CUTF8String	path = m_path;
	if(path.Right(2) == _U8("::"))
		path = path.Left(path.GetLength() - 2);

	int index = path.ReverseFind(':');
	if(index == -1)
		return(path);
	return(path.Mid(index + 1));
}

/*!
	パスを取得
*/
CUTF8String CWorkspaceAccess::GetPath()
{
	return(m_path);
}



/////////////////////////////////////////////////////////////////////////////
//	データ取得･設定処理
/////////////////////////////////////////////////////////////////////////////
/*!
	データの設定(文字列)
*/
void CWorkspaceAccess::SetKeyStr(CUTF8String key, CUTF8String data ,int noCase)
{
	ASSERT(m_root != NULL);

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


/*!
	データの設定(int)
*/
void CWorkspaceAccess::SetKeyInt(CUTF8String key, int data ,int noCase)
{
	ASSERT(m_root != NULL);

	TCHAR	buf[80] = _U16("");
	_itot_s(data, buf, 80, 10);
	m_root->SetKeyData(m_path + key, (LPCU8STR)buf);
}


/*!
	データの設定(int64)
*/
void CWorkspaceAccess::SetKeyInt64(CUTF8String key, __int64 data ,int noCase)
{
	ASSERT(m_root != NULL);

	TCHAR	buf[80] = _U16("");
	_i64tot_s(data, buf, 80, 10);
	m_root->SetKeyData(m_path + key, (LPCU8STR)buf);
}


/*!
	データの設定(DWORD)
*/
void CWorkspaceAccess::SetKeyDWORD(CUTF8String key, DWORD data ,int noCase)
{
	ASSERT(m_root != NULL);

	TCHAR	buf[80] = _U16("");
	_ui64tot_s(data, buf, 80, 10);
	m_root->SetKeyData(m_path + key, (LPCU8STR)buf);
}



/*!
	データの取得(文字列)
*/
CUTF8String CWorkspaceAccess::GetKeyStr(CUTF8String key, CUTF8String defaultData ,int noCase)
{
	ASSERT(m_root != NULL);

	CIStringWrap	ret;
	m_root->GetKeyData(&ret, m_path + key, defaultData, noCase);

	return(ret.GetString());
}


/*!
	データの取得(int)
*/
int CWorkspaceAccess::GetKeyInt(CUTF8String key, int defaultData ,int noCase)
{
	ASSERT(m_root != NULL);

	CIStringWrap	ret;
	m_root->GetKeyData(&ret, m_path + key, _U8(""), noCase);

	if(ret.IsEmpty())
		return(defaultData);
	else
		return(atoi((LPCSTR)ret.GetString()));	//	MBCSへ変換はしない
}


/*!
	データの取得(int64)
*/
__int64 CWorkspaceAccess::GetKeyInt64(CUTF8String key, __int64 defaultData ,int noCase)
{
	ASSERT(m_root != NULL);

	CIStringWrap	ret;
	m_root->GetKeyData(&ret, m_path + key, _U8(""), noCase);

	if(ret.IsEmpty())
		return(defaultData);
	else
		return(_atoi64((LPCSTR)ret.GetString()));	//	MBCSへ変換はしない
}


/*!
	データの取得(DWORD)
*/
DWORD CWorkspaceAccess::GetKeyDWORD(CUTF8String key, DWORD defaultData ,int noCase)
{
	ASSERT(m_root != NULL);

	CIStringWrap	ret;
	m_root->GetKeyData(&ret, m_path + key, _U8(""), noCase);

	if(ret.IsEmpty())
		return(defaultData);
	else
		return((DWORD)_atoi64((LPCSTR)ret.GetString()));	//	MBCSへ変換はしない
}


/////////////////////////////////////////////////////////////////////////////
//	Keyに関する処理
/////////////////////////////////////////////////////////////////////////////
/*!
	キー数を取得
*/
int CWorkspaceAccess::GetKeyCount()
{
	ASSERT(m_root != NULL);

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


/*!
	全てのキー名を文字列として取得
*/
int CWorkspaceAccess::GetAllKey(CUTF8StringArray &list)
{
	ASSERT(m_root != NULL);

	CIStringArrayWrap	iList(list);
	return(m_root->GetAllKeyPair(m_path, &iList, NULL));
}

/*!
	全てのデータを文字列として取得
*/
int CWorkspaceAccess::GetAllData(CUTF8StringArray &list)
{
	ASSERT(m_root != NULL);

	CIStringArrayWrap	iList(list);
	return(m_root->GetAllKeyPair(m_path, NULL, &iList));
}



/*!
	データの削除
*/
void CWorkspaceAccess::DeleteKey(CUTF8String key)
{
	ASSERT(m_root != NULL);

	m_root->DeleteKey(m_path + key);
}


/////////////////////////////////////////////////////////////////////////////
//	サブノードに関する処理
/////////////////////////////////////////////////////////////////////////////
/*!
	ノードを削除する
*/
void CWorkspaceAccess::DeleteNode(CUTF8String name)
{
	ASSERT(m_root != NULL);

	m_root->DeleteNode(m_path + name);
}


/*!
	サブノード数を得る
*/
int CWorkspaceAccess::GetSubNodeCount()
{
	ASSERT(m_root != NULL);

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


/*!
	全てのサブノード名を文字列として取得
*/
int CWorkspaceAccess::GetAllSubNode(CUTF8StringArray &list)
{
	ASSERT(m_root != NULL);

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


