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

/*!
	フィルタレベル
*/
enum FILTER_LEVEL
{
	FILTER_LEVEL_SERVER_INFO		= 100000,

	FILTER_LEVEL_PATH				= 200000,

	FILTER_LEVEL_INDEX				= 300000,

	FILTER_LEVEL_KEEP_ALIVE			= 400000,

	FILTER_LEVEL_ACCESS_LOG			= 500000,
};


CFilterManager::CFilterManager(void)
{
}

CFilterManager::~CFilterManager(void)
{
}

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

	//	変数コピー
	m_serverTool = serverTool;

	//	設定取得
	m_setting = serverTool.GetManagerSetting(m_setting.GetSettingName());

	//	基本フィルタ追加
	AddBasicFilters();

	//	フィルタ初期化
	for(int i=0;i<m_filterFactorys.GetSize();i++)
		m_filterFactorys[i].Start(m_serverTool.GetIServerTool());

	//	インタフェース初期化
	m_managerInterface.Init((IFilterManagerPtr)this, FILTER_MANAGER_INTERFACE_VER);

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

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

	//	停止
	for(int i=0;i<m_filterFactorys.GetSize();i++)
		m_filterFactorys[i].Stop();
	m_filterFactorys.RemoveAll();

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


/*!
	フィルタ配列取得
*/
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].GetFilter()));
}


//////////////////////////////////////////////////////////////////////////////////////////////
//	補助
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	基本フィルタ追加
*/
void CFilterManager::AddBasicFilters()
{
	//	すべて無効？
	if(m_setting.GetDisableAllFilter())
		return;

	//	サーバ情報
	if(!m_setting.GetDisableServerInfoFilter())
		AddFilterFactory((new CServerInfoFilterFactory())->GetIFilterFactory(), FILTER_LEVEL_SERVER_INFO);

	//	パス情報
	if(!m_setting.GetDisablePathFilter())
		AddFilterFactory((new CPathFilterFactory())->GetIFilterFactory(), FILTER_LEVEL_PATH);

	//	インデックス
	if(!m_setting.GetDisableIndexFilter())
		AddFilterFactory((new CIndexFilterFactory())->GetIFilterFactory(), FILTER_LEVEL_INDEX);

	//	KeepAlive情報
	if(!m_setting.GetDisableKeepAliveFilter())
		AddFilterFactory((new CKeepAliveFilterFactory())->GetIFilterFactory(), FILTER_LEVEL_KEEP_ALIVE);

	//	アクセスログ
	if(!m_setting.GetDisableAccessLogFilter())
		AddFilterFactory((new CAccessLogFilterFactory())->GetIFilterFactory(), FILTER_LEVEL_ACCESS_LOG);
}


/*!
	モジュール追加
*/
void CFilterManager::AddFilterFactory(IFilterFactoryPtr factory, int filterLevel)
{
	//	挿入場所を検索
	for(int i=0;i<m_filterFactorys.GetSize();i++)
	{
		if(m_filterFactorys[i].GetFilterLevel() > filterLevel)
		{
			//	挿入
			m_filterFactorys.InsertAt(i, CFilterFactoryArrayItem(CIFilterFactoryWrapper::CreateWrapper(factory), filterLevel));
			return;
		}
	}

	//	最後
	m_filterFactorys.Add(CFilterFactoryArrayItem(CIFilterFactoryWrapper::CreateWrapper(factory), filterLevel));
}
