#include "StdAfx.h"
#include "FilterManager.h"
#include "ServerInfoFilter.h"
#include "PathFilter.h"
#include "IndexFilter.h"
#include "AccessLogFilter.h"
#include "KeepAliveFilter.h"

CFilterManager::CFilterManager(void)
{
}

CFilterManager::~CFilterManager(void)
{
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	初期化・終了
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CFilterManager::Start(CIServerToolWrap serverTool)
{
	//	初期化済み？
	if(m_init)
		return;
	m_init = TRUE;

	m_serverTool = serverTool;

	//	サーバ情報
	m_filterFactorys.Add(CIFilterFactoryWrapper::CreateWrapper(new CServerInfoFilterFactory));

	//	パス情報
	m_filterFactorys.Add(CIFilterFactoryWrapper::CreateWrapper(new CPathFilterFactory));

	//	KeepAlive情報
	m_filterFactorys.Add(CIFilterFactoryWrapper::CreateWrapper(new CKeepAliveFilterFactory));

	//	インデックス
	m_filterFactorys.Add(CIFilterFactoryWrapper::CreateWrapper(new CIndexFilterFactory));

	//	アクセスログ
	m_filterFactorys.Add(CIFilterFactoryWrapper::CreateWrapper(new CAccessLogFilterFactory));

	//	初期化
	for(int i=0;i<m_filterFactorys.GetSize();i++)
		m_filterFactorys[i]->FilterFactoryStart(m_serverTool.GetIServerTool());

	//	インターフェース登録
	m_serverTool.RegisterManagerInterface(FILTER_MANAGER_INTERFACE_NAME, this);
}

/*!
	停止
*/
void CFilterManager::Stop()
{
	//	初期化チェック
	if(!m_init)
		return;
	m_init = FALSE;

	//	停止
	for(int i=0;i<m_filterFactorys.GetSize();i++)
		m_filterFactorys[i]->FilterFactoryStop();

	m_filterFactorys.RemoveAll();

	//	インターフェース登録解除
	m_serverTool.UnRegisterManagerInterface(FILTER_MANAGER_INTERFACE_NAME, this);
}


/*!
	フィルタ配列取得
*/
void CFilterManager::GetFilterArray(CFilterArray &filters)
{
	SCOPE_LOCK();
	filters.RemoveAll();

	for(int i=0;i<m_filterFactorys.GetSize();i++)
		filters.Add(CIFilterWrapper::CreateWrapper(m_filterFactorys[i]->FilterFactoryGetFilter()));
}
