/*!
	IResponse

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

#pragma once
#include "InterfaceTemplate.h"
#include "Context.h"
#include "IServerTool.h"
#include "IConnectionControl.h"
#include "IConnectionThreadStatus.h"

//!	インターフェース定義
class IResponse;
class IResponseFactory;
class IResponseContext;
DEFINE_INTERFACE(IResponse);
DEFINE_INTERFACE(IResponseFactory);
DEFINE_INTERFACE_NOWRAP(IResponseContext);

/*!
	レスポンスコンテキスト
*/
class IResponseContext
{
public:
	virtual ~IResponseContext() {};

	//!	同じインタフェース取得
	virtual IResponseContextPtr GetIResponseContext() = 0;

	//!	サーバツール取得
	virtual IServerToolPtr GetIServerTool() = 0;

	//!	スレッドステータス取得
	virtual IConnectionThreadStatusPtr GetIConnectionThreadStatus() = 0;

	//!	接続取得
	virtual IConnectionControlPtr GetIConnectionControl() = 0;
		
	//!	コンテキスト取得
	virtual CContext GetContxet() = 0;
};



/*!
	レスポンス生成クラス
*/
class IResponseFactory
{
public:
	virtual ~IResponseFactory(void)
	{
	}

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void StartFactory(IServerToolPtr serverTool) = 0;

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

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

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


/*!
	レスポンス生成クラス
*/
class IResponse
{
public:
	virtual ~IResponse(void)
	{
	}

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

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

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

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

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

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


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


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

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

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

