#pragma once

//! @file Mix/IO/IManager.h
//! @brief ファイルマネージャインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace IO{

	//! @class IManager
	//! @brief IO マネージャインターフェース
	//! @note
	//! 「ファイル」「ディレクトリ」へのアクセスはマウントを通して行われます。<br>
	//! マウントしていないディレクトリ、ファイルへのアクセスはできないようになっています。※<br>
	class IManager : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IManager( void ){}

	public:
		//! @brief ルートディレクトリのパスを取得します
		//! @return ルートディレクトリのパスを返します
		virtual const wchar_t* GetRootDirectoryPath( void ) const = 0;
		//! @brief ユーザーディレクトリのパスを取得します
		//! @return ユーザーディレクトリのパスを返します
		virtual const wchar_t* GetUserDirectoryPath( void ) const = 0;

		//! @brief 指定したアーカイブ内のファイルを使用できるようにします
		//! @param[in] pFilePath アーカイブのファイルパス
		//! @return 成功した場合は True を返します
		virtual Boolean MountArchive( const wchar_t* pFilePath ) = 0;
		//! @brief 指定したディレクトリ内のファイルを使用できるようにします
		//! @param[in] pDirectoryPath ディレクトリパス
		//! @return 成功した場合は True を返します
		virtual Boolean MountDirectory( const wchar_t* pDirectoryPath ) = 0;
		//! @brief 指定したファイルを使用できるようにします
		//! @param[in] pFilePath ファイルパス
		//! @return 成功した場合は True を返します
		virtual Boolean MountFile( const wchar_t* pFilePath ) = 0;

		//! @brief 指定したファイルの有無を確認します
		//! @param[in] pFilePath ファイルパス
		//! @return 存在している場合は True を返します
		//! @note 指定されたファイルがマウントされていない場合はでも False を返します。
		virtual Boolean ExistsFile( const wchar_t* pFilePath ) = 0;

		//! @brief ファイルバッファを作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppBuffer 作成したファイルバッファを渡す Mix::Memory::IBuffer インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateBufferFromFile( const wchar_t* pFilePath, Mix::Memory::IBuffer** ppBuffer ) = 0;

		//! @brief ファイルリーダーを作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppReader 作成したファイルリーダーを渡す Mix::IO::IReader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateFileReader( const wchar_t* pFilePath, Mix::IO::IReader** ppReader ) = 0;
		//! @brief バッファドリーダーを作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppReader 作成したバッファドリーダーを渡す Mix::IO::IReader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note バッファドリーダーはメモリ内のファイルを操作します
		virtual Boolean CreateBufferedReader( const wchar_t* pFilePath, Mix::IO::IReader** ppReader ) = 0;
		//! @brief バッファドリーダーを作成します
		//! @param[in] pFilePath 名前
		//! @param[in] pBuffer 読み取り元のバッファを表す Mix::Memory::IBuffer インターフェースのポインタ
		//! @param[out] ppReader 作成したバッファリーダーを渡す Mix::IO::IReader インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note バッファドリーダーはメモリ内のファイルを操作します
		virtual Boolean CreateBufferedReader( const wchar_t* pFilePath, Mix::Memory::IBuffer* pBuffer, Mix::IO::IReader** ppReader ) = 0;

		//! @brief ファイルライターを作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppWriter 作成したファイルライターを渡す Mix::IO::IWriter インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note ファイルライターの作成と同時に、ファイルをマウント ( MountFile ) します。
		virtual Boolean CreateFileWriter( const wchar_t* pFilePath, Mix::IO::IWriter** ppWriter ) = 0;
	};

}}
