1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     fs_FileStream.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: 31495 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FS_FS_FILESTREAM_H_
17 #define NN_FS_FS_FILESTREAM_H_
18 
19 #include <nn/fs/fs_IStream.h>
20 #include <nn/fs/fs_FileBase.h>
21 #include <nn/fnd/fnd_Storage.h>
22 
23 namespace nn { namespace fs {
24 
25 /*!
26     :category ファイル・ディレクトリ操作
27     @brief ファイルを読み書きするためのクラスです。
28 
29            パス名で指定されたファイルを開き、データを読み書きできます。@n
30            パス名の指定には、ワイド文字列とマルチバイト文字列の両方が使えますが、
31            特別な理由が無い限りは、ワイド文字列を使うようにしてください。
32 
33            拡張セーブデータの場合、このクラスを使用してファイルを新規に作成することはできません。
34            サイズ指定のある @ref TryCreateFile 関数を使用してください。
35 
36 */
37 class FileStream : public IStream, public detail::FileBase, private nn::util::NonCopyable<FileStream>
38 {
39 public:
40 
41     /*!
42         @brief コンストラクタです。
43 
44                引数の無いオーバロードでは、ファイルは開きません。ファイルを操作するためには、別途 @ref Initialize を呼ぶ必要があります。
45 
46                openMode 引数の詳細については、@ref OpenMode を参照してください。
47     */
FileStream()48     FileStream() {}
49 
50     /*!
51         @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。
52 
53                指定されたパスのファイルを指定された OpenMode で開きます。
54 
55                なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で
56                ファイルを作成しておく必要があります。
57 
58                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
59                基本的に @ref TryInitialize を使うようにしてください。
60 
61         @param[in] pathName 開くファイルのパス
62         @param[in] openMode ファイルを開くモード
63     */
FileStream(const wchar_t * pathName,bit32 openMode)64     FileStream(const wchar_t* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {}
65 
66     /*!
67         @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。
68 
69                指定されたパスのファイルを指定された OpenMode で開きます。@n
70                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
71                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
72 
73                なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で
74                ファイルを作成しておく必要があります。
75 
76                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
77                基本的に @ref TryInitialize を使うようにしてください。
78 
79         @param[in] pathName 開くファイルのパス
80         @param[in] openMode ファイルを開くモード
81     */
FileStream(const char * pathName,bit32 openMode)82     FileStream(const char* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {}
83 
84     /*!
85         @brief 指定されたファイルを開きます。
86 
87                指定されたパスのファイルを指定された OpenMode で開きます。@n
88                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
89                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
90 
91                なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で
92                ファイルを作成しておく必要があります。
93 
94                openMode 引数の詳細については、@ref OpenMode を参照してください。
95 
96                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
97                基本的に @ref TryInitialize を使うようにしてください。
98 
99         @param[in] pathName 開くファイルのパス
100         @param[in] openMode ファイルを開くモード
101     */
Initialize(const wchar_t * pathName,bit32 openMode)102     void Initialize(const wchar_t* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); }
103 
104     /*!
105         @brief 指定されたファイルを開きます。
106 
107                指定されたパスのファイルを指定された OpenMode で開きます。@n
108                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
109                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。@n
110                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
111                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
112 
113                なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で
114                ファイルを作成しておく必要があります。
115 
116                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
117                基本的に @ref TryInitialize を使うようにしてください。
118 
119         @param[in] pathName 開くファイルのパス
120         @param[in] openMode ファイルを開くモード
121     */
Initialize(const char * pathName,bit32 openMode)122     void Initialize(const char* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); }
123 
124     /*!
125         @brief 指定されたファイルを開きます。
126 
127                指定されたパスのファイルを指定された OpenMode で開きます。@n
128                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
129                ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。
130                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
131 
132                なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で
133                ファイルを作成しておく必要があります。
134 
135                openMode 引数の詳細については、@ref OpenMode を参照してください。
136 
137         @param[in] pathName 開くファイルのパス
138         @param[in] openMode ファイルを開くモード
139     */
TryInitialize(const wchar_t * pathName,bit32 openMode)140     nn::Result TryInitialize(const wchar_t* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); }
141 
142     /*!
143         @brief 指定されたファイルを開きます。
144 
145                指定されたパスのファイルを指定された OpenMode で開きます。@n
146                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
147                ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。@n
148                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
149                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
150 
151                なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で
152                ファイルを作成しておく必要があります。
153 
154         @param[in] pathName 開くファイルのパス
155         @param[in] openMode ファイルを開くモード
156     */
TryInitialize(const char * pathName,bit32 openMode)157     nn::Result TryInitialize(const char* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); }
158 
159     /*!
160         @brief ファイルを閉じます。
161 
162                ファイルを閉じます。ファイルが開かれていなかった場合は何もしません。
163     */
Finalize()164     void Finalize() { detail::FileBase::Finalize(); }
165 
166     /*!
167         @brief デストラクタです。
168 
169                ファイルが開かれていればファイルを閉じます。
170     */
~FileStream()171     virtual ~FileStream() {}
172 
173     /*!
174         @brief ファイルから指定サイズをバッファに読み込みます。
175 
176                ファイルの現在位置から最大 size バイトデータを読み込み、
177                buffer で指定されたアドレスの領域にコピーします。
178 
179                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
180                基本的に @ref TryRead を使うようにしてください。
181 
182          @param[in] buffer コピー先のバッファへのポインタ
183          @param[in] size コピーする最大バイト数
184 
185          @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。
186     */
Read(void * buffer,size_t size)187     virtual s32 Read(void* buffer, size_t size) { return detail::FileBase::Read(buffer, size); }
188 
189     /*!
190         @brief ファイルから指定サイズをバッファに読み込みます。
191 
192                ファイルの現在位置から最大 size バイトデータを読み込み、
193                buffer で指定されたアドレスの領域にコピーします。
194 
195          @param[out] pOut 実際にコピーしたバイト数が格納されます。ファイルの終端に達したときは 0 が格納されます。
196          @param[in] buffer コピー先のバッファへのポインタ
197          @param[in] size コピーする最大バイト数
198 
199          @return 処理の結果を返します。
200     */
TryRead(s32 * pOut,void * buffer,size_t size)201     virtual Result TryRead(s32* pOut, void* buffer, size_t size) { return detail::FileBase::TryRead(pOut, buffer, size); }
202 
203     /*!
204         @brief バッファから指定サイズをファイルに書き込みます。
205 
206                buffer で指定されたアドレスの領域にから、
207                最大 size バイトをファイルに書き込みます。
208 
209                引数の flush に false を指定したときは、インスタンスを破棄する前に必ず
210                @ref TryFlush 関数を呼び出してください。
211 
212                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
213                基本的に @ref TryWrite を使うようにしてください。
214 
215          @param[in] buffer 書き込むデータが含まれているバッファへのポインタ
216          @param[in] size ファイルに書き込む最大バイト数
217          @param[in] flush デバイスへの書き戻しを行なうか指定します。
218 
219          @return 実際に書き込んだバイト数を返します。
220     */
221     virtual s32 Write(const void* buffer, size_t size, bool flush=true) { return detail::FileBase::Write(buffer, size, flush); }
222 
223     /*!
224         @brief バッファから指定サイズをファイルに書き込みます。
225 
226                buffer で指定されたアドレスの領域にから、
227                最大 size バイトをファイルに書き込みます。
228 
229                引数の flush に false を指定したときは、インスタンスを破棄する前に必ず
230                @ref TryFlush 関数を呼び出してください。
231 
232          @param[out] pOut 実際に書き込んだバイト数が格納されます。
233          @param[in] buffer 書き込むデータが含まれているバッファへのポインタ
234          @param[in] size ファイルに書き込む最大バイト数
235          @param[in] flush デバイスへの書き戻しを行なうか指定します。
236 
237          @return 処理の結果を返します。
238     */
239     virtual Result TryWrite(s32* pOut, const void* buffer, size_t size, bool flush=true) { return detail::FileBase::TryWrite(pOut, buffer, size, flush); }
240 
241     /*!
242         @brief ファイルの読み込み・書き込み位置を変更します。
243 
244                base で指定された位置から position 離れた場所に読み込み・書き込み位置を設定します。
245 
246                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
247                基本的に @ref TrySeek を使うようにしてください。
248 
249         @param[in] base 読み込み・書き込み位置の変更する基準を指定します。
250         @param[in] position 読み込み・書き込み位置の変更する位置を指定します。
251     */
Seek(s64 position,PositionBase base)252     virtual void Seek(s64 position, PositionBase base) { detail::FileBase::Seek(position, base); }
253 
254     /*!
255         @brief ファイルの読み出し位置を変更します。
256 
257                base で指定された位置から position 離れた場所に読み出し位置を設定します。
258 
259         @param[in] base 読み出し位置の変更する基準を指定します。
260         @param[in] position 読み出し位置の変更する位置を指定します。
261 
262         @return 処理の結果を返します。
263     */
TrySeek(s64 position,PositionBase base)264     virtual Result TrySeek(s64 position, PositionBase base) { return detail::FileBase::TrySeek(position, base); }
265 
266     /*!
267         @brief ファイル先頭から数えた現在の読み出し位置を取得します。
268 
269                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
270                基本的に @ref TryGetPosition を使うようにしてください。
271 
272         @return 現在の位置を返します。
273     */
GetPosition()274     virtual s64 GetPosition() const { return detail::FileBase::GetPosition(); }
275 
276     /*!
277         @brief ファイル先頭から数えた現在の読み出し位置を取得します。
278 
279         @param[out] pOut 現在の位置が格納されます。
280 
281         @return 処理の結果を返します。
282     */
TryGetPosition(s64 * pOut)283     virtual Result TryGetPosition(s64* pOut) const { return detail::FileBase::TryGetPosition(pOut); }
284 
285     /*!
286         @brief ファイル先頭から数えた現在の読み出し位置を設定します。
287 
288                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
289                基本的に @ref TrySetPosition を使うようにしてください。
290 
291         @param[in] position 読み出し位置を指定します。
292     */
SetPosition(s64 position)293     virtual void SetPosition(s64 position) { detail::FileBase::SetPosition(position); }
294 
295     /*!
296         @brief ファイル先頭から数えた現在の読み出し位置を設定します。
297 
298         @param[in] position 読み出し位置を指定します。
299 
300         @return 処理の結果を返します。
301     */
TrySetPosition(s64 position)302     virtual Result TrySetPosition(s64 position) { return detail::FileBase::TrySetPosition(position); }
303 
304     /*!
305         @brief ファイルサイズを取得します。
306 
307                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
308                基本的に @ref TryGetSize を使うようにしてください。
309 
310         @return ファイルサイズを返します。
311     */
GetSize()312     virtual s64 GetSize() const { return detail::FileBase::GetSize(); }
313 
314     /*!
315         @brief ファイルサイズを取得します。
316 
317         @param[out] pOut ファイルサイズが格納されます。
318 
319         @return 処理の結果を返します。
320     */
TryGetSize(s64 * pOut)321     virtual Result TryGetSize(s64* pOut) const { return detail::FileBase::TryGetSize(pOut); }
322 
323     /*!
324         @brief ファイルサイズを設定します。
325 
326                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
327                基本的に @ref TrySetSize を使うようにしてください。
328 
329         @param[in] size ファイルサイズを指定します。
330      */
SetSize(s64 size)331     virtual void SetSize(s64 size) { detail::FileBase::SetSize(size); }
332 
333     /*!
334         @brief ファイルサイズを設定します。
335 
336         @param[in] size ファイルサイズを指定します。
337 
338         @return 処理の結果を返します。
339      */
TrySetSize(s64 size)340     virtual Result TrySetSize(s64 size) { return detail::FileBase::TrySetSize(size); }
341 
342     /*!
343         @brief ファイルキャッシュをデバイスに書き戻します。
344 
345                この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。
346                基本的に @ref TryFlush を使うようにしてください。
347 
348      */
Flush()349     virtual void Flush() { detail::FileBase::Flush(); }
350 
351     /*!
352         @brief ファイルキャッシュをデバイスに書き戻します。
353 
354         @return 処理の結果を返します。
355      */
TryFlush()356     virtual Result TryFlush() { return detail::FileBase::TryFlush(); }
357 };
358 
359 }}
360 
361 #endif
362