/*!
 *	\file
 *	\brief	インストールを行うクラス
 *
 */


#ifndef Install_h
#define Install_h

#include"../../Maid/Auxiliary/Thread/CThreadController.h"
#include"../../Maid/Auxiliary/Thread/CThreadMutex.h"
#include"CSetupConfig.h"
#include<boost/function.hpp>
#include<string>


class Install
{
public:


	struct INSTALLDATA
	{
		const CSetupConfig*	pConfig;
		int					InstallTypeNo;		//	インストールモード
		HWND				hWnd;				//	ウィンドウハンドル（エラーが起きたときなどに使用）
		bool				IsMD5Check;			//	インストール後MD5チェックするか？
	};

	void BeginInstall( const INSTALLDATA& InstallData );

	struct STATUS
	{
		enum THREADSTATUS
		{
			THREADSTATUS_EXECUTING,	//!<	実行中
			THREADSTATUS_ERROR,		//!<	エラーが起きた
			THREADSTATUS_SUCCESS,		//!<	成功して終わった
			THREADSTATUS_CANCEL,		//!<	キャンセル命令がでて終了した
		};

		THREADSTATUS	Status;

		Maid::mstring ProgressText;
		float NowProgress;
		float TotalProgress;
	};

	STATUS GetStatus();
	void   OnCancel();

private:
	unt32		InstallThread( volatile Maid::CThreadController::BRIGEDATA& Brige );

private:
	void InstallCancel();
	void InstallError( const Maid::mstring& comment );

	enum FUNCTIONRESULT
	{
		FUNCTIONRESULT_OK,
		FUNCTIONRESULT_CANCEL,
		FUNCTIONRESULT_ERROR,
	};

	FUNCTIONRESULT	FileCopy( const Maid::mstring& DstFileName,  const Maid::mstring& SrcFileName, volatile Maid::CThreadController::BRIGEDATA& Brige );
	FUNCTIONRESULT	CheckMD5( const Maid::mstring& DstFileName, const Maid::mstring& MD5Str, volatile Maid::CThreadController::BRIGEDATA& Brige );

	void	SetProgressText( const Maid::mstring& );
	void	SetNowProgress( float );
	void	SetTotalProgress( float );

private:
	INSTALLDATA	m_InstallData;

private:
	Maid::CThreadMutex	m_Section;
	Maid::CThreadController	m_Thread;

	STATUS	m_NowState;


	struct ExecutingInfo	//	インストール実行中に参照される情報
	{
		float	TotalFileSize;	//	インストールする合計容量//	4Gを超えることもあるのでfloat型にしておく
		float	AccessFileSize;	//	いままでに書き込んだ(読み込んだ)サイズ

		MySTL::vector<Maid::mstring> CreateDirectoryList;
	};

	ExecutingInfo	m_ExecutingInfo;
};

#endif

