#include "StdAfx.h"
#include "ServerStatusManager.h"
#include "Dir.h"
#include "TextTools.h"
#include "DateUtility.h"

#define	CLASS_NAME			"StatusManager"


CServerStatusManager::CServerStatusManager(void)
{
	m_serverStatus = m_statusRoot.GetAccess("Status");
}

CServerStatusManager::~CServerStatusManager(void)
{
}


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

	//	基本情報の設定
	m_serverStatus.SetServerVersion(SERVER_VERSION);
	m_serverStatus.SetServerVersionString(SERVER_VERSION_STRING);
	m_serverStatus.SetServerRoot(CPathTools::GetAppPath());

	//	システムログ
	m_systemLog.Start(serverTool->GetIServerTool());
}

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

	//	停止
	m_systemLog.Stop();

	m_init = FALSE;
}

/*!
	サーバステータスの変更
*/
void CServerStatusManager::WriteSystemLog(CString callerName, int statusCode, CString statusInfo, int autoOffTime)
{
	//	ワークスペースをロック
	WORKSPACE_LOCK(m_serverStatus);

	//	安全のため
	statusInfo.Replace("\r", "_");
	statusInfo.Replace("\n", "_");

	//	最新アイテム取得
	CServerStatusLog log = m_serverStatus.GetStatusLog(callerName).GetNewItem();
	log.SetStatusCode(statusCode);
	log.SetStatusInfo(statusInfo);
	log.SetTime(CDateUtility::GetTimeString(CTime::GetCurrentTime()));
	log.SetAutoOffTime(autoOffTime);

	TRACE("<%s> %s\n", callerName, statusInfo);

	//	必要ならログへ
	if(statusCode <= SERVER_STATUS_NORMAL_LOG)
		m_systemLog.WriteSystemLog(callerName, statusInfo);
};



