#pragma once
#include "IServerTool.h"
#include "IClientConnection.h"
#include "BinaryData.h"

class IConnectionControl;

//!	インターフェース定義
DEFINE_INTERNAL_INTERFACE_NOWRAP(IConnectionControl);

enum BUFFRING_MODE
{
	/*!
		レスポンスボディのサイズが確定している場合
		・レスポンスデータのサイズが自動的にチェックされる
		・KeepAlive可能
	*/
	BUFFRING_MODE_NONE		= 0,

	/*!
		レスポンスボディのサイズが確定していない場合
		・特定のサイズまで、バッファリングされる
		・サイズが越えた場合は、ストリーミングモードへ移行する
		・KeepAlive可能
	*/
	BUFFRING_MODE_BUFFURING	= 10,

	/*!
		レスポンスボディのサイズが確定していない場合
		・バッファリングされず、Content-Lengthも設定されない
		・KeepAlive不可
	*/
	BUFFRING_MODE_STREAMING	= 20,
};

/*!
	通信制御用
*/
class IConnectionControl
{
public:
	virtual ~IConnectionControl() {};

	//////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////
	//!	インタフェース取得
	virtual IConnectionControlIIPtr GetIConnectionControl() = 0;

	//////////////////////////////////////////////////////////////////////////////
	//	通信制御
	//////////////////////////////////////////////////////////////////////////////
	//!	接続中か取得する
	virtual int IsConnecting() = 0;

	//!	通信ブロックサイズを取得
	virtual int GetBlockSize() = 0;

	//!	帯域幅制御を有効にする
	virtual void EnableBandWidthLimit(int sendLimit = -1, int recvLimit = -1) = 0;

	//!	送信済みサイズを取得する
	virtual __int64 GetSendedSize() = 0;

	//!	受信済みサイズを取得する
	virtual __int64 GetReceivedSize() = 0;

	//////////////////////////////////////////////////////////////////////////////
	//	バッファリング制御
	//////////////////////////////////////////////////////////////////////////////
	//!	バッファリングモードへ移行する
	virtual int ChangeBufferingMode(int mode) = 0;

	//!	現在のモードを取得する
	virtual int GetCurrentMode() = 0;

	//!	最大バッファリングサイズ取得
	virtual int GetMaxBufferingSize() = 0;

	//////////////////////////////////////////////////////////////////////////////
	//	KeepAlive制御
	//////////////////////////////////////////////////////////////////////////////
	//!	KeepAliveを無効に
	virtual void DisableReuseConnection() = 0;

	//!	KeepAlive状態をセット(DisableReuseConnectionが優先される)
	virtual void SetReuseConnection(int reuse) = 0;

	//!	KeepAliveは現在有効か？
	virtual int CanReuseConnection() = 0;

	//!	最大KeepAlive時間を指定
	virtual void SetWaitNextRequestTime(int time) = 0;

	//!	最大KeepAlive時間を取得
	virtual int GetWaitNextRequestTime() = 0;
};

