use crate::error::{Error, Result};
use crate::io::Cursor;
#[derive(Debug, Clone)]
pub enum SharedMessage {
SharedInOhdr { address: u64 },
SharedInSohm { heap_id: Vec<u8> },
}
pub fn parse(
cursor: &mut Cursor<'_>,
offset_size: u8,
_length_size: u8,
msg_size: usize,
) -> Result<SharedMessage> {
let start = cursor.position();
let version = cursor.read_u8()?;
let msg = match version {
1 => {
let _type_field = cursor.read_u8()?;
let _reserved = cursor.read_bytes(6)?;
let address = cursor.read_offset(offset_size)?;
SharedMessage::SharedInOhdr { address }
}
2 | 3 => {
let type_field = cursor.read_u8()?;
match type_field {
0 | 2 => {
let address = cursor.read_offset(offset_size)?;
SharedMessage::SharedInOhdr { address }
}
1 | 3 => {
let heap_id = cursor.read_bytes(8)?.to_vec();
SharedMessage::SharedInSohm { heap_id }
}
t => {
return Err(Error::InvalidData(format!(
"unknown shared message type: {}",
t
)));
}
}
}
v => {
return Err(Error::InvalidData(format!(
"unsupported shared message version: {}",
v
)));
}
};
let consumed = (cursor.position() - start) as usize;
if consumed < msg_size {
cursor.skip(msg_size - consumed)?;
}
Ok(msg)
}