pub const REC_VER_CONTAINER: u16 = 0xF;
pub const RT_SLIDE_CONTAINER: u16 = 0x03EE; pub const RT_NOTES_CONTAINER: u16 = 0x03F0; pub const RT_SLIDE_PERSIST_ATOM: u16 = 0x03F3; pub const RT_MAIN_MASTER: u16 = 0x03F8; pub const RT_SLIDE_LIST_WITH_TEXT: u16 = 0x0FF0; pub const RT_TEXT_HEADER_ATOM: u16 = 0x0F9F; pub const RT_TEXT_CHARS_ATOM: u16 = 0x0FA0; pub const RT_TEXT_BYTES_ATOM: u16 = 0x0FA8;
pub const SLWT_INSTANCE_SLIDES: u16 = 0;
pub const TX_TYPE_TITLE: u32 = 0;
pub const TX_TYPE_CENTER_TITLE: u32 = 6;
#[derive(Debug, Clone, Copy)]
pub struct RecordHeader {
pub rec_ver: u16,
pub rec_instance: u16,
pub rec_type: u16,
pub body_start: usize,
pub body_end: usize,
}
fn u16_le(data: &[u8], at: usize) -> u16 {
u16::from_le_bytes([data[at], data[at + 1]])
}
fn u32_le(data: &[u8], at: usize) -> u32 {
u32::from_le_bytes([data[at], data[at + 1], data[at + 2], data[at + 3]])
}
pub fn parse_header(data: &[u8], pos: usize, end: usize) -> Option<(RecordHeader, usize)> {
if pos + 8 > end {
return None;
}
let ver_inst = u16_le(data, pos);
let rec_type = u16_le(data, pos + 2);
let rec_len = u32_le(data, pos + 4) as usize;
let body_start = pos + 8;
let body_end = body_start.saturating_add(rec_len).min(end);
let next = body_end;
Some((
RecordHeader {
rec_ver: ver_inst & 0x000F,
rec_instance: ver_inst >> 4,
rec_type,
body_start,
body_end,
},
next,
))
}
pub fn read_txtype(body: &[u8]) -> Option<u32> {
if body.len() >= 4 {
Some(u32_le(body, 0))
} else {
None
}
}