#pragma once
#include "IServerTool.h"
#include "Context.h"
#include "ResponseBase.h"

/*!
	ファイルレスポンス

	最も基本的なレスポンス
*/
class CFileResponse :
	public CResponseBase
{
public:
	CFileResponse(void);
	virtual ~CFileResponse(void);

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	初期化
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化(例外発生厳禁！)
	virtual void _ResponseStart(CIConnectionToolWrap responseContext);

	//!	停止(例外発生厳禁！)
	virtual void _ResponseStop(CIConnectionToolWrap responseContext);

	//!	レスポンス名取得
	virtual LPCTSTR GetResponseName();

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

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス生成
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	レスポンス生成
	virtual void _ResponseBuildResponse(CIConnectionToolWrap responseContext);

	//!	レスポンスヘッダ取得
	virtual void _ResponseGetResponse(CIConnectionToolWrap responseContext);

	//!	レスポンスボディ取得
	virtual int _ResponseGetResponseBody(CIConnectionToolWrap responseContext, CBinaryData &body, int blockSize);

protected:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	ツール関数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	ファイルを開く
	void OpenFile(CString target);

	//!	レジューム
	void CheckRange(CContext context);

	//!	更新確認
	int CheckUpdate(CContext context, CString target);

	//!	ETag取得
	CString	GetETag(CString target);

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	ファイルハンドル
	HANDLE	m_file;

	//!	データ送信済み
	int		m_bodyIsSended;

	//!	ファイルサイズ
	__int64	m_fileSize;

	//!	開始ポイント
	__int64	m_startAt;

	//!	最終更新日
	CTime	m_lastUpdate;
};



/*!
	ファイル レスポンスファクトリ
*/
class  CFileResponseFactory :
	public CResponseFactoryBase
{
public:
	//////////////////////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////////////////////
	//!	自分のアイテムか？
	virtual int _ResponseFactoryIsYourRequest(CContext context) { return TRUE; };	//	常にTRUE

	//!	レスポンス取得
	virtual IResponsePtr _ResponseFactoryGetResponse() { return new CFileResponse; };

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