#include "StdAfx.h"
#include "CGIManager.h"
#include "Dir.h"
#include "TextTools.h"

#define	MAX_HEADER_LINE_LENGTH	256

CCGIManager::CCGIManager(void)
{
}

CCGIManager::~CCGIManager(void)
{
	Stop();
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CCGIManager::Start(CIServerToolWrap serverTool)
{
	ASSERT(!m_init);
	m_init = TRUE;

	//	取得
	m_serverTool = serverTool;
	m_setting = m_serverTool.GetManagerSetting(m_setting.GetSettingName());
	m_cgiCommandList = m_setting.GetCGICommandList();

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

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

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


//////////////////////////////////////////////////////////////////////////////////////////////
//	ICGIManager
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	一致するCGIコマンドがあるか取得する

*/
int CCGIManager::TargetIsCGI(LPCSTR targetPath)
{
	//	検索
	for(int i=0;i<m_cgiCommandList.GetItemCount();i++)
	{
		if(IsMatch(targetPath, m_cgiCommandList.GetItem(i)))
			return(TRUE);
	}
	return(FALSE);
}


/*!
	一致するCGIコマンドを取得する

	\return	TRUE->一致した
*/
int CCGIManager::_GetCGICommand(CString targetPath, CCGICommand command)
{
	//	検索
	for(int i=0;i<m_cgiCommandList.GetItemCount();i++)
	{
		if(IsMatch(targetPath, m_cgiCommandList.GetItem(i)))
		{
			//	取得する
			command.Copy(m_cgiCommandList.GetItem(i));
			return(TRUE);
		}
	}
	return(FALSE);
}


//////////////////////////////////////////////////////////////////////////////////////////////
//	ツール
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	一致するか取得する
*/
int CCGIManager::IsMatch(CString targetPath, CCGICommand command)
{
	//	ファイル名比較
	if(!CTextTools::WildCompare(command.GetPathFilter(), targetPath))
		return(FALSE);

	//	ヘッダタイプ
	if(command.GetWindowsExecutable())
		return(DetectWindowsExecutable(targetPath));
	else
		return(CheckHeader(targetPath, command.GetHeaderFilter()));
}


/*!
	実行ファイル検出
*/
int CCGIManager::DetectWindowsExecutable(CString targetPath)
{
	CString	header = GetFirstLine(targetPath);

	//	MZで始まっているか？
	if(header.GetLength() >= 2 && header[0] == 'M' && header[1] == 'Z')
		return(TRUE);
	return(FALSE);
}


/*!
	ヘッダチェック
*/
int CCGIManager::CheckHeader(CString targetPath, CString headerFilter)
{
	CString	header = GetFirstLine(targetPath);

	//	一致するかチェック
	return CTextTools::WildCompare(headerFilter, header);
}


/*!
	最初の一行をロード
*/
CString CCGIManager::GetFirstLine(CString targetPath)
{
	CString	ret;
	FILE	*text;

	//	読み込んでみる
	if(!fopen_s(&text, targetPath, "rb"))
	{
		fgets(ret.GetBuffer(MAX_HEADER_LINE_LENGTH + 1), MAX_HEADER_LINE_LENGTH, text);
		fclose(text);
		ret.ReleaseBuffer();
		return(ret);
	}
	else
		return("");
}
