use crate::types::{AcquisitionError, EwfMetadata};
pub(crate) fn parse_header_text(text: &str, meta: &mut EwfMetadata) {
let text = text.replace("\r\n", "\n");
let lines: Vec<&str> = text.split('\n').collect();
if lines.len() < 4 {
return;
}
let names: Vec<&str> = lines[2].split('\t').collect();
let values: Vec<&str> = lines[3].split('\t').collect();
for (i, &name) in names.iter().enumerate() {
let val = values.get(i).copied().unwrap_or("");
if val.is_empty() {
continue;
}
let field = match name {
"c" => &mut meta.case_number,
"n" => &mut meta.evidence_number,
"a" => &mut meta.description,
"e" => &mut meta.examiner,
"t" => &mut meta.notes,
"av" => &mut meta.acquiry_software,
"ov" => &mut meta.os_version,
"m" => &mut meta.acquiry_date,
"u" => &mut meta.system_date,
_ => continue,
};
*field = Some(val.to_string());
}
}
pub fn parse_error2_data(data: &[u8]) -> Vec<AcquisitionError> {
if data.len() < 8 {
return Vec::new();
}
let entry_count = u32::from_le_bytes(data[0..4].try_into().unwrap()) as usize;
if entry_count == 0 {
return Vec::new();
}
let entries_start = 8;
let mut errors = Vec::with_capacity(entry_count);
for i in 0..entry_count {
let off = entries_start + i * 8;
if off + 8 > data.len() {
break;
}
let first_sector = u32::from_le_bytes(data[off..off + 4].try_into().unwrap());
let sector_count = u32::from_le_bytes(data[off + 4..off + 8].try_into().unwrap());
errors.push(AcquisitionError {
first_sector,
sector_count,
});
}
errors
}