#pragma once
#include "iresponse.h"

/*!
	レスポンスファクトリ ベース
*/
class CResponseFactoryBase :
	public IResponseFactory
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void StartFactory(IServerToolPtr serverTool) {};

	//!	停止
	virtual void StopFactory() {};

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	自分のアイテムか？
	virtual int IsYourRequest(CContext context) = 0;

	//!	レスポンス取得
	virtual IResponsePtr GetResponse() = 0;
};


/*!
	レスポンス ベース
*/
class CResponseBase :
	public IResponse
{
public:
	virtual ~CResponseBase(void)
	{
	}

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化(例外発生厳禁！)
	virtual void Start(IResponseContextPtr responseContext) {};

	//!	停止(例外発生厳禁！)
	virtual void Stop(IResponseContextPtr responseContext)  {};

	//!	レスポンス名取得(必ずstatic領域に宣言しなければならない)
	virtual LPCTSTR GetResponseName() = 0;

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	リクエストヘッダ設定
	virtual void SetRequest(IResponseContextPtr responseContext, CContextRequestInfo requestInfo) {};

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

	//!	リクエスト完了
	virtual void EndRequest(IResponseContextPtr responseContext) {};


	//!	レスポンス生成
	virtual void BuildResponse(IResponseContextPtr responseContext) {};


	//!	レスポンスヘッダ取得
	virtual void GetResponse(IResponseContextPtr responseContext, CContextResponseInfo responseInfo) {};

	//!	レスポンスボディ取得
	virtual int GetResponseBody(IResponseContextPtr responseContext, CBinaryData &body, int blockSize) { return 0; };

	//!	レスポンス完了
	virtual void EndResponse(IResponseContextPtr responseContext) {};
};
