/*!	
	@file
	@brief	ストレージ管理クラスのコア部分
*/

#ifndef CStorageCore_h
#define CStorageCore_h

#include"../../Setup/CompileMode.h"
#include"../../Auxiliary/Thread/CThreadMutex.h"
#include"../../Auxiliary/Thread/CThreadController.h"
#include"../../template/GlobalPointer.h"
#include"../CStorageFunction.h"

#include<map>

namespace Maid
{
	class CStorageCore : public GlobalPointer<CStorageCore>
	{
	public:
		CStorageCore();
		virtual ~CStorageCore();

		void Initialize();
		void Finalize();

		void RegistFunction( int FuncNo, const STORAGEFUNCTION& func );

		int Execute( int FuncNo, const mstring& FileName, const SPSTORAGEFUNCTION_FUNCTIONPARAM& pParam );
		void Cancel( int no );

		bool IsNowLoading( int no );
		SPSTORAGEFUNCTION_RETURNPARAM GetReturnParam(int no);


	private:
		struct POSTMESSAGE
		{
			enum
			{
				CANCEL = -1,	//	FunctionNo==CANCEL でキャンセルメッセージ
			};

			int	ReturnCodeID;	//	ストレージスレッドが返信する先
			int FunctionNo;		//	パラメーターを処理する関数ＮＯ
			mstring	FileName;	//	投げられたファイル名
			SPSTORAGEFUNCTION_FUNCTIONPARAM pParam;
		};
		typedef	MySTL::vector<POSTMESSAGE>		POSTMESSAGEQUE;

		struct RETURNCODE
		{
			enum STATE
			{
				STATE_NONE,		//	この領域は余ってる
				STATE_LOADING,	//	読み込み中
				STATE_LOADEND,	//	読み込みが終わった
			};

			STATE							State;	//	投げたメッセージの状態
			SPSTORAGEFUNCTION_RETURNPARAM	pMess;	//	終了コード
		};

		typedef MySTL::map<int,STORAGEFUNCTION> FUNCTIONMAP;



		POSTMESSAGEQUE		m_MessageQue;
		CThreadMutex		m_MessageMutex;		//!<	m_MessageQue の更新時の同期オブジェクト

		FUNCTIONMAP			m_FunctionMap;		//!<	処理関数が入っているデータ
		CThreadMutex		m_FunctionMutex;	//!<	m_FunctionMap の更新時の同期オブジェクト

		MySTL::vector<RETURNCODE>	m_ReturnCode;	//	処理した関数の戻り値が入っている配列
													//	RETURNCODE::State で同期が取れるので
													//	CThreadMutexはいらない

		CThreadController	m_Thread;
	private:
		//	別スレッドから呼ばれる関数
		unt ThreadFunction( volatile CThreadController::BRIGEDATA& brige );
		int CreateReturnCode();
	};
}

#endif