Skip to main content

resource_fork/
structs.rs

1// See https://developer.apple.com/library/archive/documentation/mac/pdf/MoreMacintoshToolbox.pdf#page=151
2#[derive(binrw::BinRead, Debug)]
3#[br(big)]
4pub struct ResourceHeader {
5    /// Offset from beginning of resource fork to resource data
6    pub resource_data_offset: u32,
7    /// Offset from beginning of resource fork to resource map
8    pub resource_map_offset: u32,
9    /// Length of resource data
10    pub resource_data_len: u32,
11    /// Length of resource map
12    pub resource_map_len: u32,
13}
14
15#[derive(binrw::BinRead, Debug)]
16#[br(big)]
17pub struct SingleResourceEntry {
18    /// Length of following resource data
19    pub length: u32,
20    /// Resource data for this resource
21    #[br(count(length))]
22    pub data: Vec<u8>,
23}
24
25#[derive(binrw::BinRead, Debug)]
26#[br(big)]
27pub struct ResourceMap {
28    /// Reserved for copy of resource header
29    pub reserved_header: [u8; 16],
30    /// Reserved for handle to next resource map
31    pub reserved_handle: u32,
32    /// Reserved for file reference number
33    pub reserved_file_reference: u16,
34    // Resource fork attributes
35    pub attributes: u16,
36    /// Offset from beginning of map to resource type list
37    pub type_list_offset: u16,
38    /// Offset from beginning of map to resource name list
39    pub name_list_offset: u16,
40    /// Number of types in the map minus 1
41    pub last_type_index: u16,
42}
43
44#[derive(binrw::BinRead, Debug)]
45#[br(big)]
46pub struct TypeMapItem {
47    /// Resource type
48    pub resource_type: macintosh_utils::FourCC,
49    /// Number of resources of this type in map minus 1
50    pub last_resource_index: u16,
51    /// Offset from beginning of resource type list to reference list of this type
52    pub reference_list_offset: u16,
53}
54
55#[derive(binrw::BinRead, Debug)]
56#[br(big)]
57pub struct ReferenceListItem {
58    /// Resource ID
59    pub resource_id: i16,
60    /// Offset from beginning of resource name list to resource name
61    pub resource_name_offset: i16,
62    /// Resource attributes
63    pub attributes: u8,
64    /// Offset from beginning of resource data to data of this resource
65    #[br(map(|[b0, b1, b2]:[u8;3]| (b0 as u32) << 16 | (b1 as u32) << 8 | (b2 as u32)))]
66    pub resource_data_offset: u32,
67    /// Reserved for handle to resource
68    pub reserved_handle: u32,
69}
70
71#[derive(binrw::BinRead, Debug)]
72#[br(big)]
73pub struct ResourceListItem {
74    /// Length of following resource name
75    pub name_len: u8,
76    /// Characters of resource name
77    #[br(count(name_len))]
78    pub name_bytes: Vec<u8>,
79}