/*!
	CResponseControl

	IResponseのラッパ
	実行中の関数名が自動設定される
*/

#pragma once
#include "IServerTool.h"
#include "IConnectionThreadStatus.h"
#include "IResponse.h"

class CResponseControl : protected IResponseContext
{
public:
	CResponseControl(void);
	virtual ~CResponseControl(void);

	//!	レスポンス取得
	void LoadResponseModule(	IServerToolPtr				serverTool,
								IConnectionThreadStatusPtr	threadStatus,
								IConnectionControlPtr		connectionControl,
								CContext					&context);


	//!	終了
	void FreeResponseModule();

	
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	リクエストヘッダ設定
	virtual void SetRequest();

	//!	リクエストボディ設定(繰り返し)
	virtual void SetRequestBody(CBinaryData &body);

	//!	リクエスト完了
	virtual void EndRequest();


	//!	レスポンス生成
	virtual void BuildResponse();


	//!	レスポンスヘッダ取得
	virtual void GetResponse();

	//!	レスポンスボディ取得
	virtual int GetResponseBody(CBinaryData &body, int blockSize);

	//!	レスポンス完了
	virtual void EndResponse();

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	IFilterContext
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	同じインタフェース取得
	virtual IResponseContextPtr GetIResponseContext()  { return IResponseContextRet(this, FALSE); };

	//!	サーバツール取得
	virtual IServerToolPtr GetIServerTool() { return m_serverTool->GetIServerTool(); };

	//!	スレッドステータス取得
	virtual IConnectionThreadStatusPtr GetIConnectionThreadStatus() { return m_threadStatus->GetIConnectionThreadStatus(); };

	//!	接続取得
	virtual IConnectionControlPtr GetIConnectionControl() { return m_connectionControl->GetIConnectionControl(); };
		
	//!	コンテキスト取得
	virtual CContext GetContxet() { return m_context; };

	//////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////
	//!	接続
	IServerToolPtr				m_serverTool;

	//!	接続
	IConnectionThreadStatusPtr	m_threadStatus;

	//!	接続コントロール
	IConnectionControlPtr		m_connectionControl;

	//!	コンテキスト
	CContext					m_context;

	//!	レスポンスモジュール
	IResponsePtr				m_response;
};
