/*!
	CNormalListener

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

#pragma once
#include "threadskeleton.h"
#include "ListenSocket.h"
#include "Workspace.h"
#include "AcceptedSocketQueue.h"


class CListener :
	private CThreadSkeleton
{
public:
	CListener(void);
	virtual ~CListener(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	操作
	/////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	void InitListener(CAcceptedSocketQueue *queue, int socketType, int errorRetryTime);

	//!	開始
	void StartListener();

	//!	停止
	void StopListener();

	//!	設定からポート追加
	void AddPortsFromSetting(CString strPorts);

	//!	ポートの追加
	void AddPort(int port);

	//!	ポート数取得
	int GetPortCount() { return m_listeners.GetSize(); };

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

	//!	クリーンアップ
	void CloseAllPorts();

	//!	受付ループ
	int AcceptLoop();

	//!	ポートを開く
	int OpenPorts();

	//!	ポートを閉じる
	void ClosePorts();

	//!	接続を受け付け
	int AcceptConnections();

	//!	接続が来るのを待つ
	void WaitNextRequest();

	//!	新規接続
	void OnNewConnection(SOCKET socket);

	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	キュー
	CAcceptedSocketQueue							*m_queue;

	//!	ソケットタイプ
	int											m_socketType;

	//!	リスナ配列
	CTypedPtrArray<CPtrArray, CListenSocket*>	m_listeners;

	//!	エラーリトライ時間
	int											m_errorRetryTime;
};
