1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#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_
|