#pragma once
#include "IServerToolWrap.h"
#include "Context.h"
#include "SyncObject.h"
#include "Settings.h"

/*!
	コンテキスト取得用インターフェース
*/
class IConetextGene
{
public:
	//!	コンテキストの取得
	virtual CContext GetNewContext(LONG connectionID) = 0;

	//!	コンテキストの破棄
	virtual void ReleaseContext(CContext context) = 0;
};
//!	ポインタ型
typedef IConetextGene* IConetextGenePtr;


/*!
	コンテキスト管理用インターフェース
*/
class IConetextManager
{
public:
	//!	コンテキストのコピー
	virtual void DuplicateContext(CWorkspace &copyTo, CUTF8String copyRootPath = _U8("")) = 0;
};
//!	ポインタ型
typedef IConetextManager* IConetextManagerPtr;


/*!
	コンテキストマネージャ
*/
class CCnotextManager : protected IConetextGene, protected IConetextManager
{
public:
	CCnotextManager(void);
	virtual ~CCnotextManager(void);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	void Start(CIServerToolWrap serverTool);

	//!	停止
	void Stop();

	//!	IConetextManager取得
	IConetextManagerPtr GetIConetextManager() { return this; };

	//!	IConetextGene取得
	IConetextGenePtr GetIConetextGene() { return this; };

protected:
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	IConetextManager
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	コンテキストのコピー
	void DuplicateContext(CWorkspace &copyTo, CUTF8String copyRootPath);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	IConetextGene
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	コンテキストの取得
	virtual CContext GetNewContext(LONG connectionID);

	//!	コンテキストの破棄
	virtual void ReleaseContext(CContext context);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	ツール
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	日付取得
	void GetDate(CContextDate date);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化フラグ
	CInterlockCounter		m_init;

	//!	設定
	CContextManagerSetting	m_setting;

	//!	ログサイズ
	CInterlockCounter		m_maxConetextLog;

	//!	IDカウンタ
	CInterlockCounter		m_contextID;

	//!	作業領域
	CWorkspace				m_contextRoot;

	//!	作業領域アクセス用
	CWorkspaceAccess		m_context;

	//!	作業領域アクセス用
	CWorkspaceAccess		m_contextLog;
};
