#ifndef NITRO_FS_ARCHIVE_H_ #define NITRO_FS_ARCHIVE_H_ #include "nitro.h" #include "OS_thread.h" struct FSFile; struct FSArchive; #define FS_ARCHIVE_NAME_LEN_MAX 3 #define FS_ARCHIVE_FLAG_REGISTER 0x00000001 #define FS_ARCHIVE_FLAG_LOADED 0x00000002 #define FS_ARCHIVE_FLAG_TABLE_LOAD 0x00000004 #define FS_ARCHIVE_FLAG_SUSPEND 0x00000008 #define FS_ARCHIVE_FLAG_RUNNING 0x00000010 #define FS_ARCHIVE_FLAG_CANCELING 0x00000020 #define FS_ARCHIVE_FLAG_SUSPENDING 0x00000040 #define FS_ARCHIVE_FLAG_UNLOADING 0x00000080 #define FS_ARCHIVE_FLAG_IS_ASYNC 0x00000100 #define FS_ARCHIVE_FLAG_IS_SYNC 0x00000200 typedef enum { FS_COMMAND_ASYNC_BEGIN = 0, FS_COMMAND_READFILE = FS_COMMAND_ASYNC_BEGIN, FS_COMMAND_WRITEFILE, FS_COMMAND_ASYNC_END, FS_COMMAND_SYNC_BEGIN = FS_COMMAND_ASYNC_END, FS_COMMAND_SEEKDIR = FS_COMMAND_SYNC_BEGIN, FS_COMMAND_READDIR, FS_COMMAND_FINDPATH, FS_COMMAND_GETPATH, FS_COMMAND_OPENFILEFAST, FS_COMMAND_OPENFILEDIRECT, FS_COMMAND_CLOSEFILE, FS_COMMAND_SYNC_END, FS_COMMAND_STATUS_BEGIN = FS_COMMAND_SYNC_END, FS_COMMAND_ACTIVATE = FS_COMMAND_STATUS_BEGIN, FS_COMMAND_IDLE, FS_COMMAND_SUSPEND, FS_COMMAND_RESUME, FS_COMMAND_STATUS_END, FS_COMMAND_INVALID } FSCommandType; typedef enum { FS_RESULT_SUCCESS = 0, FS_RESULT_FAILURE, FS_RESULT_BUSY, FS_RESULT_CANCELED, FS_RESULT_CANCELLED = FS_RESULT_CANCELED, // SDK alias FS_RESULT_UNSUPPORTED, FS_RESULT_ERROR, FS_RESULT_PROC_ASYNC, FS_RESULT_PROC_DEFAULT, FS_RESULT_PROC_UNKNOWN } FSResult; typedef FSResult (*FS_ARCHIVE_READ_FUNC) (struct FSArchive *p, void *dst, u32 pos, u32 size); typedef FSResult (*FS_ARCHIVE_WRITE_FUNC) (struct FSArchive *p, const void *src, u32 pos, u32 size); typedef FSResult (*FS_ARCHIVE_PROC_FUNC) (struct FSFile *, FSCommandType); typedef struct { struct FSFile * prev; struct FSFile * next; } FSFileLink; typedef struct FSArchive { union { char ptr[4]; u32 pack; } name; struct FSArchive * prev; struct FSArchive * next; OSThreadQueue sync_q; OSThreadQueue stat_q; u32 flag; FSFileLink list; u32 base; u32 fat; u32 fat_size; u32 fnt; u32 fnt_size; u32 fat_bak; u32 fnt_bak; void * load_mem; FS_ARCHIVE_READ_FUNC read_func; FS_ARCHIVE_WRITE_FUNC write_func; FS_ARCHIVE_READ_FUNC table_func; FS_ARCHIVE_PROC_FUNC proc; u32 proc_flag; } FSArchive; FSArchive * const FS_FindArchive(const char * path, int offset); static inline BOOL FS_IsArchiveLoaded(volatile const FSArchive * p_arc) { return (p_arc->flag & FS_ARCHIVE_FLAG_LOADED) ? TRUE : FALSE; } BOOL FSi_SendCommand(struct FSFile * file, FSCommandType command); BOOL FSi_ExecuteSyncCommand(struct FSFile * file); #endif //NITRO_FS_ARCHIVE_H_