1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     fs_FileOutputStream.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: 19028 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FS_FS_FILEOUTPUTSTREAM_H_
17 #define NN_FS_FS_FILEOUTPUTSTREAM_H_
18 
19 #include <nn/fs/fs_IOutputStream.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 FileOutputStream : public IOutputStream, public detail::FileBase, private nn::util::NonCopyable<FileOutputStream>
33 {
34 public:
35 
36     /*!
37         @brief コンストラクタです。
38 
39                引数の無いオーバロードでは、ファイルは開きません。ファイルを操作するためには、別途 @ref Initialize を呼ぶ必要があります。
40 
41                パス名を指定したオーバロードでは、指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
42 
43     */
FileOutputStream()44     FileOutputStream() {}
45 
46     /*!
47         @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。
48 
49                指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
50                createIfNotExist 引数に true を指定しておくと、指定されたパスにファイル
51                が存在しない場合に、ファイルを作成してから書き込み専用で開きます。
52 
53         @param[in] pathName 開くファイルのパス
54         @param[in] createIfNotExist 指定されたパスにファイルが存在しない場合にファイルを作成するかを指定
55     */
FileOutputStream(const wchar_t * pathName,bool createIfNotExist)56     FileOutputStream(const wchar_t* pathName, bool createIfNotExist) :
57         detail::FileBase(pathName, OPEN_MODE_WRITE | (createIfNotExist ? OPEN_MODE_CREATE : 0)) {}
58 
59     /*!
60         @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。
61 
62                指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
63                createIfNotExist 引数に true を指定しておくと、指定されたパスにファイル
64                が存在しない場合に、ファイルを作成してから書き込み専用で開きます。
65                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
66                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
67 
68         @param[in] pathName 開くファイルのパス
69     */
FileOutputStream(const char * pathName,bool createIfNotExist)70     FileOutputStream(const char* pathName, bool createIfNotExist) :
71         detail::FileBase(pathName, OPEN_MODE_WRITE | (createIfNotExist ? OPEN_MODE_CREATE : 0)) {}
72 
73     /*!
74         @brief 指定されたファイルを開きます。
75 
76                指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
77                createIfNotExist 引数に true を指定しておくと、指定されたパスにファイル
78                が存在しない場合に、ファイルを作成してから書き込み専用で開きます。
79                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
80 
81         @param[in] pathName 開くファイルのパス
82     */
Initialize(const wchar_t * pathName,bool createIfNotExist)83     void Initialize(const wchar_t* pathName, bool createIfNotExist)
84     { detail::FileBase::Initialize(pathName,  OPEN_MODE_WRITE | (createIfNotExist ? OPEN_MODE_CREATE : 0)); }
85 
86     /*!
87         @brief 指定されたファイルを開きます。
88 
89                指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
90                createIfNotExist 引数に true を指定しておくと、指定されたパスにファイル
91                が存在しない場合に、ファイルを作成してから書き込み専用で開きます。
92                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
93                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
94                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
95 
96         @param[in] pathName 開くファイルのパス
97     */
Initialize(const char * pathName,bool createIfNotExist)98     void Initialize(const char* pathName, bool createIfNotExist)
99     { detail::FileBase::Initialize(pathName,  OPEN_MODE_WRITE | (createIfNotExist ? OPEN_MODE_CREATE : 0)); }
100 
101     /*!
102         @brief 指定されたファイルを開きます。
103 
104                指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
105                createIfNotExist 引数に true を指定しておくと、指定されたパスにファイル
106                が存在しない場合に、ファイルを作成してから書き込み専用で開きます。
107                ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。
108                既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。
109 
110         @param[in] pathName 開くファイルのパス
111     */
TryInitialize(const wchar_t * pathName,bool createIfNotExist)112     nn::Result TryInitialize(const wchar_t* pathName, bool createIfNotExist)
113     { return detail::FileBase::TryInitialize(pathName,  OPEN_MODE_WRITE | (createIfNotExist ? OPEN_MODE_CREATE : 0)); }
114 
115     /*!
116         @brief 指定されたファイルを開きます。
117 
118                指定されたパスのファイルを書き込み専用で開き、書き込める状態にします。
119                createIfNotExist 引数に true を指定しておくと、指定されたパスにファイル
120                が存在しない場合に、ファイルを作成してから書き込み専用で開きます。
121                ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。
122                この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、
123                大きくスタック上にバッファを取るので、スタックの大きさには注意してください。
124 
125         @param[in] pathName 開くファイルのパス
126     */
TryInitialize(const char * pathName,bool createIfNotExist)127     nn::Result TryInitialize(const char* pathName, bool createIfNotExist)
128     { return detail::FileBase::TryInitialize(pathName,  OPEN_MODE_WRITE | (createIfNotExist ? OPEN_MODE_CREATE : 0)); }
129     /*!
130         @brief ファイルを閉じます。
131 
132                ファイルを閉じます。ファイルが開かれていなかった場合は何もしません。
133     */
Finalize()134     void Finalize() { detail::FileBase::Finalize(); }
135 
136     /*!
137         @brief デストラクタです。
138 
139                ファイルが開かれていればファイルを閉じます。
140     */
~FileOutputStream()141     virtual ~FileOutputStream() {}
142 
143     /*!
144         @brief バッファから指定サイズをファイルに読み込みます。
145 
146                buffer で指定されたアドレスの領域にから、
147                最大 size バイトをファイルに書き込みます。
148                実際に書き込んだバイト数を返します。
149 
150                ファイルの終端に達したときは、0 を返します。
151 
152          @param[in] buffer 書き込むデータが含まれているバッファへのポインタ
153          @param[in] size ファイルに書き込む最大バイト数
154 
155          @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。
156     */
Write(const void * buffer,size_t size)157     virtual s32 Write(const void* buffer, size_t size) { return detail::FileBase::Write(buffer, size); }
158 
159     /*!
160         @brief バッファから指定サイズをファイルに読み込みます。
161 
162                buffer で指定されたアドレスの領域にから、
163                最大 size バイトをファイルに書き込みます。
164                実際に書き込んだバイト数を返します。
165 
166                ファイルの終端に達したときは、0 を返します。
167 
168          @param[out] pOut 実際にコピーしたバイト数が格納されます。ファイルの終端に達したときは 0 が格納されます。
169          @param[in] buffer 書き込むデータが含まれているバッファへのポインタ
170          @param[in] size ファイルに書き込む最大バイト数
171 
172          @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。
173     */
TryWrite(s32 * pOut,const void * buffer,size_t size)174     virtual Result TryWrite(s32* pOut, const void* buffer, size_t size) { return detail::FileBase::TryWrite(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         @param[in] position 読み出し位置を指定します。
218     */
SetPosition(s64 position)219     virtual void SetPosition(s64 position) { detail::FileBase::SetPosition(position); }
220 
221     /*!
222         @brief ファイル先頭から数えた現在の読み出し位置を設定します。
223 
224         @param[in] position 読み出し位置を指定します。
225 
226         @return 処理の結果を返します。
227     */
TrySetPosition(s64 position)228     virtual Result TrySetPosition(s64 position) { return detail::FileBase::TrySetPosition(position); }
229 
230     /*!
231         @brief ファイルサイズを取得します。
232 
233         @return ファイルサイズを返します。
234     */
GetSize()235     virtual s64 GetSize() const { return detail::FileBase::GetSize(); }
236 
237     /*!
238         @brief ファイルサイズを取得します。
239 
240         @param[out] pOut ファイルサイズが格納されます。
241 
242         @return 処理の結果を返します。
243     */
TryGetSize(s64 * pOut)244     virtual Result TryGetSize(s64* pOut) const { return detail::FileBase::TryGetSize(pOut); }
245 
246     /*!
247         @brief ファイルサイズを設定します。
248 
249         @param[in] size ファイルサイズを指定します。
250      */
SetSize(s64 size)251     virtual void SetSize(s64 size) { detail::FileBase::SetSize(size); }
252 
253     /*!
254         @brief ファイルサイズを設定します。
255 
256         @param[in] size ファイルサイズを指定します。
257 
258         @return 処理の結果を返します。
259      */
TrySetSize(s64 size)260     virtual Result TrySetSize(s64 size) { return detail::FileBase::TrySetSize(size); }
261 };
262 
263 }}
264 
265 #endif
266