#pragma once

#include "FilterManager.h"

class CFilterControl : protected IFilterContext
{
public:
	CFilterControl(void);
	virtual ~CFilterControl(void);

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	void AttachFilters(IServerToolPtr serverTool, IConnectionThreadStatusPtr threadStatus, IConnectionControlPtr connectionControl, CContext &context);

	//!	終了
	void DetachFilters();

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	フィルタ
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	リクエストヘッダ
	void FilterRequestHeader();

	//!	ボディを受信、繰り返し(throw)
	void FilterRequestBody(CBinaryData &body);

	//!	受信処理完了
	void FilterEndRequest();

	//!	レスポンス生成
	void FilterBuildResponse();

	//!	レスポンスヘッダ
	void FilterResponseHeader();

	//!	ボディを送信、繰り返し(throw)
	void FilterResponseBody(CBinaryData &body);

	//!	送信処理完了
	void FilterEndResponse();

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

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	IFilterContext
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	同じインタフェース取得
	virtual IFilterContextPtr GetIFilterContext()  { return IFilterContextRet(this, FALSE); };

	//!	サーバツール取得
	virtual IServerToolPtr GetIServerTool() { return m_serverTool->GetIServerTool(); };

	//!	スレッドステータス取得
	virtual IConnectionThreadStatusPtr GetIConnectionThreadStatus() { return m_threadStatus->GetIConnectionThreadStatus(); };

	//!	接続取得
	virtual IConnectionControlPtr GetIConnectionControl() { return m_connectionControl->GetIConnectionControl(); };
		
	//!	コンテキスト取得
	virtual CContext GetContxet() { return m_context; };

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバツール
	IServerToolPtr				m_serverTool;

	//!	スレッドステータス
	IConnectionThreadStatusPtr	m_threadStatus;

	//!	接続コントロール
	IConnectionControlPtr		m_connectionControl;

	//!	コンテキスト
	CContext					m_context;

	//!	フィルタ配列
	CFilterArray				m_filters;
};
