ironrdp_pdu/rdp/capability_sets/
large_pointer.rs1use 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}