/*!
	CNormalListener

	IPv4用の接続受付クラス
*/

#pragma once
#include "threadskeleton.h"
#include "ListenSocket.h"
#include "IListener.h"
#include "NormalListenerConnection.h"
#include "Settings.h"
#include "ListenerBase.h"


/*!
	ノーマルリスナ
*/
class CNormalListener:
	public IListener, protected CListenerBase
{
public:
	CNormalListener(void);
	virtual ~CNormalListener(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	操作
	/////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	virtual void Start(IServerToolPtr serverTool, IClientConnectionQueuePtr queue);

	//!	停止
	virtual void Stop();

	//!	停止準備
	virtual void ShutdownListen();

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	オーバーロード
	/////////////////////////////////////////////////////////////////////////////////////
	//!	クラス名取得
	virtual LPCTSTR GetListenerClassName();

	//!	接続追加
	virtual void OnNewConnection(SOCKET newSock);

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

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

	//!	設定
	CNormalListenerSetting		m_setting;

	//!	キュー
	IClientConnectionQueuePtr	m_queue;

	//!	タイムアウト時間
	int							m_timeoutTime;
};
