#include "StdAfx.h"
#include "CnotextManager.h"
#include "DateTools.h"

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

	m_maxConetextLog = 0;
	m_contextID = 0;
}

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


///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
//!	初期化
void CCnotextManager::Start(CIServerToolWrap 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::DuplicateContext(CWorkspace &copyTo, CUTF8String copyRootPath)
{
	WORKSPACE_LOCK(m_context);

	//	コピー
	copyTo.Duplicate(m_contextRoot, _U8(""), copyRootPath);
}


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

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

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

	return(context);
}

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

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

	//	ログ移動
	if(m_maxConetextLog > 0)
	{
		//	ログコピー
		m_contextLog.GetAccess(name).Copy(context);

		//	一時的にロック
		WORKSPACE_LOCK(m_context);

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

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

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

	//	時刻
	CTime_t	time=CTime_t::GetCurrentTime();
	date.SetDate(time.Format(_U8("%Y/%m/%d")));
	date.SetTime(time.Format(_U8("%H:%M:%S")));
	date.SetGMT(CDateTools::GetGMTString(time));
	date.SetTIME_T(time.GetTime_t());
}

