#pragma once
#include "IResponse.h"
#include "IServerTool.h"
#include "Context.h"
#include "SyncObject.h"

class CResponseFactoryArray : public CArray<IResponseFactoryIIPtr> {};


/*!
	レスポンス管理
*/
class IResponseManager
{
public:
	virtual ~IResponseManager(void) {};

	//!	レスポンス生成
	virtual IResponseIIPtr GetResponse(CContext context) = 0;
};

//!	インタフェース
DEFINE_INTERNAL_INTERFACE_NOWRAP(IResponseManager);


/*!
	レスポンス管理
*/
class CResponseManager : public IResponseManager
{
public:
	CResponseManager(void);
	virtual ~CResponseManager(void);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(IServerToolIIPtr serverTool);

	//!	停止
	void Stop();

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	IResponseManager
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	インターフェース取得
	IResponseManagerIIPtr GetIResponseManager() { return IResponseManagerRet(this, FALSE); };

	//!	レスポンス生成
	IResponseIIPtr GetResponse(CContext context);

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

	//!	クリティカルセクション
	CCriticalSection		m_scopeLock;

	//!	サーバツール
	IServerToolIIPtr			m_serverTool;

	//!	ファクトリ
	CResponseFactoryArray	m_responseFactorys;
};
