#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;

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

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

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

		//	インタフェースマネージャ初期化
		m_interfaceManager.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();



	/*
		管理機能停止
	*/
	//	インタフェースマネージャ停止
	m_interfaceManager.Stop();

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

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

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

