#pragma once
#include "ifilter.h"
#include "ServerToolWrap.h"
#include "BinaryData.h"
#include "ConnectionToolWrap.h"


/*!
	フィルタファクトリ　ベース
*/
class CFilterFactoryBase
{
public:
	//!	コンストラクタ
	CFilterFactoryBase(void)
	{
		m_interface.SetFilterFactoryBase(this);
	}

	//!	デストラクタ
	virtual ~CFilterFactoryBase(void)
	{
	}

	//!	インタフェース取得
	IFilterFactoryPtr GetIFilterFactory()
	{
		return &m_interface;
	}

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

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

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

	//!	取得
	virtual IFilterPtr GetFilter() = 0;

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	フィルタインタフェース
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	フィルタインタフェース
	class CFilterFactoryInterface :	public IFilterFactory
	{
	public:
		CFilterFactoryInterface()
		{
			m_filterFactory = NULL;
		}

		//!	実装をセット
		void SetFilterFactoryBase(CFilterFactoryBase *filterFactory)
		{
			m_filterFactory = filterFactory;
		}

		//!	初期化
		virtual void Start(IServerToolPtr serverTool)
		{
			m_filterFactory->Start(serverTool);
		}

		//!	停止
		virtual void Stop()
		{
			m_filterFactory->Stop();
		}

		//!	削除
		virtual void Delete()
		{
			m_filterFactory->Delete();
		}

		//!	フィルタ取得
		virtual IFilterPtr GetFilter()
		{
			return m_filterFactory->GetFilter();
		}

	protected:
		//////////////////////////////////////////////////////////////////////////////////////////////
		//	メンバ変数
		//////////////////////////////////////////////////////////////////////////////////////////////
		//!	実装
		CFilterFactoryBase	*m_filterFactory;
	};

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	インタフェース
	CFilterFactoryInterface	m_interface;
};



/*!
	フィルタベース
*/
class CFilterBase
{
public:
	//!	コンストラクタ
	CFilterBase(void)
	{
		m_interface.SetFilterBase(this);
	};

	//!	デストラクタ
	virtual ~CFilterBase(void)
	{
	};

	//!	インタフェース取得
	IFilterPtr GetIFilter()
	{
		return &m_interface;
	}

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void Start(CIConnectionToolWrap filterContext) {};

	//!	切断
	virtual void Stop(CIConnectionToolWrap filterContext) {};

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

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

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

	//!	2:ボディを受信、繰り返し(throw)
	virtual void FilterRequestBody(CIConnectionToolWrap filterContext, CBinaryData &body) {};

	//!	3:受信処理完了
	virtual void FilterEndRequest(CIConnectionToolWrap filterContext) {};


	//!	4:レスポンス生成
	virtual void FilterBuildResponse(CIConnectionToolWrap filterContext) {};


	//!	5:レスポンスヘッダ
	virtual void FilterResponseHeader(CIConnectionToolWrap filterContext) {};

	//!	6:ボディを送信、繰り返し(throw)
	virtual void FilterResponseBody(CIConnectionToolWrap filterContext, CBinaryData &body) {};

	//!	7:送信処理完了
	virtual void FilterEndResponse(CIConnectionToolWrap filterContext) {};


	//!	レスポンスヘッダ(例外発生厳禁！)
	virtual void FilterServerResponse(CIConnectionToolWrap filterContext, CBinaryData &body) {};

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	フィルタインタフェース
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	フィルタインタフェース
	class CFilterInterface : public IFilter
	{
	public:
		//!	コンストラクタ
		CFilterInterface()
		{
			m_filterBase = NULL;
		}

		//!	実装をセット
		void SetFilterBase(CFilterBase *filterBase)
		{
			m_filterBase = filterBase;
		}

		//!	初期化
		virtual void Start(IConnectionToolPtr filterContext)
		{
			m_filterBase->Start(filterContext);
		}

		//!	切断
		virtual void Stop(IConnectionToolPtr filterContext)
		{
			m_filterBase->Stop(filterContext);
		}

		//!	削除
		virtual void Delete()
		{
			m_filterBase->Delete();
		}

		//!	フィルタ名取得
		virtual LPCTSTR GetFilterName()
		{
			return m_filterBase->GetFilterName();
		}

		//!	リクエストヘッダ
		virtual void FilterRequestHeader(IConnectionToolPtr filterContext)
		{
			m_filterBase->FilterRequestHeader(filterContext);
		}

		//!	ボディを受信、繰り返し(throw)
		virtual void FilterRequestBody(IConnectionToolPtr filterContext, IBinaryDataPtr body)
		{
			m_filterBase->FilterRequestBody(filterContext, CBinaryData(body));
		}

		//!	受信処理完了
		virtual void FilterEndRequest(IConnectionToolPtr filterContext)
		{
			m_filterBase->FilterEndRequest(filterContext);
		}

		//!	レスポンス生成
		virtual void FilterBuildResponse(IConnectionToolPtr filterContext)
		{
			m_filterBase->FilterBuildResponse(filterContext);
		}

		//!	レスポンスヘッダ
		virtual void FilterResponseHeader(IConnectionToolPtr filterContext)
		{
			m_filterBase->FilterResponseHeader(filterContext);
		}

		//!	ボディを送信、繰り返し(throw)
		virtual void FilterResponseBody(IConnectionToolPtr filterContext, IBinaryDataPtr body)
		{
			m_filterBase->FilterResponseBody(filterContext, CBinaryData(body));
		}

		//!	送信処理完了
		virtual void FilterEndResponse(IConnectionToolPtr filterContext)
		{
			m_filterBase->FilterEndResponse(filterContext);
		}

		//!	レスポンスヘッダ(例外発生厳禁！)
		virtual void FilterServerResponse(IConnectionToolPtr filterContext, IBinaryDataPtr body)
		{
			m_filterBase->FilterServerResponse(filterContext, CBinaryData(body));
		}

	protected:
		//////////////////////////////////////////////////////////////////////////////////////////////
		//	メンバ変数
		//////////////////////////////////////////////////////////////////////////////////////////////
		//!	実装
		CFilterBase	*m_filterBase;
	};
	
protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	インタフェース
	CFilterInterface	m_interface;
};
