#pragma once
#include "IServerTool.h"
#include "IConnectionThreadStatus.h"
#include "InterfaceAutoPtr.h"



/*!
	クライアント通信インタフェース

	throw CConnectionErrorException
*/
class IClientConnection
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化・終了
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void AttacheToThread(IServerToolPtr serverTool, IConnectionThreadStatusPtr threadStatus) = 0;

	//!	停止
	virtual void Close() = 0;

	//!	削除
	virtual void Delete() = 0;

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	ステータス
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	クライアント情報の取得
	virtual void GetClientInfo(IWorkspaceAccessPtr clientInfo) = 0;

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

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

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	送受信
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	1:ヘッダを受信(throw)
	virtual void RecvRequestHeader(IStringPtr requestHeader) = 0;

	//!	2:ボディを受信(throw)
	virtual int RecvRequestBody(IBinaryDataPtr body, int leftSize) = 0;

	//!	3:受信処理完了
	virtual void EndRecvRequest() = 0;


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

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

	//!	6:送信処理完了
	virtual void EndSendResponse() = 0;
};

//!	ポインタ型
typedef IClientConnection* IClientConnectionPtr;

//!	自動ポインタ型
typedef CInterfaceAutoPtr<IClientConnection> IClientConnectionAutoPtr;

//!	自動ポインタ型(一時利用)
typedef CInterfaceAutoPtrTempCopy<IClientConnection> IClientConnectionTempPtr;
