1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - FS - libraries
3   File:     types.h
4 
5   Copyright 2007-2008 Nintendo. 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   $Date:: 2008-12-08#$
14   $Rev: 9544 $
15   $Author: yosizaki $
16 
17  *---------------------------------------------------------------------------*/
18 
19 
20 #ifndef NITRO_FS_TYPES_H_
21 #define NITRO_FS_TYPES_H_
22 
23 
24 #include <nitro/misc.h>
25 #include <nitro/types.h>
26 #include <nitro/os/common/thread.h>
27 
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 
34 /*---------------------------------------------------------------------------*/
35 /* Constants */
36 
37 // Return values for the FS library API
38 typedef enum FSResult
39 {
40     // Result values that can be obtained with the FS_GetErrorCode function
41     FS_RESULT_SUCCESS = 0,
42     FS_RESULT_FAILURE,
43     FS_RESULT_BUSY,
44     FS_RESULT_CANCELED,
45     FS_RESULT_CANCELLED = FS_RESULT_CANCELED,
46     FS_RESULT_UNSUPPORTED,
47     FS_RESULT_ERROR,
48     FS_RESULT_INVALID_PARAMETER,
49     FS_RESULT_NO_MORE_RESOURCE,
50     FS_RESULT_ALREADY_DONE,
51     FS_RESULT_PERMISSION_DENIED,
52     FS_RESULT_MEDIA_FATAL,
53     FS_RESULT_NO_ENTRY,
54     FS_RESULT_MEDIA_NOTHING,
55     FS_RESULT_MEDIA_UNKNOWN,
56     FS_RESULT_BAD_FORMAT,
57     FS_RESULT_MAX,
58     // Temporary result values to use within procedures
59     FS_RESULT_PROC_ASYNC = 256,
60     FS_RESULT_PROC_DEFAULT,
61     FS_RESULT_PROC_UNKNOWN
62 }
63 FSResult;
64 
65 // backward compatibility for typo
66 #define FS_RESULT_NO_MORE_RESOUCE   FS_RESULT_NO_MORE_RESOURCE
67 
68 // Maximum archive name length
69 #define FS_ARCHIVE_NAME_LEN_MAX     3
70 
71 // Maximum filename length (limited to procedures for old specifications)
72 #define	FS_FILE_NAME_MAX	        127
73 
74 // Maximum entry name length (limited to procedures for old specifications)
75 #define	FS_ENTRY_SHORTNAME_MAX      16
76 #define	FS_ENTRY_LONGNAME_MAX	    260
77 
78 // The maximum length of special archive names (a TWL enhancement) and of absolute paths
79 #define FS_ARCHIVE_NAME_LONG_MAX    15
80 #define FS_ARCHIVE_FULLPATH_MAX     (FS_ARCHIVE_NAME_LONG_MAX + 1 + 1 + FS_ENTRY_LONGNAME_MAX)
81 
82 // Entry attributes used with ReadDirectory
83 #define FS_ATTRIBUTE_IS_DIRECTORY   0x00000100UL
84 #define FS_ATTRIBUTE_IS_PROTECTED   0x00000200UL
85 #define FS_ATTRIBUTE_IS_OFFLINE     0x00000400UL
86 // Attributes that only have meaning for archives based on MS-DOS FAT
87 #define FS_ATTRIBUTE_DOS_MASK       0x000000FFUL
88 #define FS_ATTRIBUTE_DOS_READONLY   0x00000001UL
89 #define FS_ATTRIBUTE_DOS_HIDDEN     0x00000002UL
90 #define FS_ATTRIBUTE_DOS_SYSTEM     0x00000004UL
91 #define FS_ATTRIBUTE_DOS_VOLUME     0x00000008UL
92 #define FS_ATTRIBUTE_DOS_DIRECTORY  0x00000010UL
93 #define FS_ATTRIBUTE_DOS_ARCHIVE    0x00000020UL
94 
95 #define FS_PROPERTY_CTRL_SET_MTIME  0x01000000UL
96 #define FS_PROPERTY_CTRL_MASK       0x01000000UL
97 
98 // Constants to use in SeekDirectory, OpenFileFast, and so on
99 #define FS_INVALID_FILE_ID          0xFFFFFFFFUL
100 #define FS_INVALID_DIRECTORY_ID     0xFFFFFFFFUL
101 
102 // Constants to use in SeekDirectory
103 #define FS_DIRECTORY_POSITION_HEAD  0x00000000UL
104 
105 // Seek origin to use in SeekFile
106 typedef enum FSSeekFileMode
107 {
108     FS_SEEK_SET,
109     FS_SEEK_CUR,
110     FS_SEEK_END
111 }
112 FSSeekFileMode;
113 
114 // Access mode to use in OpenFile
115 #define FS_FILEMODE_R               0x00000001UL
116 #define FS_FILEMODE_W               0x00000002UL
117 #define FS_FILEMODE_L               0x00000004UL
118 #define FS_FILEMODE_RW              (FS_FILEMODE_R | FS_FILEMODE_W)
119 #define FS_FILEMODE_RWL             (FS_FILEMODE_R | FS_FILEMODE_W | FS_FILEMODE_L)
120 
121 // Access mode to use in OpenDirectory
122 #define FS_DIRMODE_SHORTNAME_ONLY   0x00001000UL
123 
124 // Permissions to use in CreateFile
125 #define FS_PERMIT_R                 0x00000001UL
126 #define FS_PERMIT_W                 0x00000002UL
127 #define FS_PERMIT_RW                (FS_PERMIT_R | FS_PERMIT_W)
128 
129 // Archive capabilities
130 #define FS_ARCHIVE_CAPS_UNICODE     0x00000001UL
131 
132 //
133 // The following group of constants is required only during archive implementation.
134 //
135 
136 // File commands and archive messages
137 // Used in user procedures during archive implementation.
138 typedef u32 FSCommandType;
139 // Commands that are compatible with the old specifications
140 #define FS_COMMAND_READFILE             0UL
141 #define FS_COMMAND_WRITEFILE            1UL
142 #define FS_COMMAND_SEEKDIR              2UL
143 #define FS_COMMAND_READDIR              3UL
144 #define FS_COMMAND_FINDPATH             4UL
145 #define FS_COMMAND_GETPATH              5UL
146 #define FS_COMMAND_OPENFILEFAST         6UL
147 #define FS_COMMAND_OPENFILEDIRECT       7UL
148 #define FS_COMMAND_CLOSEFILE            8UL
149 #define FS_COMMAND_ACTIVATE             9UL
150 #define FS_COMMAND_IDLE                 10UL
151 #define FS_COMMAND_SUSPEND              11UL
152 #define FS_COMMAND_RESUME               12UL
153 // New commands that are compatible with the old specifications
154 #define FS_COMMAND_OPENFILE             13UL
155 #define FS_COMMAND_SEEKFILE             14UL
156 #define FS_COMMAND_GETFILELENGTH        15UL
157 #define FS_COMMAND_GETFILEPOSITION      16UL
158 // Extended commands in the new specifications
159 #define FS_COMMAND_MOUNT                17UL
160 #define FS_COMMAND_UNMOUNT              18UL
161 #define FS_COMMAND_GETARCHIVECAPS       19UL
162 #define FS_COMMAND_CREATEFILE           20UL
163 #define FS_COMMAND_DELETEFILE           21UL
164 #define FS_COMMAND_RENAMEFILE           22UL
165 #define FS_COMMAND_GETPATHINFO          23UL
166 #define FS_COMMAND_SETPATHINFO          24UL
167 #define FS_COMMAND_CREATEDIRECTORY      25UL
168 #define FS_COMMAND_DELETEDIRECTORY      26UL
169 #define FS_COMMAND_RENAMEDIRECTORY      27UL
170 #define FS_COMMAND_GETARCHIVERESOURCE   28UL
171 // 29UL
172 #define FS_COMMAND_FLUSHFILE            30UL
173 #define FS_COMMAND_SETFILELENGTH        31UL
174 #define FS_COMMAND_OPENDIRECTORY        32UL
175 #define FS_COMMAND_CLOSEDIRECTORY       33UL
176 #define FS_COMMAND_SETSEEKCACHE         34UL
177 #define FS_COMMAND_MAX                  35UL
178 #define FS_COMMAND_INVALID              FS_COMMAND_MAX
179 #define FS_COMMAND_PROC_MAX             (FSCommandType)(FS_COMMAND_RESUME + 1)
180 
181 // Restrictions due to the data size maintained by the FSFile structure
182 SDK_COMPILER_ASSERT(FS_COMMAND_MAX < 256);
183 
184 //
185 // The following group of constants is used only within the library.
186 //
187 
188 // File status (used internally)
189 #define FS_FILE_STATUS_BUSY                 0x00000001UL
190 #define FS_FILE_STATUS_CANCEL               0x00000002UL
191 #define FS_FILE_STATUS_BLOCKING             0x00000004UL
192 #define FS_FILE_STATUS_ASYNC_DONE           0x00000008UL
193 #define FS_FILE_STATUS_IS_FILE              0x00000010UL
194 #define FS_FILE_STATUS_IS_DIR               0x00000020UL
195 #define FS_FILE_STATUS_OPERATING            0x00000040UL
196 #define FS_FILE_STATUS_UNICODE_MODE         0x00000080UL
197 #define FS_FILE_STATUS_CMD_SHIFT            8UL
198 #define FS_FILE_STATUS_CMD_MASK             0x000000FFUL
199 #define	FS_FILE_STATUS_USER_RESERVED_BIT	0x00010000UL
200 #define	FS_FILE_STATUS_USER_RESERVED_MASK	0xFFFF0000UL
201 
202 // Internal archive status flag (for inline functions)
203 // Users do not use these constants directly.
204 #define FS_ARCHIVE_FLAG_REGISTER            0x00000001UL
205 #define FS_ARCHIVE_FLAG_LOADED              0x00000002UL
206 #define FS_ARCHIVE_FLAG_SUSPEND             0x00000008UL
207 #define FS_ARCHIVE_FLAG_RUNNING             0x00000010UL
208 #define FS_ARCHIVE_FLAG_CANCELING           0x00000020UL
209 #define FS_ARCHIVE_FLAG_SUSPENDING          0x00000040UL
210 #define FS_ARCHIVE_FLAG_UNLOADING           0x00000080UL
211 #define FS_ARCHIVE_FLAG_USER_RESERVED_BIT	0x00010000UL
212 #define FS_ARCHIVE_FLAG_USER_RESERVED_MASK	0xFFFF0000UL
213 
214 
215 /*---------------------------------------------------------------------------*/
216 /* Declarations */
217 
218 struct FSArchive;
219 struct FSFile;
220 
221 // Date and time information used by the FS library in general
222 typedef struct FSDateTime
223 {
224     u32     year;    // 0-
225     u32     month;   // 1-12
226     u32     day;     // 1-31
227     u32     hour;    // 0-23
228     u32     minute;  // 0-59
229     u32     second;  // 0-60
230 }
231 FSDateTime;
232 
233 // Entry information used with ReadDirectory
234 typedef struct FSDirectoryEntryInfo
235 {
236     char        shortname[FS_ENTRY_SHORTNAME_MAX];
237     u32         shortname_length;
238     char        longname[FS_ENTRY_LONGNAME_MAX];
239     u32         longname_length;
240     u32         attributes;
241     FSDateTime  atime;
242     FSDateTime  mtime;
243     FSDateTime  ctime;
244     u32         filesize;
245     u32         id;
246 }
247 FSDirectoryEntryInfo;
248 
249 typedef struct FSDirectoryEntryInfoW
250 {
251     u32         attributes;
252     FSDateTime  atime;
253     FSDateTime  mtime;
254     FSDateTime  ctime;
255     u32         filesize;
256     u32         id;
257     u32         shortname_length;
258     u32         longname_length;
259     char        shortname[FS_ENTRY_SHORTNAME_MAX];
260     u16         longname[FS_ENTRY_LONGNAME_MAX];
261 }
262 FSDirectoryEntryInfoW;
263 
264 // Entry information used with GetPathInfo and SetPathInfo
265 typedef struct FSPathInfo
266 {
267     u32         attributes;
268     FSDateTime  ctime;
269     FSDateTime  mtime;
270     FSDateTime  atime;
271     u32         filesize;
272     u32         id;
273 }
274 FSPathInfo;
275 
276 typedef struct FSArchiveResource
277 {
278     u64     totalSize;
279     u64     availableSize;
280     u32     maxFileHandles;
281     u32     currentFileHandles;
282     u32     maxDirectoryHandles;
283     u32     currentDirectoryHandles;
284     // For FAT archives
285     u32     bytesPerSector;
286     u32     sectorsPerCluster;
287     u32     totalClusters;
288     u32     availableClusters;
289 }
290 FSArchiveResource;
291 
292 SDK_COMPILER_ASSERT(sizeof(FSArchiveResource) == 48);
293 
294 // For FS_TellDir(), FS_SeekDir(), FS_ReadDir()
295 typedef struct FSDirPos
296 {
297 // Private:
298     struct FSArchive   *arc;
299     u16                 own_id;
300     u16                 index;
301     u32                 pos;
302 }
303 FSDirPos;
304 
305 // For FS_OpenFileFast()
306 typedef struct FSFileID
307 {
308 // private:
309     struct FSArchive   *arc;
310     u32                 file_id;
311 }
312 FSFileID;
313 
314 // For FS_ReadDir()
315 typedef struct
316 {
317     union
318     {
319         FSFileID file_id;               // Valid if !is_directory
320         FSDirPos dir_id;                // Valid if is_directory
321     };
322     u32     is_directory;               // Directory ? 1 : 0
323     u32     name_len;                   // strlen(name)
324     char    name[FS_FILE_NAME_MAX + 1]; // String with '\0'
325 }
326 FSDirEntry;
327 
328 /*---------------------------------------------------------------------------*/
329 
330 
331 #ifdef __cplusplus
332 } /* extern "C" */
333 #endif
334 
335 
336 #endif /* NITRO_FS_TYPES_H_ */
337