use crate::protocol::dds::byte_cursor::{ByteCursor, ByteWriter, Endianness};
use crate::protocol::dds::error::RtpsError;
use crate::protocol::dds::types::fragment::FragmentNumberSet;
use crate::protocol::dds::types::guid::EntityId;
use crate::protocol::dds::types::sequence::{SequenceNumber, SequenceNumberSet};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AckNack {
pub endianness: Endianness,
pub final_flag: bool,
pub reader_id: EntityId,
pub writer_id: EntityId,
pub reader_sn_state: SequenceNumberSet,
pub count: i32,
}
impl AckNack {
pub fn parse(flags: u8, body: &[u8]) -> Result<Self, RtpsError> {
let endianness = Endianness::from_flags(flags);
let final_flag = flags & 0x02 != 0;
let mut cur = ByteCursor::new(body, endianness);
let reader_id = EntityId::parse(&mut cur)?;
let writer_id = EntityId::parse(&mut cur)?;
let reader_sn_state = SequenceNumberSet::parse(&mut cur)?;
let count = cur.read_i32()?;
Ok(Self {
endianness,
final_flag,
reader_id,
writer_id,
reader_sn_state,
count,
})
}
pub fn serialize_body(&self, w: &mut ByteWriter<'_>) -> Result<(), RtpsError> {
self.reader_id.serialize(w)?;
self.writer_id.serialize(w)?;
self.reader_sn_state.serialize(w)?;
w.write_i32(self.count)?;
Ok(())
}
pub fn flags_byte(&self) -> u8 {
let mut f = self.endianness.into_flags(0u8);
if self.final_flag {
f |= 0x02;
}
f
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NackFrag {
pub endianness: Endianness,
pub reader_id: EntityId,
pub writer_id: EntityId,
pub writer_sn: SequenceNumber,
pub fragment_number_state: FragmentNumberSet,
pub count: i32,
}
impl NackFrag {
pub fn parse(flags: u8, body: &[u8]) -> Result<Self, RtpsError> {
let endianness = Endianness::from_flags(flags);
let mut cur = ByteCursor::new(body, endianness);
let reader_id = EntityId::parse(&mut cur)?;
let writer_id = EntityId::parse(&mut cur)?;
let writer_sn = SequenceNumber::parse(&mut cur)?;
let fragment_number_state = FragmentNumberSet::parse(&mut cur)?;
let count = cur.read_i32()?;
Ok(Self {
endianness,
reader_id,
writer_id,
writer_sn,
fragment_number_state,
count,
})
}
pub fn serialize_body(&self, w: &mut ByteWriter<'_>) -> Result<(), RtpsError> {
self.reader_id.serialize(w)?;
self.writer_id.serialize(w)?;
self.writer_sn.serialize(w)?;
self.fragment_number_state.serialize(w)?;
w.write_i32(self.count)?;
Ok(())
}
pub fn flags_byte(&self) -> u8 {
self.endianness.into_flags(0u8)
}
}