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

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

CWorkspaceAccess::CWorkspaceAccess(IWorkspacePtr root, CString path)
{
	Init(root, path);
}

CWorkspaceAccess::CWorkspaceAccess(const SWorkspaceAccessCoreDataPtr passed)
{
	Init(passed->BaseClass, passed->AccessPath);
}

CWorkspaceAccess::~CWorkspaceAccess(void)
{
}

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

	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(CString subPath)
{
	ASSERT(m_root != NULL);

	return CWorkspaceAccess(m_root,m_path + subPath);
}


/*!
	ルートを取得
*/
IWorkspacePtr 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));
}

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

/*!
	DLL間受け渡し用構造体取得
*/
int CWorkspaceAccess::GetCoreData(SWorkspaceAccessCoreDataPtr passData)
{
	if(m_path.GetLength() > MAX_WORKSPACE_PATH_LEN)
		return(-1);

	passData->BaseClass = m_root;
	strcpy_s(passData->AccessPath, MAX_WORKSPACE_PATH_LEN, m_path);
	return(0);
}


/*********************************************************
	データ取得･設定処理
**********************************************************/
/*!
	データの設定(文字列)
*/
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);

	TCHAR	buf[80] = _T("");
	_itot_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);

	TCHAR	buf[80] = _T("");
	_i64tot_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);

	TCHAR	buf[80] = _T("");
	_ui64tot_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);

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

	return(ret.GetString());
}


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

	CAPIPassString	ret;
	m_root->GetKeyData(&ret, m_path + key, _T(""), noCase);

	if(ret.IsEmpty())
		return(defaultData);
	else
		return(_ttoi(ret.GetString()));
}


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

	CAPIPassString	ret;
	m_root->GetKeyData(&ret, m_path + key, _T(""), noCase);

	if(ret.IsEmpty())
		return(defaultData);
	else
		return(_ttoi64(ret.GetString()));
}


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

	CAPIPassString	ret;
	m_root->GetKeyData(&ret, m_path + key, _T(""), noCase);

	if(ret.IsEmpty())
		return(defaultData);
	else
		return((DWORD)_ttoi64(ret.GetString()));
}

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

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


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

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

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

	CISArrayToCSArray	iList(list);
	return(m_root->GetAllData(m_path, &iList));
}



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

	m_root->DeleteKey(m_path + key);
}


/******************************************************
	サブノードに関する処理
*******************************************************/
/*!
	ノードを削除する
*/
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);

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


