#include "StdAfx.h"
#include "ListenerManager.h"

CListenerManager::CListenerManager(void)
{
}

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

/////////////////////////////////////////////////////////////////////////////////////
//	操作
/////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CListenerManager::Start(CWorkspaceAccess setting)
{
	ASSERT(!m_init);

	//	初期化
	m_init = TRUE;

	//	サーバ設定
	CWorkspaceAccess basic = setting.GetAccess("Basic");
	CWorkspaceAccess enhance = setting.GetAccess("Enhance");

	//	設定取得
	int MaxQueue = basic.GetKeyInt("MaxConnect", 100) * 2;	//	スレッド数*2
	int ListenRetryTime = enhance.GetKeyInt("ListenRetryTime", 30) * 1000;

	//	過負荷設定取得
	m_overloadThreshold = enhance.GetKeyInt("OverloadThresholdQueuedConnection", 50) * MaxQueue / 100;
	if(m_overloadThreshold < 0)
		m_overloadThreshold = 0;
	if(m_overloadThreshold > MaxQueue)
		m_overloadThreshold = MaxQueue;

	//	キューサイズ設定
	m_acceptedQueue.SetMaxQueue(MaxQueue);

	//	HTTPリスナ初期化
	m_httpListener.InitListener(&m_acceptedQueue, SOCKET_TYPE_HTTP, ListenRetryTime);

	//	HTTPポート追加
	m_httpListener.AddPortsFromSetting(setting.GetKeyStr(_T("Basic::Port"), _T("80")));

	//	HTTP実行
	m_httpListener.StartListener();

	//	HTTPSは有効？
	if(basic.GetKeyInt(_T("EnableSSL"), 0))
	{
		//	HTTPリスナ初期化
		m_httpsListener.InitListener(&m_acceptedQueue, SOCKET_TYPE_HTTPS, ListenRetryTime);

		//	HTTPポート追加
		m_httpsListener.AddPortsFromSetting(setting.GetKeyStr(_T("SSL::Port"), _T("443")));

		//	HTTP実行
		m_httpsListener.StartListener();
	}
}

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

	//	HTTPリスナ停止
	m_httpListener.StopListener();

	//	HTTPSリスナ停止
	m_httpsListener.StopListener();
}

/*!
	停止準備
*/
void CListenerManager::ShutdownListen()
{
	if(!m_init)
		return;

	//	HTTPリスナ停止
	m_httpListener.StopListener();

	//	HTTPSリスナ停止
	m_httpsListener.StopListener();
}

/*!
	オーバーロード状態を取得
*/
int CListenerManager::QueueIsOverload()
{
	if(m_acceptedQueue.GetIAcceptedSockeQueueAccesse()->GetCurrentQueueCount() >= m_overloadThreshold)
		return(TRUE);
	return(FALSE);
}
