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