1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
use std::fs::File; use std::io::prelude::*; use std::io::SeekFrom; use crate::archive_reader::*; use crate::errors::*; impl ArchiveBackend for File { fn read_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()> { self.seek(SeekFrom::Start(offset)) .chain_err(|| "failed to seek archive file")?; self.read_exact(buf) .chain_err(|| "failed to read archive file")?; Ok(()) } fn read_in_chunks<F: FnMut(Vec<u8>) -> Result<()>>( &mut self, start_offset: u64, chunk_sizes: &[u64], mut chunk_callback: F, ) -> Result<()> { self.seek(SeekFrom::Start(start_offset)) .chain_err(|| "failed to seek archive file")?; for chunk_size in chunk_sizes { let mut buf: Vec<u8> = vec![0; *chunk_size as usize]; self.read_exact(&mut buf[..]) .chain_err(|| "failed to read archive file")?; chunk_callback(buf)?; } Ok(()) } }