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