#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_interfaceManager.Start(GetIServerTool());

		//	設定マネージャ初期化
		m_settingManager.Start(GetIServerTool());

		//	情報マネージャ初期化
		m_serverInfoManager.Start(GetIServerTool());

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


		/*
			補助機能初期化
		*/
		//	アクセスログマネージャ起動
		m_logManager.Start(GetIServerTool());

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

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

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

		//	CGIマネージャ初期化
		m_cgiManager.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();


	/*
		補助機能停止
	*/
	//	CGIマネージャ停止
	m_cgiManager.Stop();

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

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

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

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


	/*
		管理機能停止
	*/
	//	情報マネージャ停止
	m_serverInfoManager.Stop();

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

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

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

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

/////////////////////////////////////////////////////////////////////////////////////////////////
//	IServerTool
/////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	ワークスペースへのアクセスを取得
*/
int CServer::GetServerWorkspaceAccess(IWorkspaceAccessRefPtr accessRef, LPCSTR type, LPCSTR section)
{
	CString	csType(type);

	//	空っぽに
	accessRef->SetWorkspaceAccess(NULL, "");

	//	タイプ別
	if(csType == MANAGER_SETTING)
	{
		m_settingManager.GetManagerSetting(section).FillIWorkspaceAccessRef(accessRef);
		return(0);
	}
	else if(csType == FILTER_SETTING)
	{
		m_settingManager.GetFilterSetting(section).FillIWorkspaceAccessRef(accessRef);
		return(0);
	}
	else if(csType == RESPONSE_SETTING)
	{
		m_settingManager.GetFilterSetting(section).FillIWorkspaceAccessRef(accessRef);
		return(0);
	}
	else if(csType == SERVER_STATUS)
	{
		m_statusManager.GetStatus().FillIWorkspaceAccessRef(accessRef);
		return(0);
	}
	else
		return(-1);
}


/*!
	サーバステータスの変更
*/
void CServer::WriteSystemLog(LPCSTR callerName, int statusCode, LPCSTR statusInfo, int autoOffTime)
{
	m_statusManager.WriteSystemLog(callerName, statusCode, statusInfo, autoOffTime);
}

/*!
	サーバステータスの変更
*/
void CServer::SetServerStatusInt(LPCSTR statusName, int status, LPCSTR statusInfo)
{
	m_statusManager.SetServerStatusInt(statusName, status, statusInfo);
}

/*!
	サーバステータスの変更
*/
void CServer::SetServerStatusStr(LPCSTR statusName, LPCSTR status, LPCSTR statusInfo)
{
	m_statusManager.SetServerStatusStr(statusName, status, statusInfo);
}


/*!
	インタフェース登録
*/
int CServer::RegisterManagerInterface(LPCSTR interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface)
{
	return(m_interfaceManager.RegisterInterface(interfaceName, ifRegister, oldInterface));
}

/*!
	インターフェース登録解除
*/
int CServer::UnRegisterManagerInterface(LPCSTR interfaceName, IManagerInterfacePtr ifUnRegister, IManagerInterfacePtr oldInterface)
{
	return(m_interfaceManager.UnRegisterInterface(interfaceName, ifUnRegister, oldInterface));
}

/*!
	インタフェース取得
*/
void *CServer::GetManagerInterface(LPCSTR interfaceName, int ifVersion)
{
	return(m_interfaceManager.GetInterface(interfaceName, ifVersion));
}
