ironrdp_pdu/rdp/capability_sets/
offscreen_bitmap_cache.rs

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