ironrdp_pdu/rdp/capability_sets/
brush.rs

1#[cfg(test)]
2mod tests;
3
4use ironrdp_core::{
5    ensure_fixed_part_size, invalid_field_err, Decode, DecodeResult, Encode, EncodeResult, ReadCursor, WriteCursor,
6};
7use num_derive::{FromPrimitive, ToPrimitive};
8use num_traits::{FromPrimitive as _, ToPrimitive as _};
9
10const BRUSH_LENGTH: usize = 4;
11
12#[derive(Copy, Clone, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
13pub enum SupportLevel {
14    Default = 0,
15    Color8x8 = 1,
16    ColorFull = 2,
17}
18
19#[derive(Debug, PartialEq, Eq, Clone)]
20pub struct Brush {
21    pub support_level: SupportLevel,
22}
23
24impl Brush {
25    const NAME: &'static str = "Brush";
26
27    const FIXED_PART_SIZE: usize = BRUSH_LENGTH;
28}
29
30impl Encode for Brush {
31    fn encode(&self, dst: &mut WriteCursor<'_>) -> EncodeResult<()> {
32        ensure_fixed_part_size!(in: dst);
33
34        dst.write_u32(self.support_level.to_u32().unwrap());
35
36        Ok(())
37    }
38
39    fn name(&self) -> &'static str {
40        Self::NAME
41    }
42
43    fn size(&self) -> usize {
44        Self::FIXED_PART_SIZE
45    }
46}
47
48impl<'de> Decode<'de> for Brush {
49    fn decode(src: &mut ReadCursor<'de>) -> DecodeResult<Self> {
50        ensure_fixed_part_size!(in: src);
51
52        let support_level = SupportLevel::from_u32(src.read_u32())
53            .ok_or_else(|| invalid_field_err!("supportLevel", "invalid brush support level"))?;
54
55        Ok(Brush { support_level })
56    }
57}