#pragma once

#include "IFilter.h"
#include "IServerTool.h"
#include "SyncObject.h"

class CFilterArray : public CArray<IFilterPtr> {};
class CFilterFactoryArray : public CArray<IFilterFactoryPtr> {};

/*!
	フィルターマネージャインタフェース
*/
class IFilterManager
{
public:
	virtual ~IFilterManager() {};

	//!	インタフェース取得
	virtual IFilterManagerPtr GetIFilterManager() = 0;

	//!	フィルタ配列取得
	virtual void GetFilterArray(CFilterArray &filters) = 0;
};

//!	インタフェース定義
DEFINE_INTERFACE_NOWRAP(IFilterManager);


/*!
	フィルターマネージャ
*/
class CFilterManager : public IFilterManager
{
public:
	CFilterManager(void);
	virtual ~CFilterManager(void);

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化・終了
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(IServerToolPtr serverTool);

	//!	停止
	void Stop();

	//!	インタフェース取得
	virtual IFilterManagerPtr GetIFilterManager() { return IFilterManagerRet(this, FALSE); };

	//!	フィルタ配列取得
	virtual void GetFilterArray(CFilterArray &filters);

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化フラグ
	CInterlockCounter	m_init;

	//!	クリティカルセクション
	CCriticalSection	m_scopeLock;

	//!	サーバツール
	IServerToolPtr		m_serverTool;

	//!	ファクトリ
	CFilterFactoryArray	m_filterFactorys;
};

