/*!
	BasicTypeInterfaces.h - 基本データタイプ 交換用インタフェース

	仕様が固定されているインタフェース
	ここに宣言されているインタフェースは、今後変更されない。
*/
#pragma once

////////////////////////////////////////////////////////////////////////////////////////////////////////
//	データ受け渡しインタフェース
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	文字列
*/
class IString
{
public:
	//!	文字列を設定
	virtual void SetString(LPCSTR str) = 0;

	//!	文字列を取得
	virtual LPCSTR GetString() = 0;
};
//!	ポインタ型
typedef IString*	IStringPtr;


/*!
	文字列配列
*/
class IStringArray
{
public:
	//!	初期化
	virtual void Clear() = 0;

	//!	サイズ設定
	virtual void SetSize(int size) = 0;

	//!	サイズ取得
	virtual int GetSize() = 0;

	//!	文字列を追加
	virtual void AddString(LPCSTR str) = 0;

	//!	保持している文字列を取得
	virtual LPCSTR GetString(int index) = 0;

	//!	保持している文字列を設定
	virtual void SetString(int index, LPCSTR str) = 0;
};
//!	ポインタ型
typedef IStringArray*	IStringArrayPtr;


/*!
	バイナリデータ
*/
class IBinaryData
{
public:
	//!	サイズ変更
	virtual void ReSize(int size) = 0;

	//!	サイズ取得
	virtual int GetSize() = 0;

	//!	保持しているデータポインタを取得
	virtual char *GetPtr() = 0;
};
//!	ポインタ型
typedef IBinaryData*	IBinaryDataPtr;




////////////////////////////////////////////////////////////////////////////////////////////////////////
//	CWorkspaceAccess 受け渡しインタフェース
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	ワークスペースへの外部アクセス
*/
class IWorkspace
{
public:
	/////////////////////////////////////////////////////////////////////////////////////
	//	初期化など
	/////////////////////////////////////////////////////////////////////////////////////
	//!	全データクリア
	virtual void Clear(LPCSTR path) = 0;

	//!	コピー
	virtual void Copy(LPCSTR destPath, LPCSTR srcPath, IWorkspace *srcWorkspace=NULL) = 0;

	/////////////////////////////////////////////////////////////////////////////////////
	//	排他処理
	/////////////////////////////////////////////////////////////////////////////////////
	//!	ロック
	virtual void Lock() = 0;

	//!	アンロック
	virtual void Unlock() = 0;

	/////////////////////////////////////////////////////////////////////////////////////
	//	Keyに関する処理
	/////////////////////////////////////////////////////////////////////////////////////
	//!	データの設定
	virtual void SetKeyData(LPCSTR path, LPCSTR data, int noCase = FALSE) = 0;

	//!	データの取得
	virtual void GetKeyData(IStringPtr dest, LPCSTR path, LPCSTR defaultData, int noCase = FALSE) = 0;

	//!	キーを検索
	virtual int FindKeyData(LPCSTR path, LPCSTR sData, int noCase = FALSE, int pathCompare = FALSE) = 0;

	//!	データの削除
	virtual void DeleteKey(LPCSTR path) = 0;

	//!	キー数を取得
	virtual int GetKeyCount(LPCSTR path) = 0;

	//!	全てのキー名を文字列として取得
	virtual int GetAllKey(LPCSTR path, IStringArrayPtr list) = 0;

	//!	全てのデータを文字列として取得
	virtual int GetAllData(LPCSTR path, IStringArrayPtr list) = 0;

	/////////////////////////////////////////////////////////////////////////////////////
	//	サブノードに関する処理
	/////////////////////////////////////////////////////////////////////////////////////
	//!	ノードを削除する
	virtual void DeleteNode(LPCSTR path) = 0;

	//!	サブノード数を得る
	virtual int GetSubNodeCount(LPCSTR path) = 0;

	//!	全てのサブノード名を文字列として取得
	virtual int GetAllSubNode(LPCSTR path, IStringArrayPtr list) = 0;
};
//!	ポインタ型
typedef IWorkspace*	IWorkspacePtr;


/*!
	CWorkspaceAccess
*/
class IWorkspaceAccess
{
public:
	//!	インターフェース取得
	virtual IWorkspacePtr	GetIWorkspacePtr() = 0;

	//!	パス取得
	virtual void			GetAccessPath(IStringPtr path) = 0;
};
//!	ポインタ型
typedef IWorkspaceAccess*	IWorkspaceAccessPtr;


/*!
	CWorkspaceAccess のリファレンス型
*/
class IWorkspaceAccessRef
{
public:
	//!	初期化
	virtual void SetWorkspaceAccess(IWorkspacePtr root, LPCSTR path) = 0;
};
//!	ポインタ型
typedef IWorkspaceAccessRef*	IWorkspaceAccessRefPtr;


////////////////////////////////////////////////////////////////////////////////////////////////////////
//	補助クラス
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	文字列補助クラス
*/
class CIStringWrap : public IString
{
public:
	//!	コンストラクタ
	CIStringWrap() : m_str(m_buffer) {};

	//!	コンストラクタ
	CIStringWrap(CString &str) : m_str(str) {};

	//!	コンストラクタ
	CIStringWrap(LPCSTR str) : m_str(m_buffer)
	{
		m_buffer = str;
	};

	//!	文字列を設定
	virtual void SetString(LPCSTR str) { m_str = str; };

	//!	取得
	virtual LPCSTR GetString() { return m_str; };

	//!	空？
	int IsEmpty() { return m_str.IsEmpty(); };

	//!	取得
	operator CString() { return m_str; };

	//!	設定
	void Attach(CString &str) { m_str = str; };

protected:
	//!	参照
	CString	&m_str;

	//!	内部バッファ
	CString	m_buffer;
};


/*!
	文字列配列補助クラス
*/
class CIStringArrayWrap : public IStringArray
{
public:
	CIStringArrayWrap(CStringArray &arr) :
	  m_array(arr)
	{
	};

	//!	初期化
	virtual void Clear()
	{
		m_array.RemoveAll();
	};

	//!	サイズ設定
	virtual void SetSize(int size)
	{
		m_array.SetSize(size);
	};

	//!	サイズ取得
	virtual int GetSize()
	{
		return m_array.GetSize();
	};

	//!	保持している文字列を取得
	virtual void AddString(LPCSTR str)
	{
		m_array.Add(str);
	};

	//!	保持している文字列を取得
	virtual LPCSTR GetString(int index)
	{
		return m_array[index];
	};

	//!	保持している文字列を取得
	virtual void SetString(int index, LPCSTR str)
	{
		m_array[index] = str;
	};

protected:
	CStringArray	&m_array;
};
