/*---------------------------------------------------------------------------* Project: Horizon File: fs_FileSystemBase.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 26463 $ *---------------------------------------------------------------------------*/ #ifndef NN_FS_CTR_MPCORE_FS_FILESYSTEMBASE_H_ #define NN_FS_CTR_MPCORE_FS_FILESYSTEMBASE_H_ #include #include #include "fs_UserFileSystem.h" namespace nn { namespace fs { namespace detail { class FileSystemBaseImpl : public nn::fs::CTR::MPCore::detail::UserFileSystem { }; }}} namespace nn { namespace fs { /*! @brief rom アーカイブのマウントに必要なメモリサイズを取得します。 ビルド時に生成される ROMFS を参照する rom アーカイブのマウントに必要なメモリサイズを計算して返します。 このサイズは、maxFile で指定される数のファイルと、 maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。 useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュする場合に必要なメモリサイズを返します。 @param[in] maxFile 同時に開くファイルの最大数 @param[in] maxDirectory 同時に開くディレクトリの最大数 @param[in] useCache メタ情報をメモリにキャッシュするなら true、しないなら false @return 計算したメモリサイズを返します。rom アーカイブをマウントすることができない場合、負の値を返します。 */ s32 GetRomRequiredMemorySize(size_t maxFile, size_t maxDirectory, bool useCache = true); /*! @brief rom アーカイブをマウントします。 ビルド時に生成される ROMFS を参照する rom アーカイブをマウントします。 rom アーカイブに対し、maxFile で指定された数のファイルを同時に開くことができ、 maxDirectory で指定された数のディレクトリを同時に開けるようになります。 workingMemory には @ref GetRomRequiredMemorySize 関数で計算された必要メモリ以上の大きさのメモリを渡す必要があります。 useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュします。 これにより、ファイルを開いたり、ディレクトリの走査をするのにかかる時間が短縮されますが、 必要なメモリ量は増加します。 @param[in] archiveName アーカイブ名を指定します(省略するオーバロードでは "rom:" が暗黙的に指定されます) @param[in] maxFile 同時に開くファイルの最大数 @param[in] maxDirectory 同時に開くディレクトリの最大数 @param[in] workingMemory rom アーカイブの動作に使用するメモリ領域の先頭アドレス @param[in] workingMemorySize rom アーカイブの動作に使用するメモリ領域のサイズ @param[in] useCache メタ情報をメモリにキャッシュするなら true、しないなら false @return 処理の結果を返します。 */ Result MountRom(const char* archiveName, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true); Result MountRom(size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true); /*! @brief セーブデータ領域をフォーマットします。 アプリケーション固有の領域であるセーブデータ領域を、フォーマットします。 この関数を呼ぶと、既存のセーブデータがあった場合には消去されます。 フォーマットの際には、 このセーブデータ領域がもつことのできるファイルの最大数と、ディレクトリの最大数を指定することができます。 この数を超えて、ファイルやディレクトリを作成することはできません。 @param[in] maxFiles ファイルの最大数を指定します @param[in] maxDirectories ディレクトリの最大数を指定します @return 処理の結果を返します。 */ Result FormatSaveData(size_t maxFiles, size_t maxDirectories); /*! @brief セーブデータアーカイブをマウントします。 アプリケーション固有の領域であるセーブデータ領域を、指定されたアーカイブ名でマウントします。 セーブデータ領域を使用する前には、セーブデータ領域をフォーマットする必要があります。 この関数を呼んだ際に nn::fs::ResultNotFormatted() が返ってきた際には、 @ref FormatSaveData 関数を呼ぶことで、セーブデータ領域を初期化した後、 もう一度この関数を呼んでマウントしてください。 @param[in] archiveName アーカイブ名を指定します(省略した際は "data:" が指定されます) @return 処理の結果を返します。 */ Result MountSaveData(const char* archiveName = "data:"); /*! @brief セーブデータの変更をコミットします。(※コミット機能は未実装です) 指定のアーカイブ名でマウントされたセーブデータ領域をコミットし、 書き込んだデータを確実なものとします。 この関数を呼ばずにアーカイブをアンマウントしたり、プログラムが停止した場合、 前回のコミットからこれまでのセーブデータへの変更は全て巻き戻されます。 この関数が正常に返ってきた場合、セーブデータへの変更が正しく行われたことが保障されます。 この関数の実行中にプログラムが中断した場合のセーブデータの状態は、 「以前コミットが行われた状態か」もしくは「全ての変更が反映された状態」のどちらかになります。 破損したり、中途半端な状態になることはありません。 ※現在、セーブデータのコミット機能は未実装です。 この関数を呼ばなくてもセーブデータへの変更は反映されます。 また、セーブデータへの書き込み中にプログラムが中断した場合などには、 セーブデータが破損する可能性があります。 ご注意ください。 @param[in] archiveName アーカイブ名を指定します(省略した際は "data:" が指定されます) @return 処理の結果を返します。 */ inline Result CommitSaveData(const char* archiveName = "data:") { NN_UNUSED_VAR(archiveName); return ResultSuccess(); } /*! @brief 拡張セーブデータ領域を作成します。 Id に対応した拡張セーブデータ領域を作成します。 @param[out] pOut 作成した拡張セーブデータ領域の MediaType が返ります @param[in] id 拡張セーブデータの ID を指定します。 @param[in] iconData アイコンデータを指定します。 @param[in] iconDataSize アイコンデータのサイズを指定します。 @param[in] entryDirectory この拡張セーブデータ領域に格納したいディレクトリ数を指定します。 @param[in] entryFile この拡張セーブデータ領域に格納したいファイル数を指定します。 @return 処理の結果を返します。 */ Result CreateExtSaveData(nn::fs::MediaType *pOut, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile); /*! @brief 拡張セーブデータをマウントします。 指定した拡張セーブデータ ID の拡張セーブデータ領域を、アーカイブとしてマウントします。 拡張セーブデータが存在しない場合には、nn::fs::ResultArchiveNotFound() が返されます。 この場合、@ref FormatAndMountExtSaveData を呼んで拡張セーブデータを作成してください。 どのメディアの拡張セーブデータをマウントしたかが pOut 引数によって返されます。 @param[out] pOut マウントした拡張セーブデータのメディアを返します。 @param[in] archiveName アーカイブ名を指定します。 @param[in] id 拡張セーブデータの ID を指定します。 @return 処理の結果を返します。 */ Result MountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id); /*! */ Result MountExtSaveDataForBoss(const char* archiveName, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); /*! */ Result MountExtSaveDataForBossRaw(ArchiveHandle *pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); /*! @brief 拡張セーブデータを作成後、マウントします。 Id に対応した拡張セーブデータ領域を作成した後、これをマウントします。 @param[out] pOut 作成・マウントした拡張セーブデータの MediaType を返します。 @param[in] archiveName アーカイブ名を指定します。 @param[in] id 拡張セーブデータの ID を指定します。 @param[in] iconData アイコンデータを指定します。 @param[in] iconDataSize アイコンデータのサイズを指定します。 @param[in] entryDirectory この拡張セーブデータ領域に格納したいディレクトリ数を指定します。 @param[in] entryFile この拡張セーブデータ領域に格納したいファイル数を指定します。 @return 処理の結果を返します。 */ Result CreateAndMountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile); /*! @brief 拡張セーブデータをフォーマットし、マウントします。 指定した拡張セーブデータ ID の拡張セーブデータをフォーマットし、指定したアーカイブ名でマウントします。 拡張セーブデータの作成の際には、 拡張セーブデータのアイコンのフォーマットに従ったアイコンデータを登録する必要があります。 拡張セーブデータがどのメディアに作成されたかが pOut 引数によって返されます。 @param[out] pOut 拡張セーブデータの作成されたメディアを返します。 @param[in] archiveName アーカイブ名を指定します。 @param[in] id 拡張セーブデータの ID を指定します。 @param[in] iconData アイコンデータの格納されたメモリを指定します。 @param[in] iconDataSize アイコンデータのサイズを指定します。 @param[in] entryDirectory この拡張セーブデータ領域に格納したいディレクトリ数を指定します。 @param[in] entryFile この拡張セーブデータ領域に格納したいファイル数を指定します。 @return 処理の結果を返します。 */ Result FormatAndMountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile); /*! @brief 拡張セーブデータのアイコンを読み出します。 指定したメディアと拡張セーブデータ ID の拡張セーブデータが持つアイコンデータを読み取ります。 @param[out] pOut 読み取ったサイズを返します。 @param[in] mediaType メディアを指定します。 @param[in] id 拡張セーブデータの ID を指定します。 @param[in] iconData アイコンデータを格納するメモリを指定します。 @param[in] iconDataSize アイコンデータのサイズを指定します。 @return 処理の結果を返します。 */ Result ReadExtSaveDataIcon(s32* pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id, void* iconData, size_t iconDataSize); /*! :private @brief 共有拡張セーブデータ領域を作成します。 Id に対応した共有拡張セーブデータ領域を作成します。 @param[out] pOut 作成した共有拡張セーブデータ領域の MediaType が返ります @param[in] id 共有拡張セーブデータの ID を指定します。 @param[in] entryDirectory この共有拡張セーブデータ領域に格納したいディレクトリ数を指定します。 @param[in] entryFile この共有拡張セーブデータ領域に格納したいファイル数を指定します。 @param[in] limitSize この共有拡張セーブデータ領域が使用できるデータサイズの上限を指定します。 @return 処理の結果を返します。 */ Result CreateSharedExtSaveData(nn::fs::MediaType *pOut, bit32 id, u32 entryDirectory, u32 entryFile, size_t limitSize); /*! :private @brief 共有拡張セーブデータをマウントします。 Id に対応した共有拡張領域をマウントします。 @param[out] pOut マウントした共有拡張セーブデータ領域の MediaType が返ります @param[in] archiveName アーカイブ名を指定します。 @param[in] id 共有拡張セーブデータの ID を指定します。 @return 処理の結果を返します。 */ Result MountSharedExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, bit32 id); /*! :private @brief 共有拡張セーブデータをフォーマット後、マウントします。 Id に対応した共有拡張セーブデータ領域をフォーマットした後、これをマウントします。 @param[out] pOut フォーマット・マウントした共有拡張セーブデータの MediaType を返します。 @param[in] archiveName アーカイブ名を指定します。 @param[in] id 共有拡張セーブデータの ID を指定します。 @param[in] entryDirectory この共有拡張セーブデータ領域に格納したいディレクトリ数を指定します。 @param[in] entryFile この共有拡張セーブデータ領域に格納したいファイル数を指定します。 @return 処理の結果を返します。 */ Result CreateAndMountSharedExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, bit32 id, u32 entryDirectory, u32 entryFile, size_t limitSize); /*! @brief アーカイブをアンマウントします。 @param[in] archiveName アーカイブ名を指定します @return 処理の結果を返します。 */ Result Unmount(const char* archiveName); // Raw ArchiveHandle GetArchiveHandle(const char* path); ArchiveHandle GetArchiveHandle(const wchar_t* path); Result UnmountRaw(ArchiveHandle archiveHandle); Result MountRomRaw(ArchiveHandle* pOut, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); s32 GetContentRequiredMemorySize(MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory); Result MountContent(const char* archiveName, MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); Result MountContentRaw(ArchiveHandle* pOut, MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); // 以下はシステム向け // TODO: 別ファイルへ移す必要がある // TORIAEZU: システム向けの暫定関数 // kernel 起動後に挿入されたゲームカードをアクセス可能にします。 // ゲームカードが挿入されていない場合や認識できない場合は失敗します。 Result ActivateCardDevice(); // TORIAEZU: システム向けの暫定関数 // Active 状態のゲームカードの種別を取得できるようにします。 // Active 状態とは、kernel 起動時に挿入されていて 自動的に Activate されている状態か、 // ActivateCardDevice 関数により Activate された状態です。 // ゲームカードが Active 状態でない場合(ゲームカードが挿入されていない場合も含む)は失敗します。 Result GetCardType(CardType* pOut); /*! @brief SD カードを直接参照するアーカイブをマウントします(デバッグ用)。 挿入されている SD カードを直接参照するアーカイブをマウントします。 SD カードが挿入されていない場合や SD カードがフォーマットされていない場合は失敗します。 マウントしていた SD カードが抜かれ、再挿入された SD カードをマウントする場合は、 @ref nn::fs::Unmount 関数によりアンマウントした後、再度 @ref nn::fs::MountSdmc 関数を実行する必要があります。 @param[in] archiveName アーカイブ名を指定します(省略するオーバロードでは "sdmc:" が暗黙的に指定されます) @return 処理の結果を返します。 */ Result MountSdmc(const char* archiveName = "sdmc:"); // exefs のマウント Result MountProgramRaw(ArchiveHandle *pOut, bit64 programHandle); // SystemMenuData や BannerData を取得するための TORIAEZU 関数 Result MountDataContentRawForSystemMenu(ArchiveHandle *pOut, nn::fs::MediaType media, bit64 programHandle); // その他の特殊アーカイブのマウント Result MountSpecialArchive(const char* archiveName, bit32 archiveKind); Result MountSpecialArchiveRaw(ArchiveHandle* pOut, bit32 archiveKind); Result MountExtSaveDataForBoss(const char* archiveName, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); Result MountExtSaveDataForBossRaw(ArchiveHandle *pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id); // TODO: その他細かいもの /*! @brief メディアの総容量と空き容量を取得します。 指定したメディアの総容量と空き容量を取得します。 指定できるメディアは MEDIA_TYPE_NAND, MEDIA_TYPE_SDMC です。 @param[out] pTotal メディアの総容量を返します。 @param[out] pFree メディアの空き容量を返します。 @param[in] mediaType メディアを指定します。 @return 処理の結果を返します。 */ Result GetFileSystemSize( s64* pTotal, s64* pFree, nn::fs::MediaType mediaType ); /*! @brief アーカイブの空き容量を取得します。 @param[out] pOut アーカイブの空き容量を返します。 @param[in] archiveName アーカイブ名を指定します。L"save:" のように指定してください。 @return 処理の結果を返します。 */ Result GetArchiveFreeBytes(s64* pOut, wchar_t* archiveName); }} namespace nn { namespace fs { /*! @brief PC 上のファイルに直接アクセスするための関数を含んだ名前空間です。 nn::fs::hio 名前空間内にある関数やクラスを使うためには、libnn_fshio をリンクした上で、 予め nn::hio::Initialize(void* pDeviceMemory) を呼んでおく必要があります。 基本的にデバッグ用途専用であり、製品版ではアクセスすることはできませんのでご注意ください。 */ namespace hio { /*! @brief HostIo アーカイブをマウントします。 HostIo アーカイブは hostPath で指定される PC 上の特定のディレクトリ以下を一つのアーカイブと見なすためのアーカイブで、 デバッグ用途にのみ使用することができます。 この関数を使用するためには libnn_fshio をリンクした上で、 あらかじめ nn::hio::Initialize(void* pDeviceMemory) を呼んで HIO を初期化しておく必要があります。 HIO の初期化には連続メモリである DeviceMemory を使用してください。 @param[in] archiveName アーカイブ名を指定します @param[in] hostPath PC 上のルートディレクトリを指定します @param[in] maxFile 同時に開くファイルの最大数を指定します @param[in] maxDirectory 同時に開くディレクトリの最大数を指定します @param[in] workingMemory アーカイブの動作に使用するメモリ領域の先頭アドレスを指定します @param[in] workingMemorySize アーカイブの動作に使用するメモリ領域のサイズを指定します @return 処理の結果を返します。 */ Result MountHioArchive(const char* archiveName, const wchar_t* hostPath, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize); /*! @brief hio アーカイブのマウントに必要なメモリサイズを取得します。 hio アーカイブのマウントに必要なメモリサイズを計算して返します。 このサイズは、maxFile で指定される数のファイルと、 maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。 @param[in] maxFile 同時に開くファイルの最大数 @param[in] maxDirectory 同時に開くディレクトリの最大数 @return 計算したメモリサイズを返します。 */ s32 GetHioRequiredMemorySize(size_t maxFile, size_t maxDirectory); }}} #endif