ironrdp_pdu/rdp/capability_sets/
offscreen_bitmap_cache.rs1#[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}