#include "StdAfx.h"
#include "CnotextManager.h"
#include "DateUtility.h"

CCnotextManager::CCnotextManager(void)
{
	m_context = m_contextRoot.GetAccess("Context::Context");
	m_contextLog = m_contextRoot.GetAccess("Context::ContextLog");

	m_maxConetextLog = 0;
	m_contextID = 0;
}

CCnotextManager::~CCnotextManager(void)
{
	Stop();
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
//!	初期化
void CCnotextManager::Start(IServerToolIIPtr serverTool)
{
	//	初期化済み？
	if(m_init)
		return;
	m_init = TRUE;

	//	設定取得
	m_setting = serverTool->GetManagerSetting(m_setting.GetSettingName());

	//	最大ログ数取得
	m_maxConetextLog = m_setting.GetMaxContextLogCount();
}

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


///////////////////////////////////////////////////////////////////////////////////////////////////
//	IConetextManager
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	コンテキストのコピー
*/
void CCnotextManager::CopyContext(CWorkspaceAccess context)
{
	WORKSPACE_LOCK(m_context);

	//	コピー
	context.Copy(m_contextRoot.GetAccess("Context"));
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	IConetextGene
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	コンテキストの取得
*/
CContext CCnotextManager::GetNewContext(LONG connectionID)
{
	//	名前生成
	CString	contextName;
	contextName.Format("Request_%08x", m_contextID);
	m_contextID.IncCounter();

	//	コンテキスト生成
	CContext	context = m_context.GetAccess(contextName);

	//	初期設定
	context.SetName(contextName);			//	名前
	GetDate(context.GetStartTime());		//	日時
	context.SetStatus("初期化中です...");	//	状態
	context.SetConnectionID(connectionID);	//	接続ID

	return(context);
}

/*!
	コンテキストの破棄
*/
void CCnotextManager::ReleaseContext(CContext context)
{
	//	名前取得
	CString name = context.GetName();

	//	終了状態設定
	GetDate(context.GetEndTime());		//	日時

	//	ログ移動
	if(m_maxConetextLog > 0)
	{
		//	一時的にロック
		WORKSPACE_LOCK(m_context);

		//	ログコピー
		m_contextLog.GetAccess(name).Copy(context);

		//	ログ数の調整
		if(m_contextLog.GetSubNodeCount() > m_maxConetextLog)
		{
			CStringArray	nodes;
			m_contextLog.GetAllSubNode(nodes);
			m_contextLog.DeleteNode(nodes[0]);
		}
	}

	//	削除
	m_context.DeleteNode(name);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//	ツール
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
 *	日付取得
 */
void CCnotextManager::GetDate(CContextDate date)
{
	//	クリア
	date.Clear();

	//	時刻
	CTime	time=CTime::GetCurrentTime();
	date.SetDate(time.Format("%Y/%m/%d"));
	date.SetTime(time.Format("%H:%M:%S"));
	date.SetGMT(CDateUtility::GetGMTString(time));
	date.SetTIME_T(time.GetTime());
}
