/*!
	IFilter

	フィルタの実装すべきインタフェース
*/

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



/*!
	フィルタ
*/
class IFilter
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化(例外発生厳禁！)
	virtual void Start(IConnectionToolPtr filterContext) = 0;

	//!	切断(例外発生厳禁！)
	virtual void Stop(IConnectionToolPtr filterContext) = 0;

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

	//!	フィルタ名取得
	virtual LPCTSTR GetFilterName() = 0;

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	フィルタリング
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	1:リクエストヘッダ
	virtual void FilterRequestHeader(IConnectionToolPtr filterContext) = 0;

	//!	2:ボディを受信、繰り返し(throw)
	virtual void FilterRequestBody(IConnectionToolPtr filterContext, IBinaryDataPtr body) = 0;

	//!	3:受信処理完了
	virtual void FilterEndRequest(IConnectionToolPtr filterContext) = 0;


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


	//!	5:レスポンスヘッダ
	virtual void FilterResponseHeader(IConnectionToolPtr filterContext) = 0;

	//!	6:ボディを送信、繰り返し(throw)
	virtual void FilterResponseBody(IConnectionToolPtr filterContext, IBinaryDataPtr body) = 0;

	//!	7:送信処理完了
	virtual void FilterEndResponse(IConnectionToolPtr filterContext) = 0;


	//!	レスポンスヘッダ(例外発生厳禁！)
	virtual void FilterServerResponse(IConnectionToolPtr filterContext, IBinaryDataPtr body) = 0;
};
//!	ポインタ型
typedef IFilter* IFilterPtr;


/*!
	フィルタ生成クラス
*/
class IFilterFactory
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void Start(IServerToolPtr serverTool) = 0;

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

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

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	フィルタ取得
	virtual IFilterPtr GetFilter() = 0;
};
//!	ポインタ型
typedef IFilterFactory* IFilterFactoryPtr;

