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

/*!
	新規接続
*/
class CAcceptedSocket
{
public:
	CAcceptedSocket()
	{
		m_rawSocket = NULL;
		m_rawSocketType = 0;
	}

	//!	設定して初期化
	CAcceptedSocket(SOCKET socket, int socketType)
	{
		m_rawSocket = socket;
		m_rawSocketType = socketType;
	}

	//!	接続を殺す
	void Abort()
	{
		if(m_rawSocket != NULL)
		{
			closesocket(m_rawSocket);
			m_rawSocket = NULL;
		}
	}

	//!	設定
	void SetSocket(SOCKET socket, int socketType)
	{
		m_rawSocket = socket;
		m_rawSocketType = socketType;
	}

	//!	取得(ソケット)
	SOCKET GetSocket()
	{
		return m_rawSocket;
	}

	//!	取得(タイプ)
	SOCKET GetSocketType()
	{
		return m_rawSocketType;
	}

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	ソケット
	SOCKET	m_rawSocket;

	//!	ソケットタイプ
	int		m_rawSocketType;
};



/*!
	接続取得IF
*/
class IAcceptedSockeQueueAccess
{
public:
	//!	取得
	virtual CAcceptedSocket GetNewConnection() = 0;

	//!	セマフォ取得
	virtual HANDLE GetSemaphore() = 0;

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


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

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

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

	//!	追加
	int AddNewConnection(CAcceptedSocket newConnection);

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

	//!	有効無効
	void EnableQueue(int enable);

	//!	IClientConnectionQueuePtrを取得
	IAcceptedSockeQueueAccess *GetIAcceptedSockeQueueAccesse() { return this; };

protected:
	///////////////////////////////////////////////////////////////////
	//	IAcceptedSockeQueueAccess用インタフェース
	///////////////////////////////////////////////////////////////////
	//!	取得
	virtual CAcceptedSocket GetNewConnection();

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

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

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

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

	//!	セマフォ
	CSyncSemaphore			m_semaphore;

	//!	最大保持数
	int						m_maxQueue;

	//!	有効無効
	int						m_enable;
};
