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: 31708 $
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/CTR/MPCore/fs_UserFileSystem.h>
21 
22 namespace nn { namespace fs { namespace detail {
23 
24 class FileSystemBaseImpl : public nn::fs::CTR::MPCore::detail::UserFileSystem
25 {
26 };
27 
28 }}}
29 
30 namespace nn { namespace fs {
31 
32 //----------------------------------------
33 //! @name ROM アーカイブ
34 //@{
35 
36 /*!
37     @brief      rom アーカイブのマウントに必要なメモリサイズを取得します。
38 
39                 ビルド時に生成される ROMFS を参照する rom アーカイブのマウントに必要なメモリサイズを計算して返します。@n
40                 このサイズは、maxFile で指定される数のファイルと、maxDirectory で指定される数のディレクトリを
41                 同時に開くことができるだけのメモリのサイズが返されます。@n
42                 useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュする場合に必要なメモリサイズも含まれるようになります。
43 
44     @param[in] maxFile           同時に開くファイルの最大数
45     @param[in] maxDirectory      同時に開くディレクトリの最大数
46     @param[in] useCache          メタ情報をメモリにキャッシュするなら true、しないなら false
47 
48     @return    計算したメモリサイズを返します。rom アーカイブをマウントすることができない場合、負の値を返します。
49 
50 */
51 s32 GetRomRequiredMemorySize(size_t maxFile, size_t maxDirectory, bool useCache = true);
52 
53 /*!
54     @brief      rom アーカイブをマウントします。
55 
56                 ビルド時に生成される ROMFS を参照する rom アーカイブをマウントします。@n
57                 rom アーカイブに対し、maxFile で指定された数のファイルを同時に開くことができ、
58                 maxDirectory で指定された数のディレクトリを同時に開けるようになります。@n
59                 workingMemory には @ref GetRomRequiredMemorySize 関数で計算された必要メモリ以上の大きさのメモリを渡す必要があります。@n
60                 useCache を true に設定することで、ROMFS のメタデータをメモリにキャッシュします。
61                 これにより、ファイルを開いたり、ディレクトリの走査をするのにかかる時間が短縮されますが、必要なメモリ量は増加します。
62 
63     @param[in] archiveName       アーカイブ名を指定します(省略するオーバロードでは "rom:" が暗黙的に指定されます)
64     @param[in] maxFile           同時に開くファイルの最大数
65     @param[in] maxDirectory      同時に開くディレクトリの最大数
66     @param[in] workingMemory     rom アーカイブの動作に使用するメモリ領域の先頭アドレス
67     @param[in] workingMemorySize rom アーカイブの動作に使用するメモリ領域のサイズ
68     @param[in] useCache          メタ情報をメモリにキャッシュするなら true、しないなら false
69 
70     @return 処理の結果を返します。
71 
72 */
73 Result MountRom(const char* archiveName, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true);
74 Result MountRom(size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize, bool useCache = true);
75 
76 //@}
77 
78 //----------------------------------------
79 //! @name セーブデータアーカイブ
80 //@{
81 
82 /*!
83     @brief      セーブデータ領域をフォーマットします。
84 
85                 アプリケーション固有の領域であるセーブデータ領域を、フォーマットします。
86                 この関数を呼ぶと、既存のセーブデータがあった場合には消去されます。
87 
88                 フォーマットの際には、このセーブデータ領域がもつことのできるファイルの最大数と、ディレクトリの最大数を指定することができます。
89                 この数を超えて、ファイルやディレクトリを作成することはできませんので注意してください。
90 
91     @param[in] maxFiles         ファイルの最大数を指定します
92     @param[in] maxDirectories   ディレクトリの最大数を指定します
93     @param[in] isDuplicateAll   セーブデータ領域全体を二重化するかどうかをしていします
94 
95     @return 処理の結果を返します。
96 
97 */
98 Result FormatSaveData(size_t maxFiles, size_t maxDirectories, bool isDuplicateAll = false);
99 
100 /*!
101     @brief      セーブデータアーカイブをマウントします。
102 
103                 アプリケーション固有の領域であるセーブデータ領域を、指定されたアーカイブ名でマウントします。
104                 セーブデータ領域を使用する前には、セーブデータ領域をフォーマットする必要があります。
105 
106                 この関数を呼んだ際には必ず戻り値の判定を行い、セーブデータ領域が不正な状態でないか判断をしてください。
107                 不正な状態の場合は、@ref FormatSaveData を呼び出してセーブデータ領域の初期化をしてください。
108                 その後、もう一度この関数を呼び出してマウントしてください。
109 
110     @param[in] archiveName      アーカイブ名を指定します(省略した際は "data:" が指定されます)
111 
112     @return 処理の結果を返します。
113     @retval ResultSuccess               処理に成功しました。
114     @retval ResultNotFormatted          フォーマットされていません。@ref FormatSaveData を呼び出してフォーマットしてください。
115     @retval ResultBadFormat             不正なフォーマットです。@ref FormatSaveData を呼び出してフォーマットしてください。
116     @retval ResultVerificationFailed    検証に失敗しました。@ref FormatSaveData を呼び出してフォーマットしてください。
117     @retval 上記以外                    上記以外の理由で失敗しました。
118 
119 */
120 Result MountSaveData(const char* archiveName = "data:");
121 
122 /*!
123     @brief     セーブデータの変更をコミットします。
124 
125                指定のアーカイブ名でマウントされたセーブデータ領域をコミットし、
126                書き込んだデータを確実なものとします。
127                この関数を呼ばずにアーカイブをアンマウントしたり、プログラムが停止した場合、
128                前回のコミットからこれまでのセーブデータへの変更は全て巻き戻されます。
129                この関数が正常に返ってきた場合、セーブデータへの変更が正しく行われたことが保障されます。
130                この関数の実行中にプログラムが中断した場合のセーブデータの状態は、
131                「以前コミットが行われた状態か」もしくは「全ての変更が反映された状態」のどちらかになります。
132                破損したり、中途半端な状態になることはありません。
133 
134     @param[in] archiveName      アーカイブ名を指定します(省略した際は "data:" が指定されます)
135 
136     @return 処理の結果を返します。
137 
138 */
139 Result CommitSaveData(const char* archiveName = "data:");
140 
141 //@}
142 
143 //----------------------------------------
144 //! @name 拡張セーブデータアーカイブ
145 //@{
146 
147 /*!
148     @brief      拡張セーブデータ領域を作成します。
149 
150                 Id に対応した拡張セーブデータ領域を作成します。
151                 引数の拡張セーブデータ ID には、RSF で指定した拡張セーブデータ番号を指定してください。
152 
153                 この関数を呼ぶ前には必ず @ref MountExtSaveData を呼び出して、
154                 すでに同じ ID の領域が作成されていないか確認を行ってください。
155                 フォーマットのみを行う場合は、@ref DeleteExtSaveData を呼び出して削除を行なった後、
156                 この関数を呼び出してください。
157 
158                 アイコンデータには、ctr_makebunner32 により出力された icn ファイルを指定してください。
159 
160                 拡張セーブデータを作り直さない限り、ここで指定したディレクトリ数、ファイル数、データサイズを
161                 超えた書き込みは行うことができません。拡張的な使用を行う場合は注意してください。
162 
163                 拡張セーブデータ上に作られるファイルは、サイズ変更が不可です。よって @ref FileStream::TryInitialize などでファイル
164                 を作成することができません。ファイルを作成するときは、サイズ指定が可能な @ref TryCreateFile を使用してください。
165 
166     @param[in]  id              拡張セーブデータの ID を指定します。
167     @param[in]  iconData        アイコンデータを指定します。
168     @param[in]  iconDataSize    アイコンデータのサイズを指定します。
169     @param[in]  entryDirectory  この拡張セーブデータ領域に格納したいディレクトリ数を指定します。
170     @param[in]  entryFile       この拡張セーブデータ領域に格納したいファイル数を指定します。
171 
172     @return 処理の結果を返します。
173 
174 */
175 Result CreateExtSaveData(nn::fs::ExtSaveDataId id, const void* iconData, size_t iconDataSize, u32 entryDirectory, u32 entryFile);
176 
177 /*!
178     @brief      拡張セーブデータをマウントします。
179 
180                 指定した拡張セーブデータ ID の拡張セーブデータ領域を、アーカイブとしてマウントします。
181 
182                 この関数を呼んだ際には必ず戻り値の判定を行い、拡張セーブデータ領域が不正な状態でないか判断をしてください。
183                 不正な状態の場合は、@ref DeleteExtSaveData を呼び出して削除を行なった後、@ref CreateExtSaveData 関数を呼び出して
184                 拡張セーブデータ領域を作り直してください。その後、もう一度この関数を呼び出してマウントしてください。
185 
186     @param[in]  archiveName アーカイブ名を指定します。
187     @param[in]  id          拡張セーブデータの ID を指定します。
188 
189     @return 処理の結果を返します。
190     @retval ResultSuccess               処理に成功しました。
191     @retval ResultNotFound              拡張セーブデータが見つかりません。@ref CreateExtSaveData を呼び出して作成してください。
192     @retval ResultNotFormatted          フォーマットがされていません。@ref CreateExtSaveData を呼び出してフォーマットしてください。
193     @retval ResultBadFormat             不正なフォーマットです。@ref CreateExtSaveData を呼び出してフォーマットしてください。
194     @retval ResultVerificationFailed    検証に失敗しました。@ref CreateExtSaveData を呼び出してフォーマットしてください。
195     @retval 上記以外                    上記以外の理由で失敗しました。
196 */
197 Result MountExtSaveData(const char* archiveName, nn::fs::ExtSaveDataId id);
198 
199 /*!
200     @brief      拡張セーブデータを削除します。
201 
202                 引数の拡張セーブデータ ID には、RSF で指定した拡張セーブデータ番号を指定してください。
203 
204     @param[in]  id          削除する拡張セーブデータの ID を指定します。
205 
206     @return 処理の結果を返します。
207 */
208 Result DeleteExtSaveData(ExtSaveDataId id);
209 
210 
211 //@}
212 
213 /*!
214     @brief     アーカイブをアンマウントします。
215 
216     @param[in] archiveName       アーカイブ名を指定します
217 
218     @return 処理の結果を返します。
219 */
220 Result Unmount(const char* archiveName);
221 
222 
223 //----------------------------------------
224 //! @name デバッグ用
225 //@{
226 
227 /*!
228     @brief      SD カードを直接参照するアーカイブをマウントします(デバッグ用)。
229 
230                 挿入されている SD カードを直接参照するアーカイブをマウントします。
231                 SD カードが挿入されていない場合や SD カードがフォーマットされていない場合は失敗します。
232                 マウントしていた SD カードが抜かれ、再挿入された SD カードをマウントする場合は、
233                 @ref nn::fs::Unmount 関数によりアンマウントした後、再度 @ref nn::fs::MountSdmc 関数を実行する必要があります。
234 
235                 基本的にデバッグ用途専用であり、製品版ではアクセスすることはできませんのでご注意ください。
236 
237     @param[in] archiveName  アーカイブ名を指定します(省略するオーバロードでは "sdmc:" が暗黙的に指定されます)
238 
239     @return 処理の結果を返します。
240 */
241 Result MountSdmc(const char* archiveName = "sdmc:");
242 
243 /*!
244     @brief     不揮発性メモリデバイスが劣化した際の動作を擬似的に再現させます(デバッグ用)。
245 
246                ゲームカード、NAND、SDメモリカードへアクセスする際、劣化したデバイスで生じる
247                ウェイト時間を擬似的に再現させます。
248                (ウェイト時間は リード毎に 0~100ms、ライト毎に 0~380ms です)
249                このエミュレーション機能は debug ビルド または development ビルド では常に有効ですが、
250                release ビルド時 にはデフォルトでは無効になるため、入念にデバッグする場合はこの関数で
251                明示的に指定する必要があります。
252                なお、明示的にエミュレーション機能をOFFにするには、@ref nn::fs::ForceDisableLatencyEmulation 関数を使用します。
253 
254 */
255 void ForceEnableLatencyEmulation( void );
256 
257 /*!
258     @brief     不揮発性メモリデバイスが劣化した際の動作を擬似的に再現させないようにします(デバッグ用)。
259 
260                ゲームカード、NAND、SDメモリカードへアクセスする際、劣化したデバイスで生じる
261                ウェイト時間を擬似的に再現させる機能を明示的にOFFにします。
262                このエミュレーション機能は release ビルド時 にはデフォルトでは無効ですが、
263                debug ビルド または development ビルド では有効になっているため、この機能の影響を
264                受けたくない場合にはこの関数で明示的に指定する必要があります。
265                なお、明示的にエミュレーション機能をONにするには、@ref nn::fs::ForceEnableLatencyEmulation 関数を使用します。
266 
267 */
268 void ForceDisableLatencyEmulation( void );
269 
270 //@}
271 
272 // TODO: その他細かいもの
273 
274 
275 /*!
276     @brief     アーカイブの空き容量を取得します。
277 
278     @param[out] pOut        アーカイブの空き容量を返します。
279     @param[in]  archiveName アーカイブ名を指定します。
280 
281     @return 処理の結果を返します。
282 
283 */
284 Result GetArchiveFreeBytes(s64* pOut, const char* archiveName);
285 // この関数は、システムセーブデータでも使用することができます。
286 // 1 ブロックのサイズは、ユーザセーブデータと同じです。但し、将来変更される可能性があります。
287 
288 }}
289 
290 
291 namespace nn { namespace fs {
292 
293 
294     /*! @brief PC 上のファイルに直接アクセスするための関数を含んだ名前空間です(デバッグ用)。
295 
296         @ref nn::fs::hio 名前空間内にある関数やクラスを使うためには、libnn_fshio をリンクした上で、
297         予め @ref nn::hio::CTR::Initialize を呼んでおく必要があります。
298 
299         基本的にデバッグ用途専用であり、製品版ではアクセスすることはできませんのでご注意ください。
300     */
301     namespace hio {
302 
303 /*!
304     @brief     hio アーカイブをマウントします。
305                hio アーカイブは hostPath で指定される PC 上の特定のディレクトリ以下を一つのアーカイブと見なすためのアーカイブで、
306                デバッグ用途にのみ使用することができます。
307 
308                この関数を使用するためには libnn_fshio をリンクした上で、
309                あらかじめ @ref nn::hio::CTR::Initialize を呼んで HIO を初期化しておく必要があります。
310                HIO の初期化には連続メモリである DeviceMemory を使用してください。
311 
312     @param[in] archiveName       アーカイブ名を指定します
313     @param[in] hostPath          PC 上のルートディレクトリを指定します
314     @param[in] maxFile           同時に開くファイルの最大数を指定します
315     @param[in] maxDirectory      同時に開くディレクトリの最大数を指定します
316     @param[in] workingMemory     アーカイブの動作に使用するメモリ領域の先頭アドレスを指定します
317     @param[in] workingMemorySize アーカイブの動作に使用するメモリ領域のサイズを指定します
318 
319     @return 処理の結果を返します。
320 */
321 Result MountHioArchive(const char* archiveName, const wchar_t* hostPath, size_t maxFile, size_t maxDirectory, void* workingMemory, size_t workingMemorySize);
322 
323 /*!
324     @brief     hio アーカイブのマウントに必要なメモリサイズを取得します。
325 
326                hio アーカイブのマウントに必要なメモリサイズを計算して返します。
327                このサイズは、maxFile で指定される数のファイルと、
328                maxDirectory で指定される数のディレクトリを、同時に開くことができるだけのメモリのサイズも含まれます。
329 
330     @param[in] maxFile           同時に開くファイルの最大数
331     @param[in] maxDirectory      同時に開くディレクトリの最大数
332 
333     @return    計算したメモリサイズを返します。
334 
335 */
336 s32 GetHioRequiredMemorySize(size_t maxFile, size_t maxDirectory);
337 
338 }}}
339 
340 #endif
341