#include "StdAfx.h"
#include "Server.h"
#include "Dir.h"
#include "ServerStartErrorException.h"

#define	CLASS_NAME	"Server"

CServer::CServer(void)
{
}

CServer::~CServer(void)
{
	StopServer();
}



/////////////////////////////////////////////////////////////////////////////////////////////////
//	IServerControl
/////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	サーバの開始
*/
void CServer::StartServer()
{
	//	実行中？
	if(m_serverRunning)
		return;
	m_serverRunning = TRUE;

	//	情報更新
	SetServerStatusStr("ServerVersion", SERVER_VERSION);
	SetServerStatusStr("ServerVersionString", SERVER_VERSION_STRING);
	SetServerStatusStr("ServerRoot", CPathTools::GetAppPath());

	//	初期化エラー
	try
	{
		//	状態更新
		WriteSystemLog(CLASS_NAME, SERVER_STATUS_NORMAL_LOG,	"サーバの実行を開始します");

		/*
			管理機能初期化
		*/
		//	設定マネージャ初期化
		m_settingManager.Start(GetIServerTool());

		//	ステータスマネージャ初期化
		m_statusManager.Start(GetIServerTool());

		//	アクセスログマネージャ起動
		m_logManager.Start(GetIServerTool());

		//	パスマネージャ初期化
		m_pathManager.Start(GetIServerTool());

		//	サーバテキストマネージャ起動
		m_serverTextManager.Start(GetIServerTool());

		//	MimeTypeマネージャ初期化
		m_mineTypeManager.Start(GetIServerTool());

		//	フィルタマネージャ初期化
		m_filterManager.Start(GetIServerTool());

		//	レスポンスマネージャ起動
		m_responseManager.Start(GetIServerTool());

		/*
			通信機能初期化
		*/
		//	接続マネージャ開始
		m_connectionManager.Start(GetIServerTool());

		//	リスナ初期化
		m_listenerManager.Start(GetIServerTool(), m_connectionManager.GetIClientConnectionQueue());


		//	状態更新
		WriteSystemLog(CLASS_NAME, SERVER_STATUS_NORMAL_LOG,	"サーバの初期化を完了しました");
		WriteSystemLog(CLASS_NAME, SERVER_STATUS_NORMAL,		"サーバは実行中です");
		SetServerStatusInt("ServerRunning", 1);
	}
	catch(CServerStartErrorException err)
	{
		//	エラーをセット
		WriteSystemLog(err.m_caller, SERVER_STATUS_FATAL_ERROR, err.m_errorInfo);

		//	停止
		StopServer();
	}
}

/*!
	サーバの停止
*/
void CServer::StopServer()
{
	//	実行中？
	if(!m_serverRunning)
		return;
	m_serverRunning = FALSE;

	//	状態更新
	WriteSystemLog(CLASS_NAME, SERVER_STATUS_NORMAL_LOG, "サーバの停止処理を開始します");

	/*
		通信機能停止
	*/
	//	通信停止
	m_listenerManager.ShutdownListen();

	//	接続マネージャ停止
	m_connectionManager.Stop();

	//	リスナ停止
	m_listenerManager.Stop();


	/*
		管理機能停止
	*/
	//	レスポンスマネージャ停止
	m_responseManager.Stop();

	//	フィルタマネージャ停止
	m_filterManager.Stop();

	//	MimeTypeマネージャ停止
	m_mineTypeManager.Stop();

	//	サーバテキストマネージャ停止
	m_serverTextManager.Stop();

	//	パスマネージャ停止
	m_pathManager.Stop();

	//	アクセスログマネージャ停止
	m_logManager.Stop();

	//	設定マネージャ停止
	m_settingManager.Stop();

	//	ステータスマネージャ停止
	m_statusManager.Stop();

	//	状態更新
	WriteSystemLog(CLASS_NAME, SERVER_STATUS_NORMAL_LOG, "サーバの実行を停止しました");
	SetServerStatusInt("ServerRunning", 0);
}

