1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     io_IOStream.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31311 $
16  *---------------------------------------------------------------------------*/
17 
18 #ifndef NW_IO_IO_STREAM_H_
19 #define NW_IO_IO_STREAM_H_
20 
21 #include <nw/ut/ut_RuntimeTypeInfo.h>
22 
23 namespace nw   {
24 namespace io   {
25 
26 //---------------------------------------------------------------------------
27 //! @brief        ファイルストリーム基底クラスです。
28 //---------------------------------------------------------------------------
29 class IOStream
30 {
31 //------ publicメンバ --------------------------
32 public:
33     NW_UT_RUNTIME_TYPEINFO;      // ダウンキャスト用の実行時型情報を埋め込みます
34 
35     //---------------------------------------------------------------------------
36     //! @brief        非同期処理の完了後に呼び出されるコールバック関数です。
37     //---------------------------------------------------------------------------
38     typedef void (*IOStreamCallback)(s32 result, IOStream* stream, void* arg);
39 
40     //! @name コンストラクタ/デストラクタ
41     //@{
42 
43     //---------------------------------------------------------------------------
44     //! @brief    デストラクタです。
45     //---------------------------------------------------------------------------
~IOStream()46     virtual             ~IOStream() {}
47 
48     //@}
49 
50     //! @name ファイルストリームの属性情報を取得
51     //@{
52 
53     //---------------------------------------------------------------------------
54     //! @brief        このストリームが読み込み可能であるかどうかを取得します。
55     //!
56     //! @return       このストリームが読み込み可能である場合には true を、
57     //!               読み込みができない場合には false を返します。
58     //---------------------------------------------------------------------------
59     virtual bool        CanRead() const                             = 0;
60 
61     //---------------------------------------------------------------------------
62     //! @brief        このストリームが書き込み可能であるかどうかを取得します。
63     //!
64     //! @return       このストリームが書き込み可能である場合には true を、
65     //!               書き込みできない場合には false を返します。
66     //---------------------------------------------------------------------------
67     virtual bool        CanWrite() const                            = 0;
68 
69     //---------------------------------------------------------------------------
70     //! @brief        このストリームが非同期処理が可能かどうかを取得します。
71     //!
72     //! @return       このストリームの非同期処理が可能である場合には true を、
73     //!               非同期処理が不可能である場合には false を返します。
74     //---------------------------------------------------------------------------
75     virtual bool        CanAsync() const                            = 0;
76 
77     //---------------------------------------------------------------------------
78     //! @brief        ファイルのリード / ライトを行う際のファイルポインタの
79     //!               オフセット位置として必要なアライメント値を取得します。
80     //!
81     //! @return       ファイルのリード / ライトを行う際のファイルポインタの
82     //!               オフセット位置として必要なアライメント値を返します。@n
83     //!               アライメントが必要ない場合には 1 が返されます。
84     //---------------------------------------------------------------------------
GetOffsetAlign()85     virtual u32         GetOffsetAlign() const  { return 1; }
86 
87     //---------------------------------------------------------------------------
88     //! @brief        ファイルのリード / ライトの際に一度に読み書きするサイズとして
89     //!               必要なアライメント値を取得します。
90     //!
91     //! @return       ファイルのリード / ライトの際に一度に読み書きするサイズとして
92     //!               必要なアライメント値を返します。@n
93     //!               アライメントが必要ない場合には 1 が返されます。
94     //---------------------------------------------------------------------------
GetSizeAlign()95     virtual u32         GetSizeAlign  () const  { return 1; }
96 
97     //---------------------------------------------------------------------------
98     //! @brief        リード / ライトの際に送受信用のバッファアドレスとして
99     //!               必要なアライメント値を取得する関数です。
100     //!
101     //! @return       リード / ライトの際に送受信用のバッファアドレスとして
102     //!               必要なアライメント値を返します。@n
103     //!               アライメントの必要がない場合には 1 が返されます。
104     //---------------------------------------------------------------------------
GetBufferAlign()105     virtual u32         GetBufferAlign() const  { return 1; }
106 
107     //@}
108 
109     //! @name ファイルストリームの操作
110     //@{
111 
112     //---------------------------------------------------------------------------
113     //! @brief        ストリームからデータを読み込みます(同期処理)。
114     //!
115     //! @param[out]   buf    読み込むデータを格納するバッファへのポインタ。
116     //!                      GetBufferAlign() 関数で取得されるアライメントに
117     //!                      合っている必要があります。
118     //! @param[in]    length 読み込むデータサイズ。
119     //!                      GetSizeAlign() 関数で取得されるアライメントに
120     //!                      合っている必要があります。
121     //!
122     //! @return       成功すれば、実際に読み込んだバイト数が返ります。@n
123     //!               @n
124     //!               読み込み中にエラーが発生した場合には負の値のエラーコードが
125     //!               返ります。@n
126     //!               返されるエラーコードの詳細に関しては具象クラスの説明を
127     //!               ご参照ください。
128     //---------------------------------------------------------------------------
129     virtual s32         Read( void* buf, u32 length );
130 
131     //---------------------------------------------------------------------------
132     //! @brief        ストリームからデータを読み込みます(非同期処理)。
133     //!
134     //! @param[out]   buf      読み込むデータを格納するバッファへのポインタ。
135     //!                        GetBufferAlign() 関数で取得されるアライメントに
136     //!                        合っている必要があります。
137     //! @param[in]    length   読み込むデータサイズ。
138     //!                        GetSizeAlign() 関数で取得される
139     //!                        アライメントに合っている必要があります。
140     //! @param[in]    callback 非同期処理完了時のコールバック関数を登録します。
141     //!                        NULL の場合にはコールバックは発生しません。
142     //! @param[in]    arg      非同期処理完了時のコールバック関数で引数として返される
143     //!                        パラメータを登録します。
144     //!
145     //! @return       コマンドが正常に発行された場合には true を返します。@n
146     //!               発行されなかった場合には false を返します。@n
147     //!               コマンドが発行されなかった場合にはコールバックは発生しません。
148     //---------------------------------------------------------------------------
149     virtual bool        ReadAsync(
150                             void*               buf,
151                             u32                 length,
152                             IOStreamCallback    callback,
153                             void*               arg );
154 
155     //---------------------------------------------------------------------------
156     //! @brief        ストリームにデータを書き込みます(同期処理)。
157     //!
158     //! @param[in]    buf    書き込むデータが格納されているバッファへのポインタ。
159     //!                      GetBufferAlign() 関数で取得されるアライメントに
160     //!                      合っている必要があります。
161     //! @param[in]    length 書き込むデータサイズ。
162     //!                      GetSizeAlign() 関数で
163     //!                      取得されるアライメントに合っている必要があります。
164     //!
165     //! @return       書き込みに成功すれば、実際に書き込まれたバイト数が返ります。@n
166     //!               @n
167     //!               書き込み中にエラーが発生した場合には負の値のエラーコードが
168     //!               返ります。@n
169     //!               返されるエラーコードの詳細に関しては具象クラスの説明を
170     //!               ご参照ください。
171     //---------------------------------------------------------------------------
172     virtual s32         Write( const void* buf, u32 length );
173 
174     //---------------------------------------------------------------------------
175     //! @brief        ストリームにデータを書き込みます(非同期処理)。
176     //!
177     //! @param[in]    buf      書き込むデータが格納されているバッファへのポインタ。
178     //!                        GetBufferAlign() 関数で取得されるアライメントに
179     //!                        合っている必要があります。
180     //! @param[in]    length   書き込むデータサイズ。
181     //!                        GetSizeAlign() 関数で
182     //!                        取得されるアライメントに合っている必要があります。
183     //! @param[in]    callback 非同期処理完了時のコールバック関数を登録します。
184     //!                        NULL の場合にはコールバックは発生しません。
185     //!
186     //! @param[in]    arg      非同期処理完了時のコールバック関数で引数として
187     //!                        返されるパラメータを登録します。
188     //!
189     //! @return       コマンドが正常に発行された場合には true を返します。@n
190     //!               発行されなかった場合には false を返します。@n
191     //!               コマンドが発行されなかった場合にはコールバックは発生しません。
192     //---------------------------------------------------------------------------
193     virtual bool        WriteAsync(
194                             const void*         buf,
195                             u32                 length,
196                             IOStreamCallback    callback,
197                             void*               arg );
198 
199     //---------------------------------------------------------------------------
200     //! @brief        非同期処理の完了を待ちます。
201     //!
202     //! @return       最後に実行された非同期処理の結果を返します。
203     //---------------------------------------------------------------------------
204     s32                 WaitAsync() const;
205 
206     //---------------------------------------------------------------------------
207     //! @brief        非同期処理中であるかどうかを確認します。
208     //!
209     //! @return       非同期処理中の場合には true を返します。@n
210     //!               非同期処理中でない場合には false を返します。
211     //---------------------------------------------------------------------------
212     virtual bool        IsBusy() const;
213 
214     //@}
215 
216     //! @name ファイルのクローズ/状態取得
217     //@{
218 
219     //---------------------------------------------------------------------------
220     //! @brief        ストリームをクローズします。
221     //---------------------------------------------------------------------------
222     virtual void        Close()                                     = 0;
223 
224     //---------------------------------------------------------------------------
225     //! @brief        このストリームが現在使用可能な状態であるかどうかを示す値を
226     //!               取得します。
227     //!
228     //! @return       このストリームが現在使用可能な状態であれば true を返します。
229     //!               ファイルがオープンされていない等の理由で使用不能であった場合には
230     //!               false を返します。
231     //---------------------------------------------------------------------------
IsAvailable()232     bool                IsAvailable() const     { return mAvailable; }
233 
234     //@}
235 
236 //------ protectedメンバ --------------------------
237 protected:
238 
239     //! @name コンストラクタ/デストラクタ
240     //@{
241 
242     //---------------------------------------------------------------------------
243     //! @brief    コンストラクタです。
244     //---------------------------------------------------------------------------
IOStream()245                         IOStream()
246                           : mAvailable( false ),
247                             mCallback ( NULL  ),
248                             mArg      ( NULL  )
249                         {}
250 
251     //@}
252 
253     bool                mAvailable;     // 利用可能フラグ
254 
255     s32                 mAsyncResult;   // 非同期処理の結果格納
256     IOStreamCallback    mCallback;      // 非同期処理コールバック
257     void*               mArg;           // コールバック引数
258 };
259 
260 }   /* namespace io     */
261 }   /* namespace nw   */
262 
263 
264 
265 /* NW_IO_IO_STREAM_H_ */
266 #endif
267