tailtalk_packets/afp/
bitmap.rs1use bitflags::bitflags;
2
3bitflags! {
4 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
10 pub struct FPVolumeBitmap: u16 {
11 const ATTRIBUTES = 0x0001;
13 const SIGNATURE = 0x0002;
15 const CREATION_DATE = 0x0004;
17 const MODIFICATION_DATE = 0x0008;
19 const BACKUP_DATE = 0x0010;
21 const VOLUME_ID = 0x0020;
23 const BYTES_FREE = 0x0040;
25 const BYTES_TOTAL = 0x0080;
27 const VOLUME_NAME = 0x0100;
29 }
30}
31
32impl From<u16> for FPVolumeBitmap {
35 fn from(value: u16) -> Self {
36 Self::from_bits_truncate(value)
37 }
38}
39
40impl From<FPVolumeBitmap> for u16 {
43 fn from(val: FPVolumeBitmap) -> Self {
44 val.bits()
45 }
46}
47
48bitflags! {
49 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
50 #[repr(transparent)]
51 pub struct FPDirectoryBitmap: u16 {
52 const ATTRIBUTES = 1;
55 const PARENT_DIR_ID = 1 << 1;
58 const CREATE_DATE = 1 << 2;
61 const MODIFICATION_DATE = 1 << 3;
64 const BACKUP_DATE = 1 << 4;
67 const FINDER_INFO = 1 << 5;
70 const LONG_NAME = 1 << 6;
73 const SHORT_NAME = 1 << 7;
76 const DIR_ID = 1 << 8;
79 const OFFSPRING_COUNT = 1 << 9;
82 const OWNER_ID = 1 << 10;
85 const GROUP_ID = 1 << 11;
88 const ACCESS_RIGHTS = 1 << 12;
91 const PRODOS_INFO = 1 << 13;
93 }
94}
95
96impl From<u16> for FPDirectoryBitmap {
99 fn from(value: u16) -> Self {
100 Self::from_bits_truncate(value)
101 }
102}
103
104impl From<FPDirectoryBitmap> for u16 {
107 fn from(val: FPDirectoryBitmap) -> Self {
108 val.bits()
109 }
110}
111
112impl FPDirectoryBitmap {
113 pub fn long_name_offset(&self) -> usize {
115 let mut offset = 0;
116 if self.contains(FPDirectoryBitmap::ATTRIBUTES) {
117 offset += 2;
118 }
119 if self.contains(FPDirectoryBitmap::PARENT_DIR_ID) {
120 offset += 4;
121 }
122 if self.contains(FPDirectoryBitmap::CREATE_DATE) {
123 offset += 4;
124 }
125 if self.contains(FPDirectoryBitmap::MODIFICATION_DATE) {
126 offset += 4;
127 }
128 if self.contains(FPDirectoryBitmap::BACKUP_DATE) {
129 offset += 4;
130 }
131 if self.contains(FPDirectoryBitmap::FINDER_INFO) {
132 offset += 32;
133 }
134 if self.contains(FPDirectoryBitmap::LONG_NAME) {
135 offset += 2;
136 }
137 if self.contains(FPDirectoryBitmap::SHORT_NAME) {
138 offset += 2;
139 }
140 if self.contains(FPDirectoryBitmap::DIR_ID) {
141 offset += 4;
142 }
143 if self.contains(FPDirectoryBitmap::OFFSPRING_COUNT) {
144 offset += 2;
145 }
146 if self.contains(FPDirectoryBitmap::OWNER_ID) {
147 offset += 4;
148 }
149 if self.contains(FPDirectoryBitmap::GROUP_ID) {
150 offset += 4;
151 }
152 if self.contains(FPDirectoryBitmap::ACCESS_RIGHTS) {
153 offset += 4;
154 }
155 if self.contains(FPDirectoryBitmap::PRODOS_INFO) {
156 offset += 6;
157 }
158 offset
159 }
160
161 pub fn response_len(&self, name_len: usize) -> usize {
162 self.long_name_offset() + name_len + 1
163 }
164}
165
166bitflags! {
167 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
168 pub struct FPFileBitmap: u16 {
169 const ATTRIBUTES = 1;
170 const PARENT_DIR_ID = 1 << 1;
171 const CREATE_DATE = 1 << 2;
172 const MODIFICATION_DATE = 1 << 3;
173 const BACKUP_DATE = 1 << 4;
174 const FINDER_INFO = 1 << 5;
175 const LONG_NAME = 1 << 6;
176 const SHORT_NAME = 1 << 7;
177 const FILE_NUMBER = 1 << 8;
178 const DATA_FORK_LENGTH = 1 << 9;
179 const RESOURCE_FORK_LENGTH = 1 << 10;
180 const ACCESS_RIGHTS = 1 << 12;
181 const PRODOS_INFO = 1 << 13;
182 }
183}
184
185impl From<u16> for FPFileBitmap {
188 fn from(value: u16) -> Self {
189 Self::from_bits_truncate(value)
190 }
191}
192
193impl From<FPFileBitmap> for u16 {
196 fn from(val: FPFileBitmap) -> Self {
197 val.bits()
198 }
199}
200
201impl FPFileBitmap {
202 pub fn long_name_offset(&self) -> usize {
204 let mut offset = 0;
205 if self.contains(FPFileBitmap::ATTRIBUTES) {
206 offset += 2;
207 }
208 if self.contains(FPFileBitmap::PARENT_DIR_ID) {
209 offset += 4;
210 }
211 if self.contains(FPFileBitmap::CREATE_DATE) {
212 offset += 4;
213 }
214 if self.contains(FPFileBitmap::MODIFICATION_DATE) {
215 offset += 4;
216 }
217 if self.contains(FPFileBitmap::BACKUP_DATE) {
218 offset += 4;
219 }
220 if self.contains(FPFileBitmap::FINDER_INFO) {
221 offset += 32;
222 }
223 if self.contains(FPFileBitmap::LONG_NAME) {
224 offset += 2;
225 }
226 if self.contains(FPFileBitmap::SHORT_NAME) {
227 offset += 2;
228 }
229 if self.contains(FPFileBitmap::FILE_NUMBER) {
230 offset += 4;
231 }
232 if self.contains(FPFileBitmap::DATA_FORK_LENGTH) {
233 offset += 4;
234 }
235 if self.contains(FPFileBitmap::RESOURCE_FORK_LENGTH) {
236 offset += 4;
237 }
238 if self.contains(FPFileBitmap::PRODOS_INFO) {
239 offset += 6;
240 }
241 offset
242 }
243
244 pub fn response_len(&self, name_len: usize) -> usize {
245 self.long_name_offset() + name_len + 1
246 }
247}
248
249bitflags! {
250 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
251 pub struct FPFileAttributes: u16 {
252 const INVISIBLE = 1;
253 const MULTI_USER = 1 << 1;
254 const SYSTEM = 1 << 2;
255 const DAlreadyOpen = 1 << 3;
256 const RAlreadyOpen = 1 << 4;
257 const ReadOnly = 1 << 5;
258 const BackupNeeded = 1 << 6;
259 const RenameInhibit = 1 << 7;
260 const DeleteInhibit = 1 << 8;
261 const CopyProtect = 1 << 10;
262 const SetClear = 1 << 15;
263 }
264}
265
266impl From<u16> for FPFileAttributes {
267 fn from(value: u16) -> Self {
268 Self::from_bits_truncate(value)
269 }
270}
271
272impl From<FPFileAttributes> for u16 {
273 fn from(val: FPFileAttributes) -> Self {
274 val.bits()
275 }
276}
277
278bitflags! {
279 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
289 pub struct FPAccessRights: u8 {
290 const SEARCH = 0x01;
292 const READ = 0x02;
294 const WRITE = 0x04;
296 const OWNER = 0x80;
299 }
300}
301
302impl From<u8> for FPAccessRights {
303 fn from(value: u8) -> Self {
304 Self::from_bits_truncate(value)
305 }
306}
307
308pub fn afp_rights_to_mode(rights: FPAccessRights) -> u32 {
309 let mut mode = 0;
310 if rights.contains(FPAccessRights::READ) {
311 mode |= 4;
312 }
313 if rights.contains(FPAccessRights::WRITE) {
314 mode |= 2;
315 }
316 if rights.contains(FPAccessRights::SEARCH) {
317 mode |= 1;
318 }
319 mode
320}
321
322pub fn mode_to_afp_rights(mode: u32) -> FPAccessRights {
323 let mut rights = FPAccessRights::empty();
324 if mode & 4 != 0 {
325 rights |= FPAccessRights::READ;
326 }
327 if mode & 2 != 0 {
328 rights |= FPAccessRights::WRITE;
329 }
330 if mode & 1 != 0 {
331 rights |= FPAccessRights::SEARCH;
332 }
333 rights
334}
335
336impl From<FPAccessRights> for u8 {
337 fn from(rights: FPAccessRights) -> u8 {
338 rights.bits()
339 }
340}
341
342bitflags! {
343 #[derive(Debug, Clone, Copy)]
344 pub struct FPByteRangeLockFlags: u8 {
345 const UNLOCK = 0b00000001;
346 const END = 0b10000000;
347 }
348}
349
350impl From<u8> for FPByteRangeLockFlags {
351 fn from(value: u8) -> Self {
352 Self::from_bits_truncate(value)
353 }
354}
355
356impl From<FPByteRangeLockFlags> for u8 {
357 fn from(val: FPByteRangeLockFlags) -> Self {
358 val.bits()
359 }
360}