/*!
	IResponse

	レスポンスの実装すべきインタフェース
*/

#pragma once
#include "IServerTool.h"
#include "IConnectionTool.h"


/*!
	レスポンス
*/
class IResponse
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化(例外発生厳禁！)
	virtual void ResponseStart(IConnectionToolPtr responseContext) = 0;

	//!	停止(例外発生厳禁！)
	virtual void ResponseStop(IConnectionToolPtr responseContext) = 0;

	//!	削除
	virtual void ResponseDelete() = 0;

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

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	1:リクエストヘッダ設定
	virtual void ResponseSetRequest(IConnectionToolPtr responseContext) = 0;

	//!	2:リクエストボディ設定(繰り返し)
	virtual void ResponseSetRequestBody(IConnectionToolPtr responseContext, IBinaryDataPtr body) = 0;

	//!	3:リクエスト完了
	virtual void ResponseEndRequest(IConnectionToolPtr responseContext) = 0;

	//!	4:レスポンス生成
	virtual void ResponseBuildResponse(IConnectionToolPtr responseContext) = 0;

	//!	5:レスポンスヘッダ取得
	virtual void ResponseGetResponse(IConnectionToolPtr responseContext) = 0;

	//!	6:レスポンスボディ取得
	virtual int ResponseGetResponseBody(IConnectionToolPtr responseContext, IBinaryDataPtr body, int blockSize) = 0;

	//!	7:レスポンス完了
	virtual void ResponseEndResponse(IConnectionToolPtr responseContext) = 0;
};
//!	ポインタ型
typedef IResponse* IResponsePtr;


/*!
	レスポンス生成クラス
*/
class IResponseFactory
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void ResponseFactoryStart(IServerToolPtr serverTool) = 0;

	//!	停止
	virtual void ResponseFactoryStop() = 0;

	//!	削除
	virtual void ResponseFactoryDelete() = 0;

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

	//!	レスポンス取得
	virtual IResponsePtr ResponseFactoryGetResponse() = 0;
};
//!	ポインタ型
typedef IResponseFactory* IResponseFactoryPtr;


