ironrdp_pdu/rdp/capability_sets/
large_pointer.rs

1use bitflags::bitflags;
2use ironrdp_core::{ensure_fixed_part_size, Decode, DecodeResult, Encode, EncodeResult, ReadCursor, WriteCursor};
3
4#[derive(Debug, PartialEq, Eq, Clone)]
5pub struct LargePointer {
6    pub flags: LargePointerSupportFlags,
7}
8
9impl LargePointer {
10    const NAME: &'static str = "LargePointer";
11
12    const FIXED_PART_SIZE: usize = 2;
13}
14
15impl Encode for LargePointer {
16    fn encode(&self, dst: &mut WriteCursor<'_>) -> EncodeResult<()> {
17        ensure_fixed_part_size!(in: dst);
18
19        dst.write_u16(self.flags.bits());
20
21        Ok(())
22    }
23
24    fn name(&self) -> &'static str {
25        Self::NAME
26    }
27
28    fn size(&self) -> usize {
29        Self::FIXED_PART_SIZE
30    }
31}
32
33impl<'de> Decode<'de> for LargePointer {
34    fn decode(src: &mut ReadCursor<'de>) -> DecodeResult<Self> {
35        ensure_fixed_part_size!(in: src);
36
37        let flags = LargePointerSupportFlags::from_bits_truncate(src.read_u16());
38
39        Ok(Self { flags })
40    }
41}
42
43bitflags! {
44    #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
45    pub struct LargePointerSupportFlags: u16 {
46        const UP_TO_96X96_PIXELS = 1;
47        const UP_TO_384X384_PIXELS = 2;
48    }
49}
50
51#[cfg(test)]
52mod test {
53    use ironrdp_core::{decode, encode_vec};
54
55    use super::*;
56
57    const LARGE_POINTER_PDU_BUFFER: [u8; 2] = [0x01, 0x00];
58    const LARGE_POINTER_PDU: LargePointer = LargePointer {
59        flags: LargePointerSupportFlags::UP_TO_96X96_PIXELS,
60    };
61
62    #[test]
63    fn from_buffer_correctly_parses_large_pointer() {
64        assert_eq!(LARGE_POINTER_PDU, decode(LARGE_POINTER_PDU_BUFFER.as_ref()).unwrap());
65    }
66
67    #[test]
68    fn to_buffer_correctly_serializes_large_pointer() {
69        let expected = LARGE_POINTER_PDU_BUFFER.as_ref();
70
71        let buffer = encode_vec(&LARGE_POINTER_PDU).unwrap();
72        assert_eq!(expected, buffer.as_slice());
73    }
74
75    #[test]
76    fn buffer_length_is_correct_for_large_pointer() {
77        assert_eq!(LARGE_POINTER_PDU_BUFFER.len(), LARGE_POINTER_PDU.size());
78    }
79}