/*!
	CConnectionThreadManager

	接続スレッド管理クラス
	スレッドの生成を行う
*/

#pragma once
#include "ThreadSkeleton.h"
#include "IServerToolWrap.h"
#include "IClientConnection.h"
#include "ClientConnectionQueue.h"
#include "Settings.h"
#include "OverloadManager.h"
#include "CnotextManager.h"

#include "ConnectionThread.h"


/*!
	接続マネージャ
*/
class CConnectionThreadManager :
	public CThreadSkeleton, protected IConnectionThreadParent
{
public:
	CConnectionThreadManager(void);
	virtual ~CConnectionThreadManager(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	操作
	/////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(CIServerToolWrap serverTool);

	//!	停止
	void Stop();

	//!	オーバーロードインタフェースを取得
	IOverloadManagerPtr GetIOverloadManager() { return m_overload.GetIOverloadManager(); };

	//!	接続キューインタフェースを取得
	IClientConnectionQueuePtr GetIClientConnectionQueue() { return m_queue.GetIClientConnectionQueue(); };

	//!	IConetextManager取得
	IConetextManagerPtr GetIConetextManager() { return m_context.GetIConetextManager(); };

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	スレッド関数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	スレッド
	void ThreadMain();

	//!	新しい接続を追加
	void CreateNewThread(IClientConnectionAutoPtr connection);

	//!	接続を片付ける
	void DeleteEndThreads();

	//!	最大接続数に到達？
	int InMaxThreads();

	//!	接続数種特
	int GetThreadCount();

	/////////////////////////////////////////////////////////////////////////////////////
	//	IConnectionThreadParent
	/////////////////////////////////////////////////////////////////////////////////////
	//!	スレッド終了
	virtual void EndConnection(CConnectionThread *connectionPtr);

	//!	オーバーロード
	virtual int InOverloadMode();

	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	初期化フラグ
	CInterlockCounter				m_init;

	//!	設定
	CConnectionThreadManagerSetting	m_setting;

	//!	最大接続数
	int								m_maxThreads;

	//!	サーバツール
	CIServerToolWrap				m_serverTool;

	//!	スレッド
	CSimpleArrayTemplate<CConnectionThreadAutoPtr>		m_threads;

	//!	終了スレッド数
	int								m_endThreadCount;

	//!	接続IDカウンタ
	int								m_connectionID;

	/////////////////////////////////////////////////////////////////////////////////////
	//	サブクラス
	/////////////////////////////////////////////////////////////////////////////////////
	//!	オーバーロード
	COverloadManager				m_overload;

	//!	キュー
	CClientConnectionQueue			m_queue;

	//!	コンテキストマネージャ
	CCnotextManager					m_context;
};
