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