#include "StdAfx.h"
#include "PathManager.h"
#include "ServerException.h"
#include "ServerStartErrorException.h"
#include "TextTools.h"

#define	CLASS_NAME	"PathManager"

CPathManager::CPathManager(void)
{
}

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


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

	//	取得
	m_serverTool = serverTool;
	m_pathSetting = m_serverTool->GetManagerSetting(m_pathSetting.GetSettingName());
	m_pathList = m_pathSetting.GetPathList();

	//	パス設定数取得
	if(m_pathList.GetItemCount() <= 0)
		throw CServerStartErrorException(CLASS_NAME, "パス設定がひとつも存在しません");

	//	インデックスを作成
	m_pathIndex.SetSize(m_pathList.GetItemCount());
	m_pathIndexLen.SetSize(m_pathList.GetItemCount());
	m_hostIndex.SetSize(m_pathList.GetItemCount());
	for(int i=0;i<m_pathList.GetItemCount();i++)
	{
		m_pathIndex[i] = m_pathList.GetItem(i).GetServerPath().MakeUpper();
		m_pathIndexLen[i] = m_pathIndex[i].GetLength();
		m_hostIndex[i] = m_pathList.GetItem(i).GetVirtualHost().MakeUpper();
	}


	m_enableVirtualHost = TRUE;
}

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

///////////////////////////////////////////////////////////////////////////////////////////
//	インターフェース
///////////////////////////////////////////////////////////////////////////////////////////
/*!
	パスを検索

	\return FALSE:見つからない
*/
int CPathManager::FindPath(CString path, CString host, CPathInfo pathInfo)
{
	SCOPE_LOCK();

	//	下準備
	path = path.MakeUpper();
	int	pathLen = path.GetLength();
	host = host.MakeUpper();

	//	検索
	int	maxLen = 0, maxIndex = -1;
	for(int i=0;i<m_pathIndexLen.GetCount();i++)
	{
		//	長さ
		if(m_pathIndexLen[i] > maxLen && m_pathIndexLen[i] <= pathLen)
		{
			//	パス
			if(path.Left(m_pathIndexLen[i]) == m_pathIndex[i])
			{
				//	ホスト
				if(!m_enableVirtualHost || m_hostIndex[i].IsEmpty() || CTextTools::WildCompare(m_hostIndex[i], host))
				{
					maxLen = m_pathIndexLen[i];
					maxIndex = i;
				}
			}
		}
	}

	if(maxIndex == -1)
		return(FALSE);

	pathInfo.Copy(m_pathList.GetItem(maxIndex));
	return(TRUE);
}

/*!
	パス数を取得
*/
int CPathManager::GetPathCount()
{
	SCOPE_LOCK();

	return(m_pathIndexLen.GetCount());
}

/*!
	インデックスからパスを取得
*/
int CPathManager::GetPathByIndex(int index, CPathInfo pathInfo)
{
	SCOPE_LOCK();

	if(index < 0 || index > m_pathIndexLen.GetCount())
		return(-1);

	pathInfo.Copy(m_pathList.GetItem(index));
	return(0);
}

