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