/*---------------------------------------------------------------------------* Project: NintendoWare File: io_IOStream.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 18106 $ *---------------------------------------------------------------------------*/ #ifndef NW_IO_IO_STREAM_H_ #define NW_IO_IO_STREAM_H_ #include namespace nw { namespace io { //--------------------------------------------------------------------------- //! @brief ファイルストリーム基底クラスです。 //--------------------------------------------------------------------------- class IOStream { //------ publicメンバ -------------------------- public: NW_UT_RUNTIME_TYPEINFO; // ダウンキャスト用の実行時型情報を埋め込みます //--------------------------------------------------------------------------- //! @brief 非同期処理の完了後に呼び出されるコールバック関数です。 //--------------------------------------------------------------------------- typedef void (*IOStreamCallback)(s32 result, IOStream* stream, void* arg); //! @name コンストラクタ/デストラクタ //@{ //--------------------------------------------------------------------------- //! @brief デストラクタです。 //--------------------------------------------------------------------------- virtual ~IOStream() {} //@} //! @name ファイルストリームの属性情報を取得 //@{ //--------------------------------------------------------------------------- //! @brief このストリームが読み込み可能であるかどうかを取得します。 //! //! @return このストリームが読み込み可能である場合には true を、 //! 読み込みができない場合には false を返します。 //--------------------------------------------------------------------------- virtual bool CanRead() const = 0; //--------------------------------------------------------------------------- //! @brief このストリームが書き込み可能であるかどうかを取得します。 //! //! @return このストリームが書き込み可能である場合には true を、 //! 書き込みできない場合には false を返します。 //--------------------------------------------------------------------------- virtual bool CanWrite() const = 0; //--------------------------------------------------------------------------- //! @brief このストリームが非同期処理が可能かどうかを取得します。 //! //! @return このストリームの非同期処理が可能である場合には true を、 //! 非同期処理が不可能である場合には false を返します。 //--------------------------------------------------------------------------- virtual bool CanAsync() const = 0; //--------------------------------------------------------------------------- //! @brief ファイルのリード / ライトを行う際のファイルポインタの //! オフセット位置として必要なアライメント値を取得します。 //! //! @return ファイルのリード / ライトを行う際のファイルポインタの //! オフセット位置として必要なアライメント値を返します。@n //! アライメントが必要ない場合には 1 が返されます。 //--------------------------------------------------------------------------- virtual u32 GetOffsetAlign() const { return 1; } //--------------------------------------------------------------------------- //! @brief ファイルのリード / ライトの際に一度に読み書きするサイズとして //! 必要なアライメント値を取得します。 //! //! @return ファイルのリード / ライトの際に一度に読み書きするサイズとして //! 必要なアライメント値を返します。@n //! アライメントが必要ない場合には 1 が返されます。 //--------------------------------------------------------------------------- virtual u32 GetSizeAlign () const { return 1; } //--------------------------------------------------------------------------- //! @brief リード / ライトの際に送受信用のバッファアドレスとして //! 必要なアライメント値を取得する関数です。 //! //! @return リード / ライトの際に送受信用のバッファアドレスとして //! 必要なアライメント値を返します。@n //! アライメントの必要がない場合には 1 が返されます。 //--------------------------------------------------------------------------- virtual u32 GetBufferAlign() const { return 1; } //@} //! @name ファイルストリームの操作 //@{ //--------------------------------------------------------------------------- //! @brief ストリームからデータを読み込みます(同期処理)。 //! //! @param[out] buf 読み込むデータを格納するバッファへのポインタ。 //! GetBufferAlign() 関数で取得されるアライメントに //! 合っている必要があります。 //! @param[in] length 読み込むデータサイズ。 //! GetSizeAlign() 関数で取得されるアライメントに //! 合っている必要があります。 //! //! @return 成功すれば、実際に読み込んだバイト数が返ります。@n //! @n //! 読み込み中にエラーが発生した場合には負の値のエラーコードが //! 返ります。@n //! 返されるエラーコードの詳細に関しては具象クラスの説明を //! ご参照ください。 //--------------------------------------------------------------------------- virtual s32 Read( void* buf, u32 length ); //--------------------------------------------------------------------------- //! @brief ストリームからデータを読み込みます(非同期処理)。 //! //! @param[out] buf 読み込むデータを格納するバッファへのポインタ。 //! GetBufferAlign() 関数で取得されるアライメントに //! 合っている必要があります。 //! @param[in] length 読み込むデータサイズ。 //! GetSizeAlign() 関数で取得される //! アライメントに合っている必要があります。 //! @param[in] callback 非同期処理完了時のコールバック関数を登録します。 //! NULL の場合にはコールバックは発生しません。 //! @param[in] arg 非同期処理完了時のコールバック関数で引数として返される //! パラメータを登録します。 //! //! @return コマンドが正常に発行された場合には true を返します。@n //! 発行されなかった場合には false を返します。@n //! コマンドが発行されなかった場合にはコールバックは発生しません。 //--------------------------------------------------------------------------- virtual bool ReadAsync( void* buf, u32 length, IOStreamCallback callback, void* arg ); //--------------------------------------------------------------------------- //! @brief ストリームにデータを書き込みます(同期処理)。 //! //! @param[in] buf 書き込むデータが格納されているバッファへのポインタ。 //! GetBufferAlign() 関数で取得されるアライメントに //! 合っている必要があります。 //! @param[in] length 書き込むデータサイズ。 //! GetSizeAlign() 関数で //! 取得されるアライメントに合っている必要があります。 //! //! @return 書き込みに成功すれば、実際に書き込まれたバイト数が返ります。@n //! @n //! 書き込み中にエラーが発生した場合には負の値のエラーコードが //! 返ります。@n //! 返されるエラーコードの詳細に関しては具象クラスの説明を //! ご参照ください。 //--------------------------------------------------------------------------- virtual s32 Write( const void* buf, u32 length ); //--------------------------------------------------------------------------- //! @brief ストリームにデータを書き込みます(非同期処理)。 //! //! @param[in] buf 書き込むデータが格納されているバッファへのポインタ。 //! GetBufferAlign() 関数で取得されるアライメントに //! 合っている必要があります。 //! @param[in] length 書き込むデータサイズ。 //! GetSizeAlign() 関数で //! 取得されるアライメントに合っている必要があります。 //! @param[in] callback 非同期処理完了時のコールバック関数を登録します。 //! NULL の場合にはコールバックは発生しません。 //! //! @param[in] arg 非同期処理完了時のコールバック関数で引数として //! 返されるパラメータを登録します。 //! //! @return コマンドが正常に発行された場合には true を返します。@n //! 発行されなかった場合には false を返します。@n //! コマンドが発行されなかった場合にはコールバックは発生しません。 //--------------------------------------------------------------------------- virtual bool WriteAsync( const void* buf, u32 length, IOStreamCallback callback, void* arg ); //--------------------------------------------------------------------------- //! @brief 非同期処理の完了を待ちます。 //! //! @return 最後に実行された非同期処理の結果を返します。 //--------------------------------------------------------------------------- s32 WaitAsync() const; //--------------------------------------------------------------------------- //! @brief 非同期処理中であるかどうかを確認します。 //! //! @return 非同期処理中の場合には true を返します。@n //! 非同期処理中でない場合には false を返します。 //--------------------------------------------------------------------------- virtual bool IsBusy() const; //@} //! @name ファイルのクローズ/状態取得 //@{ //--------------------------------------------------------------------------- //! @brief ストリームをクローズします。 //--------------------------------------------------------------------------- virtual void Close() = 0; //--------------------------------------------------------------------------- //! @brief このストリームが現在使用可能な状態であるかどうかを示す値を //! 取得します。 //! //! @return このストリームが現在使用可能な状態であれば true を返します。 //! ファイルがオープンされていない等の理由で使用不能であった場合には //! false を返します。 //--------------------------------------------------------------------------- bool IsAvailable() const { return mAvailable; } //@} //------ protectedメンバ -------------------------- protected: //! @name コンストラクタ/デストラクタ //@{ //--------------------------------------------------------------------------- //! @brief コンストラクタです。 //--------------------------------------------------------------------------- IOStream() : mAvailable( false ), mCallback ( NULL ), mArg ( NULL ) {} //@} bool mAvailable; // 利用可能フラグ s32 mAsyncResult; // 非同期処理の結果格納 IOStreamCallback mCallback; // 非同期処理コールバック void* mArg; // コールバック引数 }; } /* namespace io */ } /* namespace nw */ /* NW_IO_IO_STREAM_H_ */ #endif