/*---------------------------------------------------------------------------* Project: Horizon File: hio_HostFile.h Copyright (C)2009 Nintendo Co., Ltd. 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. $Rev: 25329 $ *---------------------------------------------------------------------------*/ #ifndef NN_HIO_CTR_HIO_HOSTFILE_H_ #define NN_HIO_CTR_HIO_HOSTFILE_H_ #ifdef NN_SWITCH_ENABLE_HOST_IO /*! @file @brief HostFile クラスを定義します。 :include nn/hio.h */ #include namespace nn { namespace hio { namespace CTR { class HostSystemChannel; /*! @brief ホストファイルシステムのファイルを表すクラスです。 ファイルに対する読み書きの機能を提供します。 */ class HostFile { public: /*! @brief ファイルシーク時の起点となる位置を示す定数群です。 */ enum SeekType { SEEK_TYPE_SET, //!< ファイルの先頭を基準としてファイルのカレント位置を設定することを示す定数です。 SEEK_TYPE_CURRENT, //!< ファイルのカレント位置を基準としてファイルのカレント位置を設定することを示す定数です。 SEEK_TYPE_END //!< ファイルの末尾を基準としてファイルのカレント位置を設定することを示す定数です。 }; /*! @brief ファイルへのアクセスモードを示す定数群です。 */ enum AccessMode { ACCESS_MODE_READ = (1u << 31), //!< 読み込みでのアクセスを示します。 ACCESS_MODE_WRITE = (1u << 30), //!< 書き込みでのアクセスを示します。 ACCESS_MODE_READ_WRITE = (ACCESS_MODE_READ|ACCESS_MODE_WRITE) //!< 読み書きでのアクセスを示します。 }; /*! @brief ファイル開く時の挙動を示す定数群群です。 */ enum OpenDisp { OPEN_DISP_CREATE_NEW = 1, //!< 新しくファイルを作ります。 OPEN_DISP_CREATE_ALWAYS = 2, //!< 常に新しくファイルを作ります。 OPEN_DISP_OPEN_EXISTING = 3, //!< 既存のファイルを開きます。 OPEN_DISP_OPEN_ALWAYS = 4 //!< 常にファイルを開きます。 }; private: int m_Fd; public: /*! @brief コンストラクタです。別途 @ref Open() を呼び出して、操作対象のファイルを開く必要があります。 */ HostFile() : m_Fd(-1) {} /*! @brief デストラクタです。ファイルがオープンされている場合はクローズします。 */ ~HostFile() { if( m_Fd >= 0 ) { Close(); } } /*! :overload nounicode @brief 指定されたファイルを開きます。 @param[in] path オープンするファイルのパスを指定します。 @param[in] accessMode ファイルのアクセスモードを指定します。 @param[in] disp オープン時の挙動を指定します。 @return 処理の結果を返します。 */ Result Open(const char* path, bit32 accessMode, OpenDisp disp); /*! :overload unicode @brief 指定されたファイルを開きます。 @param[in] path オープンするファイルのパスを指定します。 @param[in] accessMode ファイルのアクセスモードを指定します。 @param[in] disp オープン時の挙動を指定します。 @return 処理の結果を返します。 */ Result Open(const wchar_t* path, bit32 accessMode, OpenDisp disp); /*! @brief ファイルを閉じます。 @return 処理の結果を返します。 */ Result Close(); /*! :overload withresult @brief ファイルから指定サイズをバッファに読み込み、処理の結果を返します。 @param[out] pRead 実際にコピーしたバイト数が格納されます。ファイルの終端に達した時は 0 が格納されます。 @param[in] buf 読み込み先バッファへのポインタ。 @param[in] size 読み込みを行う最大バイト数。 @return 処理の結果を返します。 */ Result Read(size_t* pRead, void* buf, size_t size); /*! :overload noresult @brief ファイルから指定サイズをバッファに読み込み、実際に読み込んだバイト数を返します。 @param[in] buf 読み込み先バッファへのポインタ。 @param[in] size 読み込みを行う最大バイト数。 @return 実際にコピーしたバイト数。何らかのエラーが発生した場合は -1 を返します。 */ s32 Read(void* buf, size_t size) { size_t read; return Read(&read, buf, size).IsFailure() ? -1: static_cast(read); } /*! :overload withresult @brief バッファから指定サイズをファイルに書き込みます。 @param[out] pWritten 実際に書き込んだバイト数が格納されます。ファイルの終端に達した時は ? @param[in] buf 書き込み元バッファへのポインタ。 @param[in] size 書き込みを行う最大バイト数。 @return 処理の結果を返します。 */ Result Write(size_t* pWritten, const void* buf, size_t size); /*! :overload noresult @brief バッファから指定サイズをファイルに書き込み、実際に書き込んだバイト数を返します。 @param[in] buf 書き込み元バッファへのポインタ。 @param[in] size 書き込みを行う最大バイト数。 @return 実際に書き込んだバイト数。何らかのエラーが発生した場合は -1 を返します。 */ s32 Write(const void* buf, size_t size) { size_t written; return Write(&written, buf, size).IsFailure() ? -1: static_cast(written); } /*! :overload withresult @brief 読み書きの開始位置を変更します。 @param[out] pPosition 変更後のファイルの先頭からの位置が格納されます。 @param[in] offset 基準となる位置からの相対位置を指定します。 @param[in] type 基準となる位置を指定します。 @return 処理の結果を返します。 */ Result Seek(s64* pPosition, s64 offset, SeekType type); /*! :overload noresult @brief 読み書きの開始位置を変更し、変更後のファイルの先頭からの位置を返します。 @param[in] offset 基準となる位置からの相対位置を指定します。 @param[in] type 基準となる位置を指定します。 @return 変更後のファイルの先頭からの位置。何らかのエラーが発生した場合は -1 を返します。 */ s64 Seek(s64 offset, SeekType type) { s64 pos; return Seek(&pos, offset, type).IsFailure() ? -1: pos; } /*! @brief ファイルのサイズを変更します。 @param[in] size ファイルのサイズを指定します。 @return 処理の結果を返します。 */ Result SetSize(s64 size); }; } } } #endif // ifdef NN_SWITCH_ENABLE_HOST_IO #endif // ifndef NN_HIO_CTR_HIO_HOSTFILE_H_