#include "StdAfx.h"
#include ".\workspaceaccess.h"
#include ".\workspace.h"

CWorkspaceAccess::CWorkspaceAccess(void)
{
	m_path = "";
	m_root = NULL;
}

CWorkspaceAccess::CWorkspaceAccess(CWorkspace *root,CString path)
{
	//	ノードパスへ変換
	if(path.GetLength() >= 2)
	{
		if(path.Right(2) != "::")
			path += "::";
	}
	else
		path += "::";

	m_path = path;
	m_root = root;
}

CWorkspaceAccess::~CWorkspaceAccess(void)
{
}

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

	m_root->Clear(m_path);
}


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

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


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

	return CWorkspaceAccess(m_root,m_path + subPath);
}


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

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

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

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

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


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

	char	buf[80] = "";
	_itoa_s(data, buf, 80, 10);
	m_root->SetKeyData(m_path + key, buf);
}


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

	char	buf[80] = "";
	_i64toa_s(data, buf, 80, 10);
	m_root->SetKeyData(m_path + key, buf);
}


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

	char	buf[80] = "";
	_ui64toa_s(data, buf, 80, 10);
	m_root->SetKeyData(m_path + key, buf);
}



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

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


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

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


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

	char	buf[80];
	_i64toa_s(defaultData,buf,80,10);
	CString ret = m_root->GetKeyData(m_path + key,buf,noCase);
	return(_atoi64(ret));
}


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

	char	buf[80];
	_ui64toa_s(defaultData,buf,80,10);
	CString ret = m_root->GetKeyData(m_path + key,buf,noCase);
	return((DWORD)_atoi64(ret));
}

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

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


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

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


/*!
	全てのキーをコピーする
*/
void CWorkspaceAccess::CopyAllKeys(CKeyDataArray &keyData)
{
	ASSERT(m_root != NULL);

	m_root->CopyAllKeys(m_path,keyData);
}

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

	m_root->DeleteKey(m_path + key);
}

/*!
	文字列中のキー名をデータに置き換えた文字列を取得する
*/
CString CWorkspaceAccess::GetKeySwapString(CString str,CString noData, IWorkspaceAutoSwapPtr tempSwap)
{
	ASSERT(m_root != NULL);

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


/******************************************************
	サブノードに関する処理
*******************************************************/
/*!
	ノードを削除する
*/
void CWorkspaceAccess::DeleteNode(CString 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(CStringArray &list)
{
	ASSERT(m_root != NULL);

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


