#pragma once
#include "IServerTool.h"
#include "Context.h"
#include "BinaryData.h"
#include "ServerException.h"
#include "IConnectionThreadStatus.h"



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

	throw CConnectionErrorException
*/
class IClientConnection
{
public:
	//!	デストラクタ
	virtual ~IClientConnection(void) {}

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化・終了
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	virtual void AttacheToThread(IServerToolIIPtr serverTool, IConnectionThreadStatusIIPtr threadStatus) = 0;

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

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

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

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

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

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

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


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

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

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

//!	インターフェース定義
DEFINE_INTERNAL_INTERFACE(IClientConnection);


//!	インターフェース定義
class IClientConnectionQueue;
DEFINE_INTERNAL_INTERFACE(IClientConnectionQueue);

/*!
	通信インタフェースキュー
*/
class IClientConnectionQueue
{
public:
	//!	デストラクタ
	virtual ~IClientConnectionQueue(void) {}

	//!	追加
	virtual int AddNewConnection(IClientConnectionIIPtr newConnection) = 0;

	//!	IClientConnectionQueueIIPtrを取得
	virtual IClientConnectionQueueIIPtr GetIClientConnectionQueue() = 0;
};

