diff --git a/src/ipc.rs b/src/ipc.rs index d74842d64..d4d803aec 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -208,7 +208,8 @@ pub enum Data { Empty, Disconnected, DataPortableService(DataPortableService), - SwitchBack, + SwitchSidesRequest(String), + SwitchSidesBack, } #[tokio::main(flavor = "current_thread")] @@ -429,6 +430,15 @@ async fn handle(data: Data, stream: &mut Connection) { Data::TestRendezvousServer => { crate::test_rendezvous_server(); } + Data::SwitchSidesRequest(id) => { + let uuid = uuid::Uuid::new_v4(); + crate::server::insert_switch_sides_uuid(id, uuid.clone()); + allow_err!( + stream + .send(&Data::SwitchSidesRequest(uuid.to_string())) + .await + ); + } _ => {} } } diff --git a/src/server/connection.rs b/src/server/connection.rs index e60d4652c..e4ab1b22e 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -366,7 +366,7 @@ impl Connection { log::error!("Failed to start portable service from cm:{:?}", e); } } - ipc::Data::SwitchBack => { + ipc::Data::SwitchSidesBack => { let mut misc = Misc::new(); misc.set_switch_back(SwitchBack::default()); let mut msg = Message::new(); @@ -1796,7 +1796,6 @@ impl Connection { } } -#[cfg(feature = "flutter")] pub fn insert_switch_sides_uuid(id: String, uuid: uuid::Uuid) { SWITCH_SIDES_UUID .lock() diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index dd0ce2b24..ea3553c8a 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -248,7 +248,7 @@ pub fn get_clients_length() -> usize { #[cfg(feature = "flutter")] pub fn switch_back(id: i32) { if let Some(client) = CLIENTS.read().unwrap().get(&id) { - allow_err!(client.tx.send(Data::SwitchBack)); + allow_err!(client.tx.send(Data::SwitchSidesBack)); }; } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index a5f55a05d..a16327d75 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -17,6 +17,7 @@ use hbb_common::{fs, get_version_number, log, Stream}; use rdev::{Event, EventType::*}; use std::collections::HashMap; use std::ops::{Deref, DerefMut}; +use std::str::FromStr; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::{Arc, Mutex, RwLock}; use uuid::Uuid; @@ -619,17 +620,38 @@ impl Session { self.send(Data::ElevateWithLogon(username, password)); } - pub fn switch_sides(&self) { - let uuid = Uuid::new_v4(); - crate::server::insert_switch_sides_uuid(self.id.clone(), uuid.clone()); - let mut misc = Misc::new(); - misc.set_switch_sides_request(SwitchSidesRequest { - uuid: Bytes::from(uuid.as_bytes().to_vec()), - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); + #[tokio::main(flavor = "current_thread")] + pub async fn switch_sides(&self) { + match crate::ipc::connect(1000, "").await { + Ok(mut conn) => { + if conn + .send(&crate::ipc::Data::SwitchSidesRequest(self.id.to_string())) + .await + .is_ok() + { + if let Ok(Some(data)) = conn.next_timeout(1000).await { + match data { + crate::ipc::Data::SwitchSidesRequest(str_uuid) => { + if let Ok(uuid) = Uuid::from_str(&str_uuid) { + let mut misc = Misc::new(); + misc.set_switch_sides_request(SwitchSidesRequest { + uuid: Bytes::from(uuid.as_bytes().to_vec()), + ..Default::default() + }); + let mut msg_out = Message::new(); + msg_out.set_misc(misc); + self.send(Data::Message(msg_out)); + } + } + _ => {} + } + } + } + } + Err(err) => { + log::info!("server not started (will try to start): {}", err); + } + } } }