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