ironrdp_pdu/rdp/capability_sets/
pointer.rs

1#[cfg(test)]
2mod tests;
3
4use ironrdp_core::{ensure_fixed_part_size, Decode, DecodeResult, Encode, EncodeResult, ReadCursor, WriteCursor};
5
6const POINTER_LENGTH: usize = 6;
7
8#[derive(Debug, PartialEq, Eq, Clone)]
9pub struct Pointer {
10    pub color_pointer_cache_size: u16,
11    pub pointer_cache_size: u16,
12}
13
14impl Pointer {
15    const NAME: &'static str = "Pointer";
16
17    const FIXED_PART_SIZE: usize = POINTER_LENGTH;
18}
19
20impl Encode for Pointer {
21    fn encode(&self, dst: &mut WriteCursor<'_>) -> EncodeResult<()> {
22        ensure_fixed_part_size!(in: dst);
23
24        dst.write_u16(1); // color pointer flag
25        dst.write_u16(self.color_pointer_cache_size);
26        dst.write_u16(self.pointer_cache_size);
27
28        Ok(())
29    }
30
31    fn name(&self) -> &'static str {
32        Self::NAME
33    }
34
35    fn size(&self) -> usize {
36        Self::FIXED_PART_SIZE
37    }
38}
39
40impl<'de> Decode<'de> for Pointer {
41    fn decode(src: &mut ReadCursor<'de>) -> DecodeResult<Self> {
42        ensure_fixed_part_size!(in: src);
43
44        let _color_pointer_flag = src.read_u16() != 0;
45        let color_pointer_cache_size = src.read_u16();
46        let pointer_cache_size = src.read_u16();
47
48        Ok(Pointer {
49            color_pointer_cache_size,
50            pointer_cache_size,
51        })
52    }
53}