1pub const LOCAL_FILE_SIGNATURE: [u8; 4] = [0x50, 0x4b, 0x03, 0x04];
2pub const CENTRAL_DIRECTORY_FILE_SIGNATURE: [u8; 4] = [0x50, 0x4b, 0x01, 0x02];
3pub const DATA_DESCRIPTOR_SIGNATURE: [u8; 4] = [0x08, 0x07, 0x4b, 0x50];
4pub const END_CENTRAL_DIRECTORY_SIGNATURE: [u8; 4] = [0x50, 0x4b, 0x05, 0x06];
5
6#[repr(transparent)]
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub struct Os(pub u8);
9
10impl Os {
11 pub fn name(self) -> OsName {
12 OsName::from_u8(self.0)
13 }
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17#[repr(u8)]
18pub enum OsName {
19 Dos = 0,
20 Amiga = 1,
21 OpenVMS = 2,
22 Unix = 3,
23 VM = 4,
24 AtariST = 5,
25 OS2HPFS = 6,
26 Macintosh = 7,
27 ZSystem = 8,
28 Cpm = 9,
29 WindowsNtfs = 10,
30 Mvs = 11,
31 Vse = 12,
32 AcornRisc = 13,
33 Vfat = 14,
34 AlternateMVS = 15,
35 BeOS = 16,
36 Tandem = 17,
37 OS400 = 18,
38 Darwin = 19,
39 Unused,
40}
41
42impl OsName {
43 pub fn from_u8(n: u8) -> OsName {
44 match n {
45 0 => OsName::Dos,
46 1 => OsName::Amiga,
47 2 => OsName::OpenVMS,
48 3 => OsName::Unix,
49 4 => OsName::VM,
50 5 => OsName::AtariST,
51 6 => OsName::OS2HPFS,
52 7 => OsName::Macintosh,
53 8 => OsName::ZSystem,
54 9 => OsName::Cpm,
55 10 => OsName::WindowsNtfs,
56 11 => OsName::Mvs,
57 12 => OsName::Vse,
58 13 => OsName::AcornRisc,
59 14 => OsName::Vfat,
60 15 => OsName::AlternateMVS,
61 16 => OsName::BeOS,
62 17 => OsName::Tandem,
63 18 => OsName::OS400,
64 19 => OsName::Darwin,
65 20..=255 => OsName::Unused,
66 }
67 }
68}
69
70#[repr(transparent)]
71#[derive(Debug, Copy, Clone, PartialEq, Eq)]
72pub struct DateTimeModified(u32);
73
74impl DateTimeModified {
75 pub fn from_u32(b: u32) -> DateTimeModified {
76 Self(b)
77 }
78}
79
80#[repr(transparent)]
81#[derive(Debug, Copy, Clone, PartialEq, Eq)]
82pub struct CompressionMethod(pub u16);
83
84impl CompressionMethod {
85 pub fn name(self) -> CompressionMethodName {
86 CompressionMethodName::from_u16(self.0)
87 }
88}
89
90#[derive(Debug, Copy, Clone, PartialEq, Eq)]
91pub enum CompressionMethodName {
92 None = 0,
93 Shrink = 1,
94 Factor1 = 2,
95 Factor2 = 3,
96 Factor3 = 4,
97 Factor4 = 5,
98 Implode = 6,
99 Reserved = 7,
100 Deflate = 8,
101 EnhancedDeflate = 9,
102 PKWareDclImplode = 10,
103 Bzip2 = 12,
104 Lzma = 14,
105 IbmTerse = 18,
106 IbmLZ77z = 19,
107 PPMd = 98,
108 Unknown,
109}
110
111impl CompressionMethodName {
112 pub fn from_u16(n: u16) -> CompressionMethodName {
113 match n {
114 0 => CompressionMethodName::None,
115 1 => CompressionMethodName::Shrink,
116 2 => CompressionMethodName::Factor1,
117 3 => CompressionMethodName::Factor2,
118 4 => CompressionMethodName::Factor3,
119 5 => CompressionMethodName::Factor4,
120 6 => CompressionMethodName::Implode,
121 7 | 11 | 13 | 15..=17 => CompressionMethodName::Reserved,
122 8 => CompressionMethodName::Deflate,
123 9 => CompressionMethodName::EnhancedDeflate,
124 10 => CompressionMethodName::PKWareDclImplode,
125 12 => CompressionMethodName::Bzip2,
126 14 => CompressionMethodName::Lzma,
127 18 => CompressionMethodName::IbmTerse,
128 19 => CompressionMethodName::IbmLZ77z,
129 98 => CompressionMethodName::PPMd,
130 _ => CompressionMethodName::Unknown,
131 }
132 }
133}
134
135#[repr(transparent)]
137#[derive(Debug, Copy, Clone, PartialEq, Eq)]
138pub struct ZipFlags(pub u16);
139
140impl ZipFlags {
141 pub const ENCRYPTED_FILE: u16 = 1 << 0;
142 pub const COMPRESSION_OPTION1: u16 = 1 << 1;
143 pub const COMPRESSION_OPTION2: u16 = 1 << 2;
144 pub const DATA_DESCRIPTOR: u16 = 1 << 3;
145 pub const ENHANCED_DEFLATION: u16 = 1 << 4;
146 pub const COMPRESSED_PATCHED_DATA: u16 = 1 << 5;
147 pub const STRONG_ENCRYPTION: u16 = 1 << 6;
148 pub const LANGUAGE_ENCODING: u16 = 1 << 11;
149 pub const RESERVED: u16 = 1 << 12;
150 pub const MASK_HEADER_VALUES: u16 = 1 << 13;
151
152 pub fn has_data_descriptor(&self) -> bool {
153 (self.0 & Self::DATA_DESCRIPTOR) != 0
154 }
155}
156
157#[repr(transparent)]
158#[derive(Debug, Clone, Copy, PartialEq, Eq)]
159pub struct ExternalAttributes(pub u32);
160
161#[repr(transparent)]
162#[derive(Debug, Clone, Copy, PartialEq, Eq)]
163pub struct InternalAttributes(pub u16);
164
165impl InternalAttributes {
166 pub const IS_ASCII: u16 = 1 << 0;
167 pub const RESERVED: u16 = 1 << 1;
168 pub const CONTROL_FIELD_RECORDS_PRECEDE_LOGICAL_RECORDS: u16 = 1 << 2;
169}