#pragma once
#include "iclientconnection.h"
#include "openssl\ssl.h"
#include "SSLProtocolSocket.h"


/*!
	SSLリスナ　クライアントインタフェース

	HTTPSの通信クラス
	throw CConnectionErrorException
	throw CServerResponse
*/
class CSSLClientConnection :
	public IClientConnection
{
public:
	//!	コンストラクタ
	CSSLClientConnection(SOCKET sock, SSL_CTX *sslContext, int timeout);

	//!	デストラクタ
	virtual ~CSSLClientConnection(void);

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	IClientConnection
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void AttacheToThread(IServerToolPtr serverTool, IConnectionThreadStatusPtr threadStatus);

	//!	初期化
	virtual void Close();


	//!	クライアント情報の取得
	virtual void GetClientInfo(CContextClientInfo info);

	//!	次の接続を待つ
	virtual int WaitNextConnection(int waitTime);

	//!	接続中か取得する(内部でIConnectionThreadStatusPtr::IsConnectingの使用厳禁)
	virtual int IsConnecting();


	//!	ヘッダを受信(throw)
	virtual void RecvRequestHeader(CString &requestHeader);

	//!	ボディを受信(throw)
	virtual int RecvRequestBody(CBinaryData &body, int blockSize);

	//!	受信処理完了
	virtual void EndRecvRequest() {};


	//!	ヘッダを送信(throw)
	virtual void SendResponseHeader(CString &responseHeader);

	//!	ボディを送信(throw)
	virtual void SendResponseBody(CBinaryData &body);

	//!	送信処理完了
	virtual void EndSendResponse() {};
	

	/////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////
	//!	ソケット
	CSSLProtocolSocket			m_socket;
	
	//!	最初のアクセス？
	int							m_sslAccepted;

	//!	SSLコンテキスト
	SSL_CTX						*m_sslContext;

	//!	親スレッドの状態
	IConnectionThreadStatusPtr	m_threadStatus;
};
