ironrdp_pdu/rdp/capability_sets/
surface_commands.rs

1#[cfg(test)]
2mod tests;
3
4use bitflags::bitflags;
5use ironrdp_core::{ensure_fixed_part_size, Decode, DecodeResult, Encode, EncodeResult, ReadCursor, WriteCursor};
6
7const SURFACE_COMMANDS_LENGTH: usize = 8;
8
9bitflags! {
10    #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11    pub struct CmdFlags: u32 {
12        const SET_SURFACE_BITS = 0x02;
13        const FRAME_MARKER = 0x10;
14        const STREAM_SURFACE_BITS = 0x40;
15    }
16}
17
18#[derive(Debug, PartialEq, Eq, Clone)]
19pub struct SurfaceCommands {
20    pub flags: CmdFlags,
21}
22
23impl SurfaceCommands {
24    const NAME: &'static str = "SurfaceCommands";
25
26    const FIXED_PART_SIZE: usize = SURFACE_COMMANDS_LENGTH;
27}
28
29impl Encode for SurfaceCommands {
30    fn encode(&self, dst: &mut WriteCursor<'_>) -> EncodeResult<()> {
31        ensure_fixed_part_size!(in: dst);
32
33        dst.write_u32(self.flags.bits());
34        dst.write_u32(0); // reserved
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 SurfaceCommands {
49    fn decode(src: &mut ReadCursor<'de>) -> DecodeResult<Self> {
50        ensure_fixed_part_size!(in: src);
51
52        let flags = CmdFlags::from_bits_truncate(src.read_u32());
53        let _reserved = src.read_u32();
54
55        Ok(SurfaceCommands { flags })
56    }
57}