/*!
	CNormalListenerConnection

	IPv4用の接続管理クラス
*/

#pragma once
#include "IClientConnection.h"
#include "ProtocolSocket.h"

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

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

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

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

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

	//!	削除
	virtual void Delete() { delete this; };


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

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

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


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

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

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


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

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

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

	/////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////
	//!	ソケット
	CProtocolSocket				m_socket;
	
	//!	親スレッドの状態
	IConnectionThreadStatusPtr	m_threadStatus;
};
