#include "StdAfx.h"
#include "IndexFilter.h"
#include "Dir.h"
#include "ServerException.h"

//!	モジュール名
static TCHAR _MODULE_NAME[] = _T("IndexFilter");


CIndexFilter::CIndexFilter(void)
{
}

CIndexFilter::~CIndexFilter(void)
{
}



/*!
	フィルタ名取得
*/
LPCTSTR CIndexFilter::GetFilterName()
{
	return _MODULE_NAME;
};

/*!
	初期化
*/
void CIndexFilter::StartFactory(IServerToolPtr serverTool)
{
	//	初期化済み？
	if(m_init)
		return;
	m_init = TRUE;

	//	コピー、初期化
	m_serverTool = serverTool;

	//	設定取得
	m_setting = m_serverTool->GetFilterSetting(m_setting.GetSettingName());
	m_moveMode = m_setting.GetMoveMode();

	//	コピー
	CWorkspaceStringList	list = m_setting.GetIndexList();
	for(int i=0;i<list.GetItemCount();i++)
		m_indexFiles.Add(list.GetItem(i));
}


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


//////////////////////////////////////////////////////////////////////////////////////////////
//	リクエスト受信
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	リクエストヘッダ
*/
void CIndexFilter::FilterRequestHeader(IFilterContextPtr filterContext, CContextRequestInfo &requestInfo)
{
	//	ターゲット
	CContextTargetInfo	targetInfo = filterContext->GetContxet().GetTargetInfo();

	//	ディレクトリ？
	if(targetInfo.TargetIsSet() && targetInfo.GetTargetIsDirectory() && targetInfo.GetTargetIsExist())
	{
		SCOPE_LOCK();
		CString	targetPath = targetInfo.GetTarget();
		
		//	検索
		for(int i=0;i<m_indexFiles.GetSize();i++)
		{
			if(CFileDirTools::FileExist(targetPath + m_indexFiles[i]) == CFileDirTools::FILE_TYPE_FILE)
			{
				if(m_moveMode)
				{
					CServerResponseException	move(301, _T("インデックスファイルへ移動してください"));
					move.AddAdditionalHeader("Location", m_indexFiles[i]);
					throw move;
				}
				else
				{
					//	ターゲット上書き
					targetInfo.SetTarget(targetPath + m_indexFiles[i]);
					targetInfo.SetTargetIsDirectory(FALSE);

					TRACE("CIndexFilter::TargetSet : %s (Exist : %d)\n", targetInfo.GetTarget(), targetInfo.GetTargetIsExist());
				}
			}
		}
	}
}


