#pragma once

#include "SortArray.h"
#include "confignode.h"
#include "configaccess.h"
#include "buffer.h"


class CConfig
{
protected:
	CCriticalSection	m_scopeLock;

public:
	CConfig(void);
	CConfig(CConfig &other);
	~CConfig(void);
	void SetConfig(CString path, CString data);								//	データの設定
	CString GetConfig(CString path, CString defaultData,int noCase=FALSE);	//	データの取得
	int GetAllKey(CString path,CStringArray &list);							//	全てのキーを取得
	int GetAllSubNode(CString path,CStringArray &list);						//	全てのサブノードを取得
	CConfigAccess GetAccess(CString path);									//	アクセスクラス取得
	CConfigAccess GetCleanAccess(CString path);								//	アクセスクラス取得とクリア
	void Clear(CString path);												//	クリア
	void Copy(CString destPath, CString srcPath, CConfig* srcConfig=NULL);	//	コピー
	CString	ToNodePath(CString path);										//	ノードパスに変更
	void DeleteNode(CString path);											//	ノード削除
	void DeleteKey(CString path);											//	キー削除
	int GetKeyCount(CString path);											//	全てのキー数を取得
	int GetSubNodeCount(CString path);										//	全てのサブノードを数取得
	CString GetKeySwapString(CString path,CString str,
							 CString noData="",CConfigSwapBase *swap=NULL);	//	キー名で置き換えた文字列を取得
	void Lock() {m_scopeLock.Lock();};
	void Unlock() {m_scopeLock.Unlock();};
	CCriticalSection *GetCriticalSection();

	void CopyAllKeys(CString path,CSortArray<CConfigNode::CConfigKey,CConfigNode::CConfigKey&> &keyData);	//	全てのキーをコピー


	int SaveToFile(CString path,CString savePath = "");						//	XMLファイルへ出力
	int LoadFromFile(CString path);											//	XMLよりロード

	CString ToXMLString(CString savePath = "");								//	XML文字列へ出力
	int FromXMLString(CString xml);											//	XML文字列から生成
	
	CString	ToString(CString savePath = "");								//	生データに
	int FromString(CString load);											//	生データから
	CString GetNextNode(char **buf);

	void EnableAutoSwap(CConfigSwapBase *swap);

private:
	CConfigSwapBase	*m_swap;
	CConfigNode	m_tree;

	void Copy(CConfigNode *dest, CString srcPath);							//	コピー
};

//	クリティカルセクション
#define	CONFIG_LOCK(x)\
	CSingleLock	__configLock(x.GetCriticalSection());\
	__configLock.Lock();

