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: 25190 $
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     @brief ファイルを読み書きするためのクラスです。
27 
28            パス名で指定されたファイルを開き、データを読み書きできます。
29            パス名の指定には、ワイド文字列とマルチバイト文字列の両方が使えますが、
30            特別な理由が無い限りは、ワイド文字列を使うようにしてください。
31 */
32 class FileStream : public IStream, public detail::FileBase, private nn::util::NonCopyable<FileStream>
33 {
34 public:
35 
36     /*!
37         @brief コンストラクタです。
38 
39                引数の無いオーバロードでは、ファイルは開きません。ファイルを操作するためには、別途 @ref Initialize を呼ぶ必要があります。
40 
41                ファイルを開く際の openMode 引数には、OPEN_MODE_READ (読み込みモードで開く),
42                OPEN_MODE_WRITE (書き込みモードで開く), OPEN_MODE_CREATE (ファイルが無ければファイル作成する) のビット和を指定することができます。
43                OPEN_MODE_CREATE を指定する際には、OPEN_MODE_WRITE の指定も必要となります。
44 
45     */
FileStream()46     FileStream() {}
47 
48     /*!
49         @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。
50 
51                指定されたパスのファイルを指定された OpenMode で開きます。
52 
53         @param[in] pathName 開くファイルのパス
54         @param[in] openMode ファイルを開くモード
55     */
FileStream(const wchar_t * pathName,bit32 openMode)56     FileStream(const wchar_t* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {}
57 
58     /*!
59         @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。
60 
61                指定されたパスのファイルを指定された OpenMode で開きます。
62                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
63                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
64 
65         @param[in] pathName 開くファイルのパス
66         @param[in] openMode ファイルを開くモード
67     */
FileStream(const char * pathName,bit32 openMode)68     FileStream(const char* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {}
69 
70     /*!
71         @brief 指定されたファイルを開きます。
72 
73                指定されたパスのファイルを指定された OpenMode で開きます。
74                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
75                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
76 
77                openMode 引数の詳細については、@ref FileStream::FileStream を参照してください。
78 
79         @param[in] pathName 開くファイルのパス
80         @param[in] openMode ファイルを開くモード
81     */
Initialize(const wchar_t * pathName,bit32 openMode)82     void Initialize(const wchar_t* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); }
83 
84     /*!
85         @brief 指定されたファイルを開きます。
86 
87                指定されたパスのファイルを指定された OpenMode で開きます。
88                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
89                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
90                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
91                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
92 
93         @param[in] pathName 開くファイルのパス
94         @param[in] openMode ファイルを開くモード
95     */
Initialize(const char * pathName,bit32 openMode)96     void Initialize(const char* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); }
97 
98     /*!
99         @brief 指定されたファイルを開きます。
100 
101                指定されたパスのファイルを指定された OpenMode で開きます。
102                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
103                ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。
104                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
105 
106                openMode 引数の詳細については、@ref FileStream::FileStream を参照してください。
107 
108         @param[in] pathName 開くファイルのパス
109         @param[in] openMode ファイルを開くモード
110     */
TryInitialize(const wchar_t * pathName,bit32 openMode)111     nn::Result TryInitialize(const wchar_t* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); }
112 
113     /*!
114         @brief 指定されたファイルを開きます。
115 
116                指定されたパスのファイルを指定された OpenMode で開きます。
117                指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。
118                ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。
119                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
120                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
121 
122         @param[in] pathName 開くファイルのパス
123         @param[in] openMode ファイルを開くモード
124     */
TryInitialize(const char * pathName,bit32 openMode)125     nn::Result TryInitialize(const char* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); }
126 
127     /*!
128         @brief ファイルを閉じます。
129 
130                ファイルを閉じます。ファイルが開かれていなかった場合は何もしません。
131     */
Finalize()132     void Finalize() { detail::FileBase::Finalize(); }
133 
134     /*!
135         @brief デストラクタです。
136 
137                ファイルが開かれていればファイルを閉じます。
138     */
~FileStream()139     virtual ~FileStream() {}
140 
141     /*!
142         @brief ファイルから指定サイズをバッファに読み込みます。
143 
144                ファイルの現在位置から最大 size バイトデータを読み込み、
145                buffer で指定されたアドレスの領域にコピーします。
146                実際にコピーしたバイト数を返します。
147 
148                ファイルの終端に達したときは、0 を返します。
149 
150          @param[in] buffer コピー先のバッファへのポインタ
151          @param[in] size コピーする最大バイト数
152 
153          @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。
154     */
Read(void * buffer,size_t size)155     virtual s32 Read(void* buffer, size_t size) { return detail::FileBase::Read(buffer, size); }
156 
157     /*!
158         @brief ファイルから指定サイズをバッファに読み込みます。
159 
160                ファイルの現在位置から最大 size バイトデータを読み込み、
161                buffer で指定されたアドレスの領域にコピーします。
162                実際にコピーしたバイト数を返します。
163 
164                ファイルの終端に達したときは、0 を返します。
165 
166          @param[out] pOut 実際にコピーしたバイト数が格納されます。ファイルの終端に達したときは 0 が格納されます。
167          @param[in] buffer コピー先のバッファへのポインタ
168          @param[in] size コピーする最大バイト数
169 
170          @return 処理の結果を返します。
171     */
TryRead(s32 * pOut,void * buffer,size_t size)172     virtual Result TryRead(s32* pOut, void* buffer, size_t size) { return detail::FileBase::TryRead(pOut, buffer, size); }
173 
174     /*!
175         @brief バッファから指定サイズをファイルに読み込みます。
176 
177                buffer で指定されたアドレスの領域にから、
178                最大 size バイトをファイルに書き込みます。
179                実際に書き込んだバイト数を返します。
180 
181                ファイルの終端に達したときは、0 を返します。
182 
183          @param[in] buffer 書き込むデータが含まれているバッファへのポインタ
184          @param[in] size ファイルに書き込む最大バイト数
185 
186          @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。
187     */
Write(const void * buffer,size_t size)188     virtual s32 Write(const void* buffer, size_t size) { return detail::FileBase::Write(buffer, size); }
189 
190     /*!
191         @brief バッファから指定サイズをファイルに読み込みます。
192 
193                buffer で指定されたアドレスの領域にから、
194                最大 size バイトをファイルに書き込みます。
195                実際に書き込んだバイト数を返します。
196 
197                ファイルの終端に達したときは、0 を返します。
198 
199          @param[out] pOut 実際にコピーしたバイト数が格納されます。ファイルの終端に達したときは 0 が格納されます。
200          @param[in] buffer 書き込むデータが含まれているバッファへのポインタ
201          @param[in] size ファイルに書き込む最大バイト数
202 
203          @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。
204     */
TryWrite(s32 * pOut,const void * buffer,size_t size)205     virtual Result TryWrite(s32* pOut, const void* buffer, size_t size) { return detail::FileBase::TryWrite(pOut, buffer, size); }
206 
207     /*!
208         @brief ファイルの読み込み・書き込み位置を変更します。
209 
210                base で指定された位置から position 離れた場所に読み込み・書き込み位置を設定します。
211 
212         @param[in] base 読み込み・書き込み位置の変更する基準を指定します。
213         @param[in] position 読み込み・書き込み位置の変更する位置を指定します。
214     */
Seek(s64 position,PositionBase base)215     virtual void Seek(s64 position, PositionBase base) { detail::FileBase::Seek(position, base); }
216 
217     /*!
218         @brief ファイルの読み出し位置を変更します。
219 
220                base で指定された位置から position 離れた場所に読み出し位置を設定します。
221 
222         @param[in] base 読み出し位置の変更する基準を指定します。
223         @param[in] position 読み出し位置の変更する位置を指定します。
224 
225         @return 処理の結果を返します。
226     */
TrySeek(s64 position,PositionBase base)227     virtual Result TrySeek(s64 position, PositionBase base) { return detail::FileBase::TrySeek(position, base); }
228 
229     /*!
230         @brief ファイル先頭から数えた現在の読み出し位置を取得します。
231 
232         @return 現在の位置を返します。
233     */
GetPosition()234     virtual s64 GetPosition() const { return detail::FileBase::GetPosition(); }
235 
236     /*!
237         @brief ファイル先頭から数えた現在の読み出し位置を取得します。
238 
239         @param[out] pOut 現在の位置が格納されます。
240 
241         @return 処理の結果を返します。
242     */
TryGetPosition(s64 * pOut)243     virtual Result TryGetPosition(s64* pOut) const { return detail::FileBase::TryGetPosition(pOut); }
244 
245     /*!
246         @brief ファイル先頭から数えた現在の読み出し位置を設定します。
247 
248         @param[in] position 読み出し位置を指定します。
249     */
SetPosition(s64 position)250     virtual void SetPosition(s64 position) { detail::FileBase::SetPosition(position); }
251 
252     /*!
253         @brief ファイル先頭から数えた現在の読み出し位置を設定します。
254 
255         @param[in] position 読み出し位置を指定します。
256 
257         @return 処理の結果を返します。
258     */
TrySetPosition(s64 position)259     virtual Result TrySetPosition(s64 position) { return detail::FileBase::TrySetPosition(position); }
260 
261     /*!
262         @brief ファイルサイズを取得します。
263 
264         @return ファイルサイズを返します。
265     */
GetSize()266     virtual s64 GetSize() const { return detail::FileBase::GetSize(); }
267 
268     /*!
269         @brief ファイルサイズを取得します。
270 
271         @param[out] pOut ファイルサイズが格納されます。
272 
273         @return 処理の結果を返します。
274     */
TryGetSize(s64 * pOut)275     virtual Result TryGetSize(s64* pOut) const { return detail::FileBase::TryGetSize(pOut); }
276 
277     /*!
278         @brief ファイルサイズを設定します。
279 
280         @param[in] size ファイルサイズを指定します。
281      */
SetSize(s64 size)282     virtual void SetSize(s64 size) { detail::FileBase::SetSize(size); }
283 
284     /*!
285         @brief ファイルサイズを設定します。
286 
287         @param[in] size ファイルサイズを指定します。
288 
289         @return 処理の結果を返します。
290      */
TrySetSize(s64 size)291     virtual Result TrySetSize(s64 size) { return detail::FileBase::TrySetSize(size); }
292 };
293 
294 }}
295 
296 #endif
297