#pragma once

#include "ServerToolWrap.h"
#include "Settings.h"
#include "SyncObject.h"
#include "IPathManager.h"
#include "SimpleManagerInterfaceImplement.h"

/*!
	パスマネージャ
*/
class CPathManager : public IPathManager
{
public:
	CPathManager(void);
	virtual ~CPathManager(void);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(CIServerToolWrap serverTool);

	//!	停止
	void Stop();

protected:
	///////////////////////////////////////////////////////////////////////////////////////////
	//	IPathManager
	///////////////////////////////////////////////////////////////////////////////////////////
	//!	パスを検索
	virtual int FindPath(LPCSTR path, LPCSTR host, IWorkspaceAccessPtr pathInfo)
	{
		return _FindPath(path, host, CWorkspaceAccess(pathInfo));
	}

	//!	パス数を取得
	virtual int GetPathCount();

	//!	インデックスからパスを取得
	virtual int GetPathByIndex(int index, IWorkspaceAccessPtr pathInfo)
	{
		return _GetPathByIndex(index, CWorkspaceAccess(pathInfo));
	}

	///////////////////////////////////////////////////////////////////////////////////////////
	//	実装
	///////////////////////////////////////////////////////////////////////////////////////////
	//!	パスを検索
	virtual int _FindPath(CString path, CString host, CPathInfo pathInfo);

	//!	インデックスからパスを取得
	virtual int _GetPathByIndex(int index, CPathInfo pathInfo);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	クリティカルセクション
	CCriticalSection					m_scopeLock;

	//!	初期化フラグ
	CInterlockCounter					m_init;

	//!	IServerTool
	CIServerToolWrap					m_serverTool;

	//!	インタフェース
	CSimpleManagerInterfaceImplement	m_managerInterface;

	//!	パス設定
	CPathManagerSetting					m_pathSetting;

	//!	パスリスト
	CPathInfoList						m_pathList;

	//!	パス検索インデックス
	CStringArray						m_pathIndex;

	//!	パス検索インデックス(長さ)
	CArray<int>							m_pathIndexLen;

	//!	バーチャルホスト検索インデックス
	CStringArray						m_hostIndex;

	//!	バーチャルホスト
	int									m_enableVirtualHost;
};
