diff --git a/crates/ironrdp-cliprdr-native/src/stub.rs b/crates/ironrdp-cliprdr-native/src/stub.rs index 727462c1..e6baf6e6 100644 --- a/crates/ironrdp-cliprdr-native/src/stub.rs +++ b/crates/ironrdp-cliprdr-native/src/stub.rs @@ -54,6 +54,8 @@ impl CliprdrBackend for StubCliprdrBackend { ".cliprdr" } + fn on_ready(&mut self) {} + fn client_capabilities(&self) -> ClipboardGeneralCapabilityFlags { // No additional capabilities yet ClipboardGeneralCapabilityFlags::empty() diff --git a/crates/ironrdp-cliprdr-native/src/windows/cliprdr_backend.rs b/crates/ironrdp-cliprdr-native/src/windows/cliprdr_backend.rs index 7660cfa4..0192ab3e 100644 --- a/crates/ironrdp-cliprdr-native/src/windows/cliprdr_backend.rs +++ b/crates/ironrdp-cliprdr-native/src/windows/cliprdr_backend.rs @@ -54,6 +54,8 @@ impl CliprdrBackend for WinCliprdrBackend { ClipboardGeneralCapabilityFlags::empty() } + fn on_ready(&mut self) {} + fn on_process_negotiated_capabilities(&mut self, capabilities: ClipboardGeneralCapabilityFlags) { self.send_event(BackendEvent::DowngradedCapabilities(capabilities)) } diff --git a/crates/ironrdp-cliprdr/src/backend.rs b/crates/ironrdp-cliprdr/src/backend.rs index 988708ec..b000735f 100644 --- a/crates/ironrdp-cliprdr/src/backend.rs +++ b/crates/ironrdp-cliprdr/src/backend.rs @@ -60,6 +60,9 @@ pub trait CliprdrBackend: AsAny + core::fmt::Debug + Send { /// [crate::Cliprdr] capabilities. fn client_capabilities(&self) -> ClipboardGeneralCapabilityFlags; + /// Called by [crate::Cliprdr] when it is ready to process clipboard data (channel initialized) + fn on_ready(&mut self); + /// Processes signal to start clipboard copy sequence. /// /// Trait implementer is responsible for gathering its list of available [`ClipboardFormat`] diff --git a/crates/ironrdp-cliprdr/src/lib.rs b/crates/ironrdp-cliprdr/src/lib.rs index 9c4b25f3..8aef740d 100644 --- a/crates/ironrdp-cliprdr/src/lib.rs +++ b/crates/ironrdp-cliprdr/src/lib.rs @@ -154,6 +154,7 @@ impl Cliprdr { if self.state == CliprdrState::Initialization { info!("CLIPRDR(clipboard) virtual channel has been initialized"); self.state = CliprdrState::Ready; + self.backend.on_ready(); } else { info!("CLIPRDR(clipboard) Remote has received format list successfully"); } @@ -173,6 +174,7 @@ impl Cliprdr { if R::is_server() && self.state == CliprdrState::Initialization { info!("CLIPRDR(clipboard) virtual channel has been initialized"); self.state = CliprdrState::Ready; + self.backend.on_ready(); } let formats = format_list.get_formats(self.are_long_format_names_enabled())?; diff --git a/crates/ironrdp-web/src/clipboard/mod.rs b/crates/ironrdp-web/src/clipboard/mod.rs index 31e107fe..8cc035d5 100644 --- a/crates/ironrdp-web/src/clipboard/mod.rs +++ b/crates/ironrdp-web/src/clipboard/mod.rs @@ -540,6 +540,8 @@ impl CliprdrBackend for WasmClipboardBackend { ClipboardGeneralCapabilityFlags::empty() } + fn on_ready(&mut self) {} + fn on_request_format_list(&mut self) { // Initial clipboard is assumed to be empty on WASM (TODO: This is only relevant for Firefox?) self.send_event(WasmClipboardBackendMessage::ForceClipboardUpdate);