#pragma once
#include "iresponse.h"
#include "ConnectionToolWrap.h"
#include "BinaryData.h"


/*!
	レスポンスファクトリ ベース
*/
class CResponseFactoryBase :
	public IResponseFactory
{
public:
	virtual ~CResponseFactoryBase(void)
	{
	}

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void ResponseFactoryStart(IServerToolPtr serverTool) { _ResponseFactoryStart(serverTool); };

	//!	停止
	virtual void ResponseFactoryStop() { _ResponseFactoryStop(); };

	//!	削除
	virtual void ResponseFactoryDelete() {};

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	自分のアイテムか？
	virtual int ResponseFactoryIsYourRequest(IWorkspaceAccessPtr context)
	{
		return _ResponseFactoryIsYourRequest(CWorkspaceAccess(context));
	}

	//!	レスポンス取得
	virtual IResponsePtr ResponseFactoryGetResponse()
	{
		return _ResponseFactoryGetResponse();
	}

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void _ResponseFactoryStart(CIServerToolWrap serverTool) {};

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

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

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


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

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

	//!	停止(例外発生厳禁！)
	virtual void ResponseStop(IConnectionToolPtr responseContext)  { _ResponseStop(responseContext); };

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

	//!	削除
	virtual void ResponseDelete() {};

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	リクエストヘッダ設定
	virtual void ResponseSetRequest(IConnectionToolPtr responseContext) { _ResponseSetRequest(responseContext); };

	//!	リクエストボディ設定(繰り返し)
	virtual void ResponseSetRequestBody(IConnectionToolPtr responseContext, IBinaryDataPtr body) { _ResponseSetRequestBody(responseContext, CBinaryData(body)); };

	//!	リクエスト完了
	virtual void ResponseEndRequest(IConnectionToolPtr responseContext) { _ResponseEndRequest(responseContext); };


	//!	レスポンス生成
	virtual void ResponseBuildResponse(IConnectionToolPtr responseContext) { _ResponseBuildResponse(responseContext); };


	//!	レスポンスヘッダ取得
	virtual void ResponseGetResponse(IConnectionToolPtr responseContext) { _ResponseGetResponse(responseContext); };

	//!	レスポンスボディ取得
	virtual int ResponseGetResponseBody(IConnectionToolPtr responseContext, IBinaryDataPtr body, int blockSize) { return _ResponseGetResponseBody(responseContext, CBinaryData(body), blockSize); };

	//!	レスポンス完了
	virtual void ResponseEndResponse(IConnectionToolPtr responseContext) { _ResponseEndResponse(responseContext); };

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化(例外発生厳禁！)
	virtual void _ResponseStart(CIConnectionToolWrap responseContext) {};

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

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	リクエストヘッダ設定
	virtual void _ResponseSetRequest(CIConnectionToolWrap responseContext) {};

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

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


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


	//!	レスポンスヘッダ取得
	virtual void _ResponseGetResponse(CIConnectionToolWrap responseContext) {};

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

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