@@ -30,6 +30,10 @@ int32_t amiidb_api_slot_read(uint8_t slot, ntag_t *p_ntag) {
30
30
strcpy (p_ntag -> notes , meta .notes );
31
31
}
32
32
33
+ if (meta .has_flags && meta .flags & VFS_OBJ_FLAG_READONLY ) {
34
+ p_ntag -> readonly = true;
35
+ }
36
+
33
37
return 0 ;
34
38
}
35
39
@@ -51,6 +55,8 @@ int32_t amiidb_api_slot_write(uint8_t slot, ntag_t *p_ntag) {
51
55
meta .amiibo_head = to_little_endian_int32 (& p_ntag -> data [84 ]);
52
56
meta .amiibo_tail = to_little_endian_int32 (& p_ntag -> data [88 ]);
53
57
58
+ // TODO write only flag???
59
+
54
60
vfs_meta_encode (meta_encoded , sizeof (meta_encoded ), & meta );
55
61
res = p_vfs_driver -> update_file_meta (path , meta_encoded , sizeof (meta_encoded ));
56
62
if (res < 0 ) {
@@ -90,13 +96,13 @@ int32_t amiidb_api_slot_info(uint8_t slot, amiidb_slot_info_t *p_info) {
90
96
91
97
p_info -> slot = slot ;
92
98
p_info -> is_empty = false;
99
+ p_info -> is_readonly = meta .has_flags && meta .flags & VFS_OBJ_FLAG_READONLY ;
93
100
p_info -> amiibo_head = meta .amiibo_head ;
94
101
p_info -> amiibo_tail = meta .amiibo_tail ;
95
102
96
103
return 0 ;
97
104
}
98
105
99
-
100
106
int32_t amiidb_api_slot_list (amiibo_slot_info_cb_t cb , void * ctx ) {
101
107
vfs_dir_t dir ;
102
108
vfs_obj_t obj ;
@@ -108,6 +114,7 @@ int32_t amiidb_api_slot_list(amiibo_slot_info_cb_t cb, void *ctx) {
108
114
for (uint8_t i = 0 ; i < MAX_SLOT_COUNT ; i ++ ) {
109
115
slots [i ].slot = i ;
110
116
slots [i ].is_empty = true;
117
+ slots [i ].is_readonly = false;
111
118
slots [i ].amiibo_head = 0 ;
112
119
slots [i ].amiibo_tail = 0 ;
113
120
}
@@ -123,20 +130,47 @@ int32_t amiidb_api_slot_list(amiibo_slot_info_cb_t cb, void *ctx) {
123
130
if (sscanf (obj .name , "%02d.bin" , & index ) == 1 && index >= 0 && index < max_slot_num ) {
124
131
memset (& meta , 0 , sizeof (vfs_meta_t ));
125
132
vfs_meta_decode (obj .meta , sizeof (obj .meta ), & meta );
126
- if (meta .has_amiibo_id ) {
133
+ if (meta .has_amiibo_id ) {
127
134
slots [index ].is_empty = false;
128
135
slots [index ].amiibo_head = meta .amiibo_head ;
129
136
slots [index ].amiibo_tail = meta .amiibo_tail ;
130
137
}
138
+ if (meta .has_flags && meta .flags & VFS_OBJ_FLAG_READONLY ) {
139
+ slots [index ].is_readonly = true;
140
+ }
131
141
}
132
142
}
133
143
}
134
144
p_vfs_driver -> close_dir (& dir );
135
145
136
-
137
146
for (uint8_t i = 0 ; i < max_slot_num ; i ++ ) {
138
147
cb (& slots [i ], ctx );
139
148
}
140
149
141
150
return 0 ;
151
+ }
152
+
153
+ int32_t amiidb_api_slot_set_readonly (uint8_t slot , bool readonly ) {
154
+ char path [VFS_MAX_PATH_LEN ];
155
+ vfs_meta_t meta ;
156
+ vfs_obj_t obj ;
157
+
158
+ sprintf (path , "/amiibo/data/%02d.bin" , slot );
159
+ vfs_driver_t * p_vfs_driver = vfs_get_driver (VFS_DRIVE_EXT );
160
+ int32_t res = p_vfs_driver -> stat_file (path , & obj );
161
+ if (res < 0 ) {
162
+ return -1 ;
163
+ }
164
+
165
+ memset (& meta , 0 , sizeof (vfs_meta_t ));
166
+ vfs_meta_decode (obj .meta , sizeof (obj .meta ), & meta );
167
+
168
+ meta .has_flags = true;
169
+ if (readonly ) {
170
+ meta .flags |= VFS_OBJ_FLAG_READONLY ;
171
+ } else {
172
+ meta .flags &= ~VFS_OBJ_FLAG_READONLY ;
173
+ }
174
+
175
+ return p_vfs_driver -> update_file_meta (path , obj .meta , sizeof (obj .meta ));
142
176
}
0 commit comments