#include "StdAfx.h"
#include "ResponseManager.h"
#include "IResponse.h"
#include "FileResponse.h"
#include "DirectoryIndexResponse.h"

CResponseManager::CResponseManager(void)
{
}

CResponseManager::~CResponseManager(void)
{
}


//////////////////////////////////////////////////////////////////////////////////////////////
//	初期化・終了
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CResponseManager::Start(CIServerToolWrap serverTool)
{
	//	初期化済み？
	if(m_init)
		return;
	m_init = TRUE;

	m_serverTool = serverTool;

	//	ディレクトリレスポンス
	m_responseFactorys.Add(CIResponseFactoryWrapper::CreateWrapper(new CDirectoryIndexResponseFactory));

	//	ファイルレスポンス
	m_responseFactorys.Add(CIResponseFactoryWrapper::CreateWrapper(new CFileResponseFactory));

	//	初期化
	for(int i=0;i<m_responseFactorys.GetSize();i++)
		m_responseFactorys[i]->ResponseFactoryStart(m_serverTool.GetIServerTool());

	//	インターフェース登録
	m_serverTool.RegisterManagerInterface(RESPONSE_MANAGER_INTERFACE_NAME, this);
}

/*!
	停止
*/
void CResponseManager::Stop()
{
	//	初期化チェック
	if(!m_init)
		return;
	m_init = FALSE;

	//	停止
	for(int i=0;i<m_responseFactorys.GetSize();i++)
		m_responseFactorys[i]->ResponseFactoryStop();

	m_responseFactorys.RemoveAll();

	//	インターフェース登録解除
	m_serverTool.UnRegisterManagerInterface(RESPONSE_MANAGER_INTERFACE_NAME, this);
}


/*!
	レスポンス生成
*/
IResponsePtr CResponseManager::GetResponse(CContext context)
{
	SCOPE_LOCK();

	//	検索
	for(int i=0;i<m_responseFactorys.GetSize();i++)
	{
		if(m_responseFactorys[i]->ResponseFactoryIsYourRequest(context.GetIWorkspaceAccess()))
			return m_responseFactorys[i]->ResponseFactoryGetResponse();
	}

	return NULL;	//	NULLを返す
}

