1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     hio_HostFile.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  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   $Rev: 27284 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_HIO_CTR_HIO_HOSTFILE_H_
17 #define NN_HIO_CTR_HIO_HOSTFILE_H_
18 #ifdef  NN_SWITCH_ENABLE_HOST_IO
19 
20 /*! @file
21     @brief      HostFile クラスを定義します。
22 
23     :include nn/hio.h
24 
25 */
26 
27 #include <nn/types.h>
28 
29 namespace nn {
30 namespace hio {
31 namespace CTR {
32 
33     class HostSystemChannel;
34 
35 
36     /*!
37     @brief  ホストファイルシステムのファイルを表すクラスです。
38             ファイルに対する読み書きの機能を提供します。
39     */
40     class HostFile
41     {
42     public:
43         /*!
44         @brief  ファイルシーク時の起点となる位置を示す定数群です。
45 
46         */
47         enum SeekType
48         {
49             SEEK_TYPE_SET,          //!< ファイルの先頭を基準としてファイルのカレント位置を設定することを示す定数です。
50             SEEK_TYPE_CURRENT,      //!< ファイルのカレント位置を基準としてファイルのカレント位置を設定することを示す定数です。
51             SEEK_TYPE_END           //!< ファイルの末尾を基準としてファイルのカレント位置を設定することを示す定数です。
52         };
53 
54         /*!
55         @brief  ファイルへのアクセスモードを示す定数群です。
56 
57         */
58         enum AccessMode
59         {
60             ACCESS_MODE_READ        = (1u << 31),                           //!< 読み込みでのアクセスを示します。
61             ACCESS_MODE_WRITE       = (1u << 30),                           //!< 書き込みでのアクセスを示します。
62             ACCESS_MODE_READ_WRITE  = (ACCESS_MODE_READ|ACCESS_MODE_WRITE)  //!< 読み書きでのアクセスを示します。
63         };
64 
65 
66         /*!
67         @brief  ファイル開く時の挙動を示す定数群群です。
68 
69         */
70         enum OpenDisp
71         {
72             OPEN_DISP_CREATE_NEW        = 1,    //!< 新しくファイルを作ります。
73             OPEN_DISP_CREATE_ALWAYS     = 2,    //!< 常に新しくファイルを作ります。
74             OPEN_DISP_OPEN_EXISTING     = 3,    //!< 既存のファイルを開きます。
75             OPEN_DISP_OPEN_ALWAYS       = 4     //!< 常にファイルを開きます。
76         };
77 
78     private:
79         int                 m_Fd;
80 
81     public:
82         /*!
83           @brief        コンストラクタです。別途 @ref Open() を呼び出して、操作対象のファイルを開く必要があります。
84 
85         */
HostFile()86         HostFile() : m_Fd(-1) {}
87 
88         /*!
89           @brief        デストラクタです。ファイルがオープンされている場合はクローズします。
90 
91         */
~HostFile()92         ~HostFile()
93         {
94             if( m_Fd >= 0 )
95             {
96                 Close();
97             }
98         }
99 
100 
101         /*!
102           :overload     nounicode
103 
104           @brief        指定されたファイルを開きます。
105 
106           @param[in]    path       オープンするファイルのパスを指定します。
107           @param[in]    accessMode ファイルのアクセスモードを指定します。
108           @param[in]    disp       オープン時の挙動を指定します。
109           @return                  処理の結果を返します。
110 
111         */
112         Result Open(const char* path, bit32 accessMode, OpenDisp disp);
113 
114         /*!
115           :overload     unicode
116 
117           @brief        指定されたファイルを開きます。
118 
119           @param[in]    path       オープンするファイルのパスを指定します。
120           @param[in]    accessMode ファイルのアクセスモードを指定します。
121           @param[in]    disp       オープン時の挙動を指定します。
122           @return                  処理の結果を返します。
123 
124         */
125         Result Open(const wchar_t* path, bit32 accessMode, OpenDisp disp);
126 
127         /*!
128           @brief        ファイルを閉じます。
129 
130           @return       処理の結果を返します。
131 
132         */
133         Result Close();
134 
135         /*!
136           :overload     withresult
137 
138           @brief        ファイルから指定サイズをバッファに読み込み、処理の結果を返します。
139 
140           @param[out]   pRead   実際にコピーしたバイト数が格納されます。ファイルの終端に達した時は 0 が格納されます。
141           @param[in]    buf     読み込み先バッファへのポインタ。
142           @param[in]    size    読み込みを行う最大バイト数。
143           @return               処理の結果を返します。
144 
145         */
146         Result Read(size_t* pRead, void* buf, size_t size);
147 
148         /*!
149           :overload     noresult
150 
151           @brief        ファイルから指定サイズをバッファに読み込み、実際に読み込んだバイト数を返します。
152 
153           @param[in]    buf     読み込み先バッファへのポインタ。
154           @param[in]    size    読み込みを行う最大バイト数。
155           @return               実際にコピーしたバイト数。何らかのエラーが発生した場合は -1 を返します。
156 
157         */
Read(void * buf,size_t size)158         s32 Read(void* buf, size_t size)
159         {
160             size_t read;
161             return Read(&read, buf, size).IsFailure() ? -1: static_cast<s32>(read);
162         }
163 
164         /*!
165           :overload     withresult
166 
167           @brief        バッファから指定サイズをファイルに書き込みます。
168 
169           @param[out]   pWritten    実際に書き込んだバイト数が格納されます。ファイルの終端に達した時は ?
170           @param[in]    buf         書き込み元バッファへのポインタ。
171           @param[in]    size        書き込みを行う最大バイト数。
172           @return                   処理の結果を返します。
173 
174         */
175         Result Write(size_t* pWritten, const void* buf, size_t size);
176 
177         /*!
178           :overload     noresult
179 
180           @brief        バッファから指定サイズをファイルに書き込み、実際に書き込んだバイト数を返します。
181 
182           @param[in]    buf     書き込み元バッファへのポインタ。
183           @param[in]    size    書き込みを行う最大バイト数。
184           @return               実際に書き込んだバイト数。何らかのエラーが発生した場合は -1 を返します。
185 
186         */
Write(const void * buf,size_t size)187         s32 Write(const void* buf, size_t size)
188         {
189             size_t written;
190             return Write(&written, buf, size).IsFailure() ? -1: static_cast<s32>(written);
191         }
192 
193         /*!
194           :overload     withresult
195 
196           @brief        読み書きの開始位置を変更します。
197 
198           @param[out]   pPosition   変更後のファイルの先頭からの位置が格納されます。
199           @param[in]    offset      基準となる位置からの相対位置を指定します。
200           @param[in]    type        基準となる位置を指定します。
201           @return                   処理の結果を返します。
202 
203         */
204         Result Seek(s64* pPosition, s64 offset, SeekType type);
205 
206         /*!
207           :overload     noresult
208 
209           @brief        読み書きの開始位置を変更し、変更後のファイルの先頭からの位置を返します。
210 
211           @param[in]    offset      基準となる位置からの相対位置を指定します。
212           @param[in]    type        基準となる位置を指定します。
213           @return                   変更後のファイルの先頭からの位置。何らかのエラーが発生した場合は -1 を返します。
214 
215         */
Seek(s64 offset,SeekType type)216         s64 Seek(s64 offset, SeekType type)
217         {
218             s64 pos;
219             return Seek(&pos, offset, type).IsFailure() ? -1: pos;
220         }
221 
222         /*!
223           @brief        ファイルのサイズを変更します。
224 
225           @param[in]    size        ファイルのサイズを指定します。
226           @return                   処理の結果を返します。
227 
228         */
229         Result SetSize(s64 size);
230 
231         /*!
232           @brief        ファイルの有無を確認します。
233 
234           @param[out]   exist       有無を返します。
235           @param[in]    path        確認するファイルのパスを指定します。
236           @return                   処理の結果を返します。
237 
238         */
239         Result IsExist(bool *exist, const char* path);
240 
241         /*!
242           @brief        ファイルの有無を確認します。
243 
244           @param[out]   exist       有無を返します。
245           @param[in]    path        確認するファイルのパスを指定します。
246           @return                   処理の結果を返します。
247 
248         */
249         Result IsExist(bool *exist, const wchar_t* path);
250     };
251 
252 }
253 }
254 }
255 
256 
257 #endif  // ifdef NN_SWITCH_ENABLE_HOST_IO
258 #endif  // ifndef NN_HIO_CTR_HIO_HOSTFILE_H_
259