#include "StdAfx.h"
#include "ResponseControl.h"
#include "ResponseManager.h"
#include "ServerException.h"

CResponseControl::CResponseControl(void)
{
}

CResponseControl::~CResponseControl(void)
{
	FreeResponseModule();
}


/*!
	レスポンス取得
*/
void CResponseControl::LoadResponseModule(	IServerToolPtr				serverTool,
											IConnectionThreadStatusPtr	threadStatus,
											IConnectionControlPtr		connectionControl,
											CContext					&context)
{
	//	コピー
	m_serverTool = serverTool;
	m_threadStatus = threadStatus;
	m_connectionControl = connectionControl;
	m_context = context;

	//	ヘッダ情報より、レスポンスを生成
	m_response = m_serverTool->GetIResponseManager()->GetResponse(context);
	if(m_response.IsEmpty())
		throw CConnectionErrorException("レスポンスモジュールの取得に失敗しました");

	//	モジュール名を登録
	context.SetResponseModule(m_response->GetResponseName());

	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_START);

	//	レスポンスモジュール初期化
	m_response->Start(GetIResponseContext());
}



/*!
	終了
*/
void CResponseControl::FreeResponseModule()
{
	if(!m_response.IsEmpty())
	{
		//	実行中の関数を登録
		m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_STOP);

		m_response->Stop(GetIResponseContext());
		m_response.Delete();
	}
}



//////////////////////////////////////////////////////////////////////////////////////////////
//	レスポンス生成
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	リクエストヘッダ設定
*/
void CResponseControl::SetRequest()
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_SET_REQUEST);

	//	実行
	m_response->SetRequest(GetIResponseContext(), m_context.GetRequestInfo());
}

/*!
	リクエストボディ設定(繰り返し)
*/
void CResponseControl::SetRequestBody(CBinaryData &body)
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_SET_REQUEST_BODY);

	//	実行
	m_response->SetRequestBody(GetIResponseContext(), body);
}

/*!
	リクエスト完了
*/
void CResponseControl::EndRequest()
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_END_REQUEST);

	//	実行
	m_response->EndRequest(GetIResponseContext());
}


/*!
	レスポンス生成
*/
void CResponseControl::BuildResponse()
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_BUILD_RESPONSE);

	//	実行
	m_response->BuildResponse(GetIResponseContext());
}


/*!
	レスポンスヘッダ取得
*/
void CResponseControl::GetResponse()
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_GET_RESPONSE);

	//	実行
	m_response->GetResponse(GetIResponseContext(), m_context.GetResponseInfo());
}

/*!
	レスポンスボディ取得
*/
int CResponseControl::GetResponseBody(CBinaryData &body, int blockSize)
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_GET_RESPONSE_BODY);

	//	実行
	return m_response->GetResponseBody(GetIResponseContext(), body, blockSize);
}

/*!
	レスポンス完了
*/
void CResponseControl::EndResponse()
{
	//	実行中の関数を登録
	m_threadStatus->SetCurrentModuleFunction(m_response->GetResponseName(), FUNCTION_RESPONSE_END_RESPONSE);

	//	実行
	m_response->EndResponse(GetIResponseContext());
}

