/*!
	IResponse

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

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


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

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

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

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

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

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

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


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


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

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

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


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

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

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

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

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


