#include "StdAfx.h"
#include "PathFilter.h"
#include "IPathManager.h"

#include "Dir.h"

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

CPathFilter::CPathFilter(void)
{
}

CPathFilter::~CPathFilter(void)
{
}

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



//////////////////////////////////////////////////////////////////////////////////////////////
//	リクエスト受信
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	リクエストヘッダ
*/
void CPathFilter::FilterRequestHeader(CIConnectionToolWrap filterContext)
{
	//	ターゲット
	CContextRequestInfo requestInfo = filterContext.GetContxet().GetRequestInfo();
	CContextTargetInfo	targetInfo = filterContext.GetContxet().GetTargetInfo();
	CPathInfo			pathInfo = targetInfo.GetPathInfo();

	//	ターゲット未設定？
	if(!targetInfo.TargetIsSet())
	{
		//	パスマネージャ取得
		CIPathManagerWrap pathManager = filterContext.GetIServerTool().GetIPathManager();

		//	オブジェクト
		CString	object = requestInfo.GetObject();

		//	パス取得
		if(!pathManager.FindPath(object, requestInfo.GetRequestOption().GetHost(), pathInfo))
			throw CServerResponseException(404, _T("指定されたパスが見つかりません"));

		//	ターゲットの設定
		int	serverPathCount = pathInfo.GetServerPath().GetLength();
		CString	target = pathInfo.GetLocalPath() + object.Mid(serverPathCount);
		target.Replace("/", "\\");

		//	情報クリア
		targetInfo.SetTargetIsExist(FALSE);
		targetInfo.SetTargetIsDirectory(FALSE);
		targetInfo.SetTargetIsHidden(FALSE);

		//	転送？
		if(!pathInfo.GetForward().IsEmpty())
		{
			CServerResponseException	move(301, _T("移動してください"));
			move.AddAdditionalHeader("Location", pathInfo.GetForward());
			throw move;
		}

		//	存在確認
		int exist = CFileDirTools::FileExist(target);

		//	"/"無いのに、ディレクトリ？
		if(exist == CFileDirTools::FILE_TYPE_DIRECTORY && !CPathTools::CheckBackSlash(target))
			exist = CFileDirTools::FILE_TYPE_NOTFOUND;	//	見つからないことにする

		//	ターゲット存在確認
		if(exist != CFileDirTools::FILE_TYPE_NOTFOUND)
		{
			//	存在する
			targetInfo.SetTargetIsExist(TRUE);

			//	ターゲット情報確認
			DWORD attr = CFileDirTools::GetFileAttribute(target);
			if(attr != CFileDirTools::FILE_ATTR_ERROR)
			{
				if(attr & CFileDirTools::FILE_ATTR_DIRECTORY)
				{
					targetInfo.SetTargetIsDirectory(TRUE);
					target = CPathTools::AddBackSlash(target);
				}

				if(attr & CFileDirTools::FILE_ATTR_HIDDEN)
					targetInfo.SetTargetIsHidden(TRUE);
			}
		}

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


