From ee2478168c30bbaddc8008ab3be5e830e5b75782 Mon Sep 17 00:00:00 2001 From: fufesou <13586388+fufesou@users.noreply.github.com> Date: Fri, 28 Mar 2025 10:36:42 +0800 Subject: [PATCH] fix: remote printer (#11270) * fix: remote printer, log Signed-off-by: fufesou * fix: remote printer, avoid double sign Signed-off-by: fufesou * Spawn a new thread to handle the print job. Signed-off-by: fufesou --------- Signed-off-by: fufesou --- src/client/io_loop.rs | 41 +++++++++++++++++++++++++--------------- src/server/connection.rs | 10 ++++++---- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index 5f06c23fe..bca9badd4 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -1550,21 +1550,32 @@ impl Remote { fs::JobType::Generic => { self.handle_job_status(d.id, d.file_num, err); } - fs::JobType::Printer => - { - #[cfg(target_os = "windows")] - if let Some(data) = printer_data { - let printer_name = self - .handler - .printer_names - .write() - .unwrap() - .remove(&d.id); - crate::platform::send_raw_data_to_printer( - printer_name, - data, - ) - .ok(); + fs::JobType::Printer => { + if let Some(err) = err { + log::error!("Received printer job failed, error {err}"); + } else { + log::info!( + "Received printer job done, data len: {:?}", + printer_data.as_ref().map(|d| d.len()).unwrap_or(0) + ); + #[cfg(target_os = "windows")] + if let Some(data) = printer_data { + let printer_name = self + .handler + .printer_names + .write() + .unwrap() + .remove(&d.id); + // Spawn a new thread to handle the print job. + // Or print job will block the ui thread. + std::thread::spawn(move || { + crate::platform::send_raw_data_to_printer( + printer_name, + data, + ) + .ok(); + }); + } } } } diff --git a/src/server/connection.rs b/src/server/connection.rs index a225acb02..24038effd 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -2427,13 +2427,15 @@ impl Connection { fs::DataSource::FilePath(PathBuf::from(&path)); } JobType::Printer => { - if let Some(pd) = - self.printer_data.iter().find(|(_, p, _)| *p == path) + if let Some((_, _, data)) = self + .printer_data + .iter() + .position(|(_, p, _)| *p == path) + .map(|index| self.printer_data.remove(index)) { data_source = fs::DataSource::MemoryCursor( - std::io::Cursor::new(pd.2.clone()), + std::io::Cursor::new(data), ); - self.printer_data.retain(|f| f.1 != path); } else { // Ignore this message if the printer data is not found return true;