use forensic_vfs::{ImageSource, VfsError, VfsResult};
use crate::EwfReader;
impl ImageSource for EwfReader {
fn len(&self) -> u64 {
self.total_size()
}
fn read_at(&self, offset: u64, buf: &mut [u8]) -> VfsResult<usize> {
EwfReader::read_at(self, buf, offset).map_err(|e| VfsError::Io {
op: "ewf::read_at",
source: std::io::Error::other(e),
})
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use forensic_vfs::{DynSource, ImageSource};
use crate::EwfReader;
const NPS: &str = concat!(
env!("CARGO_MANIFEST_DIR"),
"/tests/data/nps-2010-emails.E01"
);
#[test]
fn ewf_reader_is_an_image_source() {
let reader = EwfReader::open(NPS).expect("open E01");
let expected_len = reader.total_size();
let src: Arc<dyn ImageSource> = Arc::new(reader);
assert_eq!(src.len(), expected_len);
assert!(!src.is_empty());
let mut buf = [0u8; 512];
let n = src.read_at(0, &mut buf).expect("read_at");
assert_eq!(n, 512);
assert_eq!(src.read_at(expected_len, &mut buf).expect("eof read"), 0);
}
#[test]
fn subrange_windows_an_ewf_source() {
let reader = EwfReader::open(NPS).expect("open E01");
let base: DynSource = Arc::new(reader);
let sr = forensic_vfs::adapters::SubRange::new(base, 512, 1024);
assert_eq!(sr.len(), 1024);
let mut buf = [0u8; 1024];
assert_eq!(sr.read_at(0, &mut buf).expect("read window"), 1024);
}
}