ironrdp_pdu/rdp/
refresh_rectangle.rsuse ironrdp_core::{
cast_length, ensure_fixed_part_size, ensure_size, Decode, DecodeResult, Encode, EncodeResult, ReadCursor,
WriteCursor,
};
use crate::geometry::InclusiveRectangle;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RefreshRectanglePdu {
pub areas_to_refresh: Vec<InclusiveRectangle>,
}
impl RefreshRectanglePdu {
const NAME: &'static str = "RefreshRectanglePdu";
const FIXED_PART_SIZE: usize = 1 + 3 ;
}
impl Encode for RefreshRectanglePdu {
fn encode(&self, dst: &mut WriteCursor<'_>) -> EncodeResult<()> {
ensure_size!(in: dst, size: self.size());
let n_areas = cast_length!("nAreas", self.areas_to_refresh.len())?;
dst.write_u8(n_areas);
write_padding!(dst, 3);
for rectangle in self.areas_to_refresh.iter() {
rectangle.encode(dst)?;
}
Ok(())
}
fn name(&self) -> &'static str {
Self::NAME
}
fn size(&self) -> usize {
Self::FIXED_PART_SIZE + self.areas_to_refresh.iter().map(|r| r.size()).sum::<usize>()
}
}
impl<'de> Decode<'de> for RefreshRectanglePdu {
fn decode(src: &mut ReadCursor<'de>) -> DecodeResult<Self> {
ensure_fixed_part_size!(in: src);
let number_of_areas = src.read_u8();
read_padding!(src, 3);
let areas_to_refresh = (0..number_of_areas)
.map(|_| InclusiveRectangle::decode(src))
.collect::<Result<Vec<_>, _>>()?;
Ok(Self { areas_to_refresh })
}
}