use super::headers::{reserved_extension_hdr::ReservedExtensionHeader, NitfSegmentHeader};
use memmap2::{Mmap, MmapOptions};
use std::fmt::Display;
use std::io::SeekFrom::Start;
use std::{fs::File, io::Seek, ops::Deref};
#[derive(Debug)]
pub struct ReservedExtension {
pub meta: ReservedExtensionHeader,
pub data: Mmap,
pub header_offset: u64,
pub header_size: u32,
pub data_offset: u64,
pub data_size: u64,
}
impl ReservedExtension {
pub fn initialize(reader: &mut File, header_size: u32, data_size: u64) -> Self {
let header_offset = reader.stream_position().unwrap();
let header_size = header_size;
let data_size = data_size;
let data_offset = header_offset + header_size as u64;
let meta = ReservedExtensionHeader::from_reader(reader);
let mut memmap_opts = MmapOptions::new();
let data = unsafe {
memmap_opts
.offset(data_offset)
.len(data_size as usize)
.map(reader.deref())
.unwrap()
};
reader.seek(Start(data_offset + data_size)).unwrap();
Self {
meta,
data,
header_offset,
header_size,
data_size,
data_offset,
}
}
}
impl Display for ReservedExtension {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.meta)
}
}