/*!
	CSSLListener

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

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


/*!
	SSLリスナ
*/

class CSSLListener :
	public IListener, protected CListenerBase
{
public:
	CSSLListener(void);
	virtual ~CSSLListener(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;

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

	//!	設定
	CSSLListenerSetting			m_setting;

	//!	キュー
	IClientConnectionQueuePtr	m_queue;

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

	//!	SSLコンテキスト
	CSSLContext					m_sslContext;
};
