#pragma once
#include "IClientConnection.h"
#include "SyncObject.h"

/*!
	新規接続キュー
*/
class CNewConnectionQueue : public IClientConnectionQueue
{
public:
	CNewConnectionQueue(void);
	virtual ~CNewConnectionQueue(void);

	///////////////////////////////////////////////////////////////////
	//	インターフェース
	///////////////////////////////////////////////////////////////////
	//!	開始処理
	void Start() {};

	//!	終了処理
	void Stop();

	///////////////////////////////////////////////////////////////////
	//	IClientConnectionQueue
	///////////////////////////////////////////////////////////////////
	//!	追加
	virtual int AddNewConnection(IClientConnectionPtr newConnection);

	//!	IClientConnectionQueuePtrを取得
	virtual IClientConnectionQueuePtr GetIClientConnectionQueue() { return IClientConnectionQueueRet(this, FALSE); };

	///////////////////////////////////////////////////////////////////
	//	CConnectionManager用インタフェース
	///////////////////////////////////////////////////////////////////
	//!	取得
	IClientConnectionPtr GetNewConnection();

	//!	セマフォ取得
	HANDLE GetSemaphore() { return m_semaphore; };

	//!	最大数設定
	void SetMaxQueue(int max);

	//!	現在の保持数を取得
	int GetCurrentQueueCount();

protected:
	///////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////
	//!	ロック
	CCriticalSection			m_scopeLock;

	//!	キュー本体
	CList<IClientConnectionPtr>	m_queue; 

	//!	セマフォ
	CSyncSemaphore				m_semaphore;

	//!	最大保持数
	int							m_maxQueue;
};
