diff --git a/src/server.rs b/src/server.rs index 6229909..4c265a2 100644 --- a/src/server.rs +++ b/src/server.rs @@ -253,7 +253,7 @@ impl Server { self.notifies.capture.notify_waiters() } - async fn capture_notified(&self) { + async fn capture_enabled(&self) { self.notifies.capture.notified().await } @@ -563,6 +563,27 @@ impl Server { .get_mut(handle) .and_then(|(c, _)| c.hostname.clone()) } + + fn get_state(&self) -> State { + self.state.get() + } + + fn set_state(&self, state: State) { + log::debug!("state => {state:?}"); + self.state.replace(state); + } + + fn set_active(&self, handle: Option) { + log::debug!("active client => {handle:?}"); + self.active_client.replace(handle); + } + + fn active_addr(&self, handle: u64) -> Option { + self.client_manager + .borrow() + .get(handle) + .and_then(|(_, s)| s.active_addr) + } } async fn listen_frontend( diff --git a/src/server/capture_task.rs b/src/server/capture_task.rs index ec52632..d43e9ff 100644 --- a/src/server/capture_task.rs +++ b/src/server/capture_task.rs @@ -53,7 +53,7 @@ async fn capture_task( loop { tokio::select! { _ = notify_rx.recv() => continue, /* need to ignore requests here! */ - _ = server.capture_notified() => break, + _ = server.capture_enabled() => break, _ = server.cancelled() => return, } } @@ -123,68 +123,38 @@ async fn handle_capture_event( sender_tx: &Sender<(Event, SocketAddr)>, event: (CaptureHandle, Event), ) -> Result<(), CaptureError> { - let (handle, mut e) = event; - log::trace!("({handle}) {e:?}"); + let (handle, event) = event; + log::trace!("({handle}) {event:?}"); + + // capture started + if event == Event::Enter() { + server.set_state(State::AwaitingLeave); + server.set_active(Some(handle)); + server.restart_ping_timer(); + spawn_hook_command(server, handle); + } + + // release capture if emulation set state to Receiveing + if server.get_state() == State::Receiving { + capture.release().await?; + return Ok(()); + } // check release bind if capture.keys_pressed(&server.release_bind) { capture.release().await?; - server.state.replace(State::Receiving); - e = Event::Disconnect(); + server.set_state(State::Receiving); } - let info = { - let mut enter = false; - let mut start_timer = false; - - // get client state for handle - let mut client_manager = server.client_manager.borrow_mut(); - let client_state = client_manager.get_mut(handle).map(|(_, s)| s); - if let Some(client_state) = client_state { - // if we just entered the client we want to send additional enter events until - // we get a leave event - if let Event::Enter() = e { - server.state.replace(State::AwaitingLeave); - server.active_client.replace(Some(handle)); - log::trace!("Active client => {}", handle); - start_timer = true; - log::trace!("STATE ===> AwaitingLeave"); - enter = true; - } else { - // ignore any potential events in receiving mode - if server.state.get() == State::Receiving && e != Event::Disconnect() { - return Ok(()); - } - } - Some((client_state.active_addr, enter, start_timer)) - } else { - None - } - }; - - let (addr, enter, start_timer) = match info { - Some(i) => i, - None => { - // should not happen - log::warn!("unknown client!"); - capture.release().await?; - server.state.replace(State::Receiving); - log::trace!("STATE ===> Receiving"); - return Ok(()); - } - }; - - if start_timer { - server.restart_ping_timer(); - } - if enter { - spawn_hook_command(server, handle); - } - if let Some(addr) = addr { - if enter { - let _ = sender_tx.send((Event::Enter(), addr)).await; - } - let _ = sender_tx.send((e, addr)).await; + if let Some(addr) = server.active_addr(handle) { + let event = match server.get_state() { + State::Sending => event, + /* send additional enter events until acknowleged */ + State::AwaitingLeave => Event::Enter(), + /* released capture */ + State::Receiving => Event::Disconnect(), + }; + sender_tx.send((event, addr)).await.expect("sender closed"); } Ok(()) }