ironrdp_pdu/rdp/capability_sets/
brush.rs1#[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}