zip_rs/
common.rs

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/// General purpose bit flags related to encoding
136#[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}