aboutsummaryrefslogtreecommitdiff
path: root/src/zip/driver.rs
diff options
context:
space:
mode:
authorIgor Tolmachev <me@igorek.dev>2024-06-27 16:15:00 +0900
committerIgor Tolmachev <me@igorek.dev>2024-06-29 21:18:46 +0900
commit51694e1f0b2730915e0a57ec6d8de503cf06ef9a (patch)
tree165f3adbc29f96814b57aeba394fb4045af7c5f0 /src/zip/driver.rs
parenta867677218c1d55dadfcac1ca5b8cd32a78a3c28 (diff)
downloadarchivator-51694e1f0b2730915e0a57ec6d8de503cf06ef9a.tar.gz
archivator-51694e1f0b2730915e0a57ec6d8de503cf06ef9a.zip
Create file driver and implement file reader
Diffstat (limited to 'src/zip/driver.rs')
-rw-r--r--src/zip/driver.rs38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/zip/driver.rs b/src/zip/driver.rs
index 650344e..0db845d 100644
--- a/src/zip/driver.rs
+++ b/src/zip/driver.rs
@@ -1,27 +1,27 @@
1use crate::driver::{ArchiveRead, ArchiveWrite, Driver}; 1use crate::driver::{ArchiveRead, ArchiveWrite, Driver};
2use crate::zip::file::{BitFlag, CompressionMethod};
3use crate::zip::structs::{deserialize, EOCDR64Locator, ExtraHeader, CDR, EOCDR, EOCDR64}; 2use crate::zip::structs::{deserialize, EOCDR64Locator, ExtraHeader, CDR, EOCDR, EOCDR64};
4use crate::zip::{ZipError, ZipFile, ZipResult}; 3use crate::zip::{BitFlag, CompressionMethod, ZipError, ZipFile, ZipFileInfo, ZipResult};
5use chrono::{Local, NaiveDate, NaiveDateTime, NaiveTime}; 4use chrono::{Local, NaiveDate, NaiveDateTime, NaiveTime};
6use std::collections::HashMap as Map; 5use std::collections::HashMap as Map;
7use std::io::{Read, Seek, SeekFrom, Write}; 6use std::io::{Read, Seek, SeekFrom, Write};
8 7
9pub struct Zip<IO> { 8pub struct Zip<Io> {
10 io: IO, 9 io: Io,
11 10
12 files: Map<String, ZipFile>, 11 files: Map<String, ZipFileInfo>,
13 comment: String, 12 comment: String,
14} 13}
15 14
16impl<IO> Driver for Zip<IO> { 15impl<Io> Driver for Zip<Io> {
17 type Error = ZipError; 16 type Error = ZipError;
18 17
19 type IO = IO; 18 type Io = Io;
20 type File = ZipFile; 19 type FileDriver<'d> = ZipFile<'d, Self::Io> where Self::Io: 'd;
20 type FileInfo = ZipFileInfo;
21} 21}
22 22
23impl<IO: Read + Seek> ArchiveRead for Zip<IO> { 23impl<Io: Read + Seek> ArchiveRead for Zip<Io> {
24 fn read(mut io: Self::IO) -> ZipResult<Self> { 24 fn read(mut io: Self::Io) -> ZipResult<Self> {
25 // Search eocdr 25 // Search eocdr
26 let limit = 65557.min(io.seek(SeekFrom::End(0))?) as i64; 26 let limit = 65557.min(io.seek(SeekFrom::End(0))?) as i64;
27 let start = io.seek(SeekFrom::End(-limit))?; 27 let start = io.seek(SeekFrom::End(-limit))?;
@@ -137,7 +137,7 @@ impl<IO: Read + Seek> ArchiveRead for Zip<IO> {
137 137
138 files.insert( 138 files.insert(
139 name.clone(), 139 name.clone(),
140 ZipFile::new( 140 ZipFileInfo::new(
141 CompressionMethod::from_struct_id(cdr.compression_method)?, 141 CompressionMethod::from_struct_id(cdr.compression_method)?,
142 BitFlag::new(cdr.bit_flag), 142 BitFlag::new(cdr.bit_flag),
143 NaiveDateTime::new( 143 NaiveDateTime::new(
@@ -169,23 +169,27 @@ impl<IO: Read + Seek> ArchiveRead for Zip<IO> {
169 Ok(Self { io, files, comment }) 169 Ok(Self { io, files, comment })
170 } 170 }
171 171
172 fn files(&self) -> Vec<&Self::File> { 172 fn files(&self) -> Vec<&Self::FileInfo> {
173 let mut files: Vec<&Self::File> = self.files.values().collect(); 173 let mut files: Vec<&Self::FileInfo> = self.files.values().collect();
174 files.sort_by_key(|f| &f.name); 174 files.sort_by_key(|f| &f.name);
175 files 175 files
176 } 176 }
177 177
178 fn get_file(&self, name: &str) -> Option<&Self::File> { 178 fn get_file_info(&self, name: &str) -> Option<&Self::FileInfo> {
179 self.files.get(name) 179 self.files.get(name)
180 } 180 }
181
182 fn get_file_reader<'d>(&'d mut self, name: &str) -> Option<Self::FileDriver<'d>> {
183 Some(ZipFile::new(&mut self.io, self.files.get(name)?).unwrap())
184 }
181} 185}
182 186
183impl<IO: Read + Seek> Zip<IO> { 187impl<Io: Read + Seek> Zip<Io> {
184 pub fn comment(&self) -> &String { 188 pub fn comment(&self) -> &String {
185 &self.comment 189 &self.comment
186 } 190 }
187} 191}
188 192
189impl<IO: Read + Write + Seek> ArchiveWrite for Zip<IO> {} 193impl<Io: Read + Write + Seek> ArchiveWrite for Zip<Io> {}
190 194
191impl<IO: Read + Write + Seek> Zip<IO> {} 195impl<Io: Read + Write + Seek> Zip<Io> {}