ironrdp_displaycontrol/
server.rs1use 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
15pub struct DisplayControlServer {
17 handler: Box<dyn DisplayControlHandler>,
18}
19
20impl DisplayControlServer {
21 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 {}