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

/*!
	コンテキスト取得用インターフェース
*/
class IConetextGene
{
public:
	//!	デストラクタ
	virtual ~IConetextGene() {};

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

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

//!	インターフェース定義
DEFINE_INTERNAL_INTERFACE_NOWRAP(IConetextGene);

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

//!	インターフェース定義
DEFINE_INTERNAL_INTERFACE_NOWRAP(IConetextManager);


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

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

	//!	停止
	void Stop();

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

	//!	IConetextGene取得
	IConetextGeneIIPtr GetIConetextGene() { return IConetextGeneRet(this, FALSE); };

protected:
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	IConetextManager
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	コンテキストのコピー
	void DuplicateContext(CWorkspace &copyTo, CString 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;
};
