From ba7014468b034e08b4b163af41932b286c57bffc Mon Sep 17 00:00:00 2001 From: Admin Date: Sat, 26 Sep 2026 05:23:11 +0000 Subject: [PATCH] fix(linux): process self-test capture instead of discarding it --- src-tauri/src/capture.rs | 47 +++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/capture.rs b/src-tauri/src/capture.rs index 66bb1ec..06cfa9e 100644 --- a/src-tauri/src/capture.rs +++ b/src-tauri/src/capture.rs @@ -117,7 +117,11 @@ pub fn start(config: AppConfig, state: SharedState, app: AppHandle) -> Result Result) { +fn test_capture_sink_loop( + listener: TcpListener, + state: SharedState, + app: AppHandle, + stop: Arc, +) { while !stop.load(Ordering::SeqCst) { match listener.accept() { Ok((stream, _)) => { - thread::spawn(move || drain_test_capture_stream(stream)); + let state = state.clone(); + let app = app.clone(); + thread::spawn(move || handle_test_capture_stream(stream, state, app)); } Err(error) if error.kind() == ErrorKind::WouldBlock => { thread::sleep(Duration::from_millis(80)); @@ -145,17 +156,41 @@ fn test_capture_sink_loop(listener: TcpListener, stop: Arc) { } #[cfg(target_os = "linux")] -fn drain_test_capture_stream(mut stream: TcpStream) { +fn handle_test_capture_stream(mut stream: TcpStream, state: SharedState, app: AppHandle) { let _ = stream.set_read_timeout(Some(Duration::from_secs(2))); + let mut bytes = Vec::new(); let mut buffer = [0u8; 32 * 1024]; loop { match stream.read(&mut buffer) { Ok(0) => break, - Ok(_) => {} + Ok(read) => bytes.extend_from_slice(&buffer[..read]), Err(error) if matches!(error.kind(), ErrorKind::WouldBlock | ErrorKind::TimedOut) => break, - Err(_) => break, + Err(error) => { + process_payload( + &state, + &app, + "cups-test", + "FieldLens-Test-Capture".into(), + bytes, + false, + Some(format!("test capture read failed: {error}")), + ); + return; + } } } + + if !bytes.is_empty() { + process_payload( + &state, + &app, + "cups-test", + "FieldLens-Test-Capture".into(), + bytes, + false, + None, + ); + } } fn raw_proxy_loop(