use crate::audit_tag::AuditTag;
use crate::error::{Error, Result};
use crate::reader::BinaryReader;
use std::io::{Read, Seek};
#[derive(Debug)]
pub struct FileHeader {
pub magic: u16,
pub signature: String,
pub version: u32,
pub audit_start: AuditTag,
pub audit_end: AuditTag,
pub tag: String,
}
impl FileHeader {
pub const SIZE: usize = 1356;
pub(crate) fn read<R: Read + Seek>(r: &mut BinaryReader<R>) -> Result<Self> {
let magic = r.read_u16()?;
if magic != 0xa101 {
return Err(Error::BadMagic(magic));
}
let signature = r.read_utf16_fixed(18)?;
if signature != "Finnigan" {
return Err(Error::BadSignature(signature));
}
r.skip(16)?;
let version = r.read_u32()?;
match version {
8 | 47 | 57 | 60 | 62 | 63 | 64 | 66 => {}
_ => return Err(Error::UnsupportedVersion(version)),
}
let audit_start = AuditTag::read(r)?;
let audit_end = AuditTag::read(r)?;
r.skip(4)?;
r.skip(60)?;
let tag = r.read_utf16_fixed(1028)?;
Ok(Self {
magic,
signature,
version,
audit_start,
audit_end,
tag,
})
}
}