ironrdp_displaycontrol/
server.rs

1use ironrdp_core::{decode, impl_as_any};
2use ironrdp_dvc::{DvcMessage, DvcProcessor, DvcServerProcessor};
3use ironrdp_pdu::{decode_err, PduResult};
4use tracing::debug;
5
6use crate::pdu::{DisplayControlCapabilities, DisplayControlMonitorLayout, DisplayControlPdu};
7use crate::CHANNEL_NAME;
8
9pub trait DisplayControlHandler: Send {
10    fn monitor_layout(&self, layout: DisplayControlMonitorLayout) {
11        debug!(?layout);
12    }
13}
14
15/// A server for the Display Control Virtual Channel.
16pub struct DisplayControlServer {
17    handler: Box<dyn DisplayControlHandler>,
18}
19
20impl DisplayControlServer {
21    /// Create a new DisplayControlServer.
22    pub fn new(handler: Box<dyn DisplayControlHandler>) -> Self {
23        Self { handler }
24    }
25}
26
27impl_as_any!(DisplayControlServer);
28
29impl DvcProcessor for DisplayControlServer {
30    fn channel_name(&self) -> &str {
31        CHANNEL_NAME
32    }
33
34    fn start(&mut self, _channel_id: u32) -> PduResult<Vec<DvcMessage>> {
35        let pdu: DisplayControlPdu = DisplayControlCapabilities::new(1, 3840, 2400)
36            .map_err(|e| decode_err!(e))?
37            .into();
38
39        Ok(vec![Box::new(pdu)])
40    }
41
42    fn process(&mut self, _channel_id: u32, payload: &[u8]) -> PduResult<Vec<DvcMessage>> {
43        match decode(payload).map_err(|e| decode_err!(e))? {
44            DisplayControlPdu::MonitorLayout(layout) => self.handler.monitor_layout(layout),
45            DisplayControlPdu::Caps(caps) => {
46                debug!(?caps);
47            }
48        }
49        Ok(Vec::new())
50    }
51}
52
53impl DvcServerProcessor for DisplayControlServer {}