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


CResponseControl::CResponseControl(void)
{
}

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


/*!
	レスポンス取得
*/
void CResponseControl::LoadResponseModule(CIConnectionToolWrap connectionTool)
{
	//	コピー
	m_connectionTool = connectionTool;
	m_threadStatus = m_connectionTool.GetIConnectionThreadStatus();

	//	ヘッダ情報より、レスポンスを生成
	m_response = CIResponseWrapper::CreateWrapper(((IResponseManagerPtr)m_connectionTool.GetIServerTool().
		GetManagerInterface(RESPONSE_MANAGER_INTERFACE_NAME, RESPONSE_MANAGER_INTERFACE_VER))->GetResponse(m_connectionTool.GetContxet()));
	if(m_response.IsEmpty())
		throw CConnectionErrorException("レスポンスモジュールの取得に失敗しました");

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

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

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



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

		m_response->Stop(m_connectionTool.GetIConnectionTool());
		m_response.Delete();
	}
}



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

	//	実行
	m_response->SetRequest(m_connectionTool.GetIConnectionTool());
}

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

	//	実行
	m_response->SetRequestBody(m_connectionTool.GetIConnectionTool(), body.GetCoreInterface());
}

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

	//	実行
	m_response->EndRequest(m_connectionTool.GetIConnectionTool());
}


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

	//	実行
	m_response->BuildResponse(m_connectionTool.GetIConnectionTool());
}


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

	//	実行
	m_response->GetResponse(m_connectionTool.GetIConnectionTool());
}

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

	//	実行
	return m_response->GetResponseBody(m_connectionTool.GetIConnectionTool(), body.GetCoreInterface(), blockSize);
}

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

	//	実行
	m_response->EndResponse(m_connectionTool.GetIConnectionTool());
}

