1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     fs_FileSystemBase.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 26463 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FS_CTR_MPCORE_FS_FILESYSTEMBASE_H_
17 #define NN_FS_CTR_MPCORE_FS_FILESYSTEMBASE_H_
18 
19 #include <nn/Handle.h>
20 #include <nn/fs/fs_IpcFileSystem.h>
21 
22 #include "fs_UserFileSystem.h"
23 
24 namespace nn { namespace fs { namespace detail {
25 
26 class FileSystemBaseImpl : public nn::fs::CTR::MPCore::detail::UserFileSystem
27 {
28 };
29 
30 }}}
31 
32 namespace nn { namespace fs {
33 
34 /*!
35     @brief     rom アーカイブのマウントに必要なメモリサイズを取得します。
36 
37                ビルド時に生成される ROMFS を参照する rom アーカイブのマウントに必要なメモリサイズを計算して返します。
38                このサイズは、maxFile で指定される数のファイルと、
39                maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。
40                useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュする場合に必要なメモリサイズを返します。
41 
42     @param[in] maxFile           同時に開くファイルの最大数
43     @param[in] maxDirectory      同時に開くディレクトリの最大数
44     @param[in] useCache          メタ情報をメモリにキャッシュするなら true、しないなら false
45 
46     @return    計算したメモリサイズを返します。rom アーカイブをマウントすることができない場合、負の値を返します。
47 
48 */
49 s32 GetRomRequiredMemorySize(size_t maxFile, size_t maxDirectory, bool useCache = true);
50 
51 /*!
52     @brief     rom アーカイブをマウントします。
53 
54                ビルド時に生成される ROMFS を参照する rom アーカイブをマウントします。
55                rom アーカイブに対し、maxFile で指定された数のファイルを同時に開くことができ、
56                maxDirectory で指定された数のディレクトリを同時に開けるようになります。
57                workingMemory には @ref GetRomRequiredMemorySize 関数で計算された必要メモリ以上の大きさのメモリを渡す必要があります。
58                useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュします。
59                これにより、ファイルを開いたり、ディレクトリの走査をするのにかかる時間が短縮されますが、
60                必要なメモリ量は増加します。
61 
62     @param[in] archiveName       アーカイブ名を指定します(省略するオーバロードでは "rom:" が暗黙的に指定されます)
63     @param[in] maxFile           同時に開くファイルの最大数
64     @param[in] maxDirectory      同時に開くディレクトリの最大数
65     @param[in] workingMemory     rom アーカイブの動作に使用するメモリ領域の先頭アドレス
66     @param[in] workingMemorySize rom アーカイブの動作に使用するメモリ領域のサイズ
67     @param[in] useCache          メタ情報をメモリにキャッシュするなら true、しないなら false
68 
69     @return 処理の結果を返します。
70 
71 */
72 Result MountRom(const char* archiveName, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true);
73 Result MountRom(size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true);
74 
75 /*!
76     @brief     セーブデータ領域をフォーマットします。
77 
78                アプリケーション固有の領域であるセーブデータ領域を、フォーマットします。
79                この関数を呼ぶと、既存のセーブデータがあった場合には消去されます。
80 
81                フォーマットの際には、
82                このセーブデータ領域がもつことのできるファイルの最大数と、ディレクトリの最大数を指定することができます。
83                この数を超えて、ファイルやディレクトリを作成することはできません。
84 
85     @param[in] maxFiles         ファイルの最大数を指定します
86     @param[in] maxDirectories   ディレクトリの最大数を指定します
87 
88     @return 処理の結果を返します。
89 
90 */
91 Result FormatSaveData(size_t maxFiles, size_t maxDirectories);
92 
93 /*!
94     @brief     セーブデータアーカイブをマウントします。
95 
96                アプリケーション固有の領域であるセーブデータ領域を、指定されたアーカイブ名でマウントします。
97                セーブデータ領域を使用する前には、セーブデータ領域をフォーマットする必要があります。
98                この関数を呼んだ際に nn::fs::ResultNotFormatted() が返ってきた際には、
99                @ref FormatSaveData 関数を呼ぶことで、セーブデータ領域を初期化した後、
100                もう一度この関数を呼んでマウントしてください。
101 
102     @param[in] archiveName      アーカイブ名を指定します(省略した際は "data:" が指定されます)
103 
104     @return 処理の結果を返します。
105 
106 */
107 Result MountSaveData(const char* archiveName = "data:");
108 
109 /*!
110     @brief     セーブデータの変更をコミットします。(※コミット機能は未実装です)
111 
112                指定のアーカイブ名でマウントされたセーブデータ領域をコミットし、
113                書き込んだデータを確実なものとします。
114                この関数を呼ばずにアーカイブをアンマウントしたり、プログラムが停止した場合、
115                前回のコミットからこれまでのセーブデータへの変更は全て巻き戻されます。
116                この関数が正常に返ってきた場合、セーブデータへの変更が正しく行われたことが保障されます。
117                この関数の実行中にプログラムが中断した場合のセーブデータの状態は、
118                「以前コミットが行われた状態か」もしくは「全ての変更が反映された状態」のどちらかになります。
119                破損したり、中途半端な状態になることはありません。
120 
121                ※現在、セーブデータのコミット機能は未実装です。
122                この関数を呼ばなくてもセーブデータへの変更は反映されます。
123                また、セーブデータへの書き込み中にプログラムが中断した場合などには、
124                セーブデータが破損する可能性があります。
125                ご注意ください。
126 
127     @param[in] archiveName      アーカイブ名を指定します(省略した際は "data:" が指定されます)
128 
129     @return 処理の結果を返します。
130 
131 */
132 inline Result CommitSaveData(const char* archiveName = "data:") { NN_UNUSED_VAR(archiveName); return ResultSuccess(); }
133 
134 /*!
135     @brief     拡張セーブデータ領域を作成します。
136 
137                Id に対応した拡張セーブデータ領域を作成します。
138 
139     @param[out] pOut            作成した拡張セーブデータ領域の MediaType が返ります
140     @param[in]  id              拡張セーブデータの ID を指定します。
141     @param[in]  iconData        アイコンデータを指定します。
142     @param[in]  iconDataSize    アイコンデータのサイズを指定します。
143     @param[in]  entryDirectory  この拡張セーブデータ領域に格納したいディレクトリ数を指定します。
144     @param[in]  entryFile       この拡張セーブデータ領域に格納したいファイル数を指定します。
145 
146     @return 処理の結果を返します。
147 
148 */
149 Result CreateExtSaveData(nn::fs::MediaType *pOut, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile);
150 
151 /*!
152     @brief     拡張セーブデータをマウントします。
153 
154                指定した拡張セーブデータ ID の拡張セーブデータ領域を、アーカイブとしてマウントします。
155                拡張セーブデータが存在しない場合には、nn::fs::ResultArchiveNotFound() が返されます。
156                この場合、@ref FormatAndMountExtSaveData を呼んで拡張セーブデータを作成してください。
157 
158                どのメディアの拡張セーブデータをマウントしたかが pOut 引数によって返されます。
159 
160     @param[out] pOut        マウントした拡張セーブデータのメディアを返します。
161     @param[in]  archiveName アーカイブ名を指定します。
162     @param[in]  id          拡張セーブデータの ID を指定します。
163 
164     @return 処理の結果を返します。
165 */
166 Result MountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id);
167 
168 /*!
169 */
170 Result MountExtSaveDataForBoss(const char* archiveName, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id);
171 
172 /*!
173 */
174 Result MountExtSaveDataForBossRaw(ArchiveHandle *pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id);
175 
176 /*!
177     @brief     拡張セーブデータを作成後、マウントします。
178 
179                Id に対応した拡張セーブデータ領域を作成した後、これをマウントします。
180 
181     @param[out] pOut            作成・マウントした拡張セーブデータの MediaType を返します。
182     @param[in]  archiveName     アーカイブ名を指定します。
183     @param[in]  id              拡張セーブデータの ID を指定します。
184     @param[in]  iconData        アイコンデータを指定します。
185     @param[in]  iconDataSize    アイコンデータのサイズを指定します。
186     @param[in]  entryDirectory  この拡張セーブデータ領域に格納したいディレクトリ数を指定します。
187     @param[in]  entryFile       この拡張セーブデータ領域に格納したいファイル数を指定します。
188 
189     @return 処理の結果を返します。
190 
191 */
192 Result CreateAndMountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile);
193 
194 /*!
195     @brief     拡張セーブデータをフォーマットし、マウントします。
196 
197                指定した拡張セーブデータ ID の拡張セーブデータをフォーマットし、指定したアーカイブ名でマウントします。
198                拡張セーブデータの作成の際には、
199                拡張セーブデータのアイコンのフォーマットに従ったアイコンデータを登録する必要があります。
200 
201                拡張セーブデータがどのメディアに作成されたかが pOut 引数によって返されます。
202 
203     @param[out] pOut            拡張セーブデータの作成されたメディアを返します。
204     @param[in]  archiveName     アーカイブ名を指定します。
205     @param[in]  id              拡張セーブデータの ID を指定します。
206     @param[in]  iconData        アイコンデータの格納されたメモリを指定します。
207     @param[in]  iconDataSize    アイコンデータのサイズを指定します。
208     @param[in]  entryDirectory  この拡張セーブデータ領域に格納したいディレクトリ数を指定します。
209     @param[in]  entryFile       この拡張セーブデータ領域に格納したいファイル数を指定します。
210 
211     @return 処理の結果を返します。
212 
213 */
214 Result FormatAndMountExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile);
215 
216 /*!
217     @brief     拡張セーブデータのアイコンを読み出します。
218 
219                指定したメディアと拡張セーブデータ ID の拡張セーブデータが持つアイコンデータを読み取ります。
220 
221     @param[out] pOut            読み取ったサイズを返します。
222     @param[in]  mediaType       メディアを指定します。
223     @param[in]  id              拡張セーブデータの ID を指定します。
224     @param[in]  iconData        アイコンデータを格納するメモリを指定します。
225     @param[in]  iconDataSize    アイコンデータのサイズを指定します。
226 
227     @return 処理の結果を返します。
228 
229 */
230 Result ReadExtSaveDataIcon(s32* pOut, nn::fs::MediaType mediaType,  nn::fs::ExtSaveDataId id, void* iconData, size_t iconDataSize);
231 
232 /*!
233     :private
234 
235     @brief     共有拡張セーブデータ領域を作成します。
236 
237                Id に対応した共有拡張セーブデータ領域を作成します。
238 
239     @param[out] pOut            作成した共有拡張セーブデータ領域の MediaType が返ります
240     @param[in]  id              共有拡張セーブデータの ID を指定します。
241     @param[in]  entryDirectory  この共有拡張セーブデータ領域に格納したいディレクトリ数を指定します。
242     @param[in]  entryFile       この共有拡張セーブデータ領域に格納したいファイル数を指定します。
243     @param[in]  limitSize       この共有拡張セーブデータ領域が使用できるデータサイズの上限を指定します。
244 
245     @return 処理の結果を返します。
246 
247 */
248 Result CreateSharedExtSaveData(nn::fs::MediaType *pOut, bit32 id, u32 entryDirectory, u32 entryFile, size_t limitSize);
249 
250 /*!
251     :private
252 
253     @brief     共有拡張セーブデータをマウントします。
254 
255                Id に対応した共有拡張領域をマウントします。
256 
257     @param[out] pOut            マウントした共有拡張セーブデータ領域の MediaType が返ります
258     @param[in]  archiveName     アーカイブ名を指定します。
259     @param[in]  id              共有拡張セーブデータの ID を指定します。
260 
261     @return 処理の結果を返します。
262 
263 */
264 Result MountSharedExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, bit32 id);
265 
266 /*!
267     :private
268 
269     @brief     共有拡張セーブデータをフォーマット後、マウントします。
270 
271                Id に対応した共有拡張セーブデータ領域をフォーマットした後、これをマウントします。
272 
273     @param[out] pOut            フォーマット・マウントした共有拡張セーブデータの MediaType を返します。
274     @param[in]  archiveName     アーカイブ名を指定します。
275     @param[in]  id              共有拡張セーブデータの ID を指定します。
276     @param[in]  entryDirectory  この共有拡張セーブデータ領域に格納したいディレクトリ数を指定します。
277     @param[in]  entryFile       この共有拡張セーブデータ領域に格納したいファイル数を指定します。
278 
279     @return 処理の結果を返します。
280 
281 */
282 Result CreateAndMountSharedExtSaveData(nn::fs::MediaType *pOut, const char* archiveName, bit32 id, u32 entryDirectory, u32 entryFile, size_t limitSize);
283 
284 /*!
285     @brief     アーカイブをアンマウントします。
286 
287     @param[in] archiveName       アーカイブ名を指定します
288 
289     @return 処理の結果を返します。
290 */
291 Result Unmount(const char* archiveName);
292 
293 
294 // Raw
295 ArchiveHandle GetArchiveHandle(const char* path);
296 ArchiveHandle GetArchiveHandle(const wchar_t* path);
297 
298 Result UnmountRaw(ArchiveHandle archiveHandle);
299 
300 Result MountRomRaw(ArchiveHandle* pOut, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize);
301 
302 s32 GetContentRequiredMemorySize(MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory);
303 Result MountContent(const char* archiveName, MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize);
304 Result MountContentRaw(ArchiveHandle* pOut, MediaType mediaType, TitleId titleId, ContentIdx contentIndex, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize);
305 
306 // 以下はシステム向け
307 // TODO: 別ファイルへ移す必要がある
308 
309 // TORIAEZU: システム向けの暫定関数
310 //   kernel 起動後に挿入されたゲームカードをアクセス可能にします。
311 //   ゲームカードが挿入されていない場合や認識できない場合は失敗します。
312 Result ActivateCardDevice();
313 
314 // TORIAEZU: システム向けの暫定関数
315 //   Active 状態のゲームカードの種別を取得できるようにします。
316 //   Active 状態とは、kernel 起動時に挿入されていて 自動的に Activate されている状態か、
317 //   ActivateCardDevice 関数により Activate された状態です。
318 //   ゲームカードが Active 状態でない場合(ゲームカードが挿入されていない場合も含む)は失敗します。
319 Result GetCardType(CardType* pOut);
320 
321 /*!
322     @brief     SD カードを直接参照するアーカイブをマウントします(デバッグ用)。
323 
324                挿入されている SD カードを直接参照するアーカイブをマウントします。
325                SD カードが挿入されていない場合や SD カードがフォーマットされていない場合は失敗します。
326                マウントしていた SD カードが抜かれ、再挿入された SD カードをマウントする場合は、
327                @ref nn::fs::Unmount 関数によりアンマウントした後、再度 @ref nn::fs::MountSdmc 関数を実行する必要があります。
328 
329     @param[in] archiveName       アーカイブ名を指定します(省略するオーバロードでは "sdmc:" が暗黙的に指定されます)
330 
331     @return 処理の結果を返します。
332 */
333 Result MountSdmc(const char* archiveName = "sdmc:");
334 
335 // exefs のマウント
336 Result MountProgramRaw(ArchiveHandle *pOut, bit64 programHandle);
337 
338 // SystemMenuData や BannerData を取得するための TORIAEZU 関数
339 Result MountDataContentRawForSystemMenu(ArchiveHandle *pOut, nn::fs::MediaType media, bit64 programHandle);
340 
341 // その他の特殊アーカイブのマウント
342 Result MountSpecialArchive(const char* archiveName, bit32 archiveKind);
343 Result MountSpecialArchiveRaw(ArchiveHandle* pOut, bit32 archiveKind);
344 Result MountExtSaveDataForBoss(const char* archiveName, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id);
345 Result MountExtSaveDataForBossRaw(ArchiveHandle *pOut, nn::fs::MediaType mediaType, nn::fs::ExtSaveDataId id);
346 
347 // TODO: その他細かいもの
348 
349 
350 /*!
351     @brief     メディアの総容量と空き容量を取得します。
352 
353                指定したメディアの総容量と空き容量を取得します。
354                指定できるメディアは MEDIA_TYPE_NAND, MEDIA_TYPE_SDMC です。
355 
356     @param[out] pTotal      メディアの総容量を返します。
357     @param[out] pFree       メディアの空き容量を返します。
358     @param[in]  mediaType   メディアを指定します。
359 
360     @return 処理の結果を返します。
361 
362 */
363 Result GetFileSystemSize( s64* pTotal, s64* pFree, nn::fs::MediaType mediaType );
364 
365 /*!
366     @brief     アーカイブの空き容量を取得します。
367 
368     @param[out] pOut        アーカイブの空き容量を返します。
369     @param[in]  archiveName アーカイブ名を指定します。L"save:" のように指定してください。
370 
371     @return 処理の結果を返します。
372 
373 */
374 Result GetArchiveFreeBytes(s64* pOut, wchar_t* archiveName);
375 
376 }}
377 
378 
379 namespace nn { namespace fs {
380 
381 
382     /*! @brief PC 上のファイルに直接アクセスするための関数を含んだ名前空間です。
383 
384         nn::fs::hio 名前空間内にある関数やクラスを使うためには、libnn_fshio をリンクした上で、
385         予め nn::hio::Initialize(void* pDeviceMemory) を呼んでおく必要があります。
386         基本的にデバッグ用途専用であり、製品版ではアクセスすることはできませんのでご注意ください。
387     */
388     namespace hio {
389 
390 /*!
391     @brief     HostIo アーカイブをマウントします。
392                HostIo アーカイブは hostPath で指定される PC 上の特定のディレクトリ以下を一つのアーカイブと見なすためのアーカイブで、
393                デバッグ用途にのみ使用することができます。
394 
395                この関数を使用するためには libnn_fshio をリンクした上で、
396                あらかじめ nn::hio::Initialize(void* pDeviceMemory) を呼んで HIO を初期化しておく必要があります。
397                HIO の初期化には連続メモリである DeviceMemory を使用してください。
398 
399     @param[in] archiveName       アーカイブ名を指定します
400     @param[in] hostPath          PC 上のルートディレクトリを指定します
401     @param[in] maxFile           同時に開くファイルの最大数を指定します
402     @param[in] maxDirectory      同時に開くディレクトリの最大数を指定します
403     @param[in] workingMemory     アーカイブの動作に使用するメモリ領域の先頭アドレスを指定します
404     @param[in] workingMemorySize アーカイブの動作に使用するメモリ領域のサイズを指定します
405 
406     @return 処理の結果を返します。
407 */
408 Result MountHioArchive(const char* archiveName, const wchar_t* hostPath, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize);
409 
410 /*!
411     @brief     hio アーカイブのマウントに必要なメモリサイズを取得します。
412 
413                hio アーカイブのマウントに必要なメモリサイズを計算して返します。
414                このサイズは、maxFile で指定される数のファイルと、
415                maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。
416 
417     @param[in] maxFile           同時に開くファイルの最大数
418     @param[in] maxDirectory      同時に開くディレクトリの最大数
419 
420     @return    計算したメモリサイズを返します。
421 
422 */
423 s32 GetHioRequiredMemorySize(size_t maxFile, size_t maxDirectory);
424 
425 }}}
426 
427 #endif
428