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