/*!
	CConnectionManager

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

#pragma once
#include "threadskeleton.h"
#include "ServerToolWrap.h"
#include "NewConnectionQueue.h"
#include "ConnectionThread.h"
#include "Workspace.h"
#include "Settings.h"
#include "OverloadManager.h"
#include "CnotextManager.h"


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

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

	//!	停止
	void Stop();

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

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

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

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

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

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

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

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

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

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

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

	//!	設定
	CConnectionManagerSetting	m_setting;

	//!	最大接続数
	int							m_maxThreads;

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

	//!	スレッド
	CList<CConnectionThreadPtr>	m_threads;

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

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

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

	//!	キュー
	CNewConnectionQueue			m_queue;

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