diff --git a/Cargo.lock b/Cargo.lock index e581e842e..894382389 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2177,6 +2177,7 @@ dependencies = [ "serde 1.0.139", "serde_derive", "serde_json 1.0.82", + "serde_with", "socket2 0.3.19", "sodiumoxide", "tokio", @@ -4427,6 +4428,28 @@ dependencies = [ "serde 1.0.139", ] +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +dependencies = [ + "serde 1.0.139", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling 0.13.4", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_yaml" version = "0.8.25" diff --git a/libs/hbb_common/Cargo.toml b/libs/hbb_common/Cargo.toml index acb93c78b..6fec67193 100644 --- a/libs/hbb_common/Cargo.toml +++ b/libs/hbb_common/Cargo.toml @@ -23,6 +23,7 @@ directories-next = "2.0" rand = "0.8" serde_derive = "1.0" serde = "1.0" +serde_with = "1.14.0" lazy_static = "1.4" confy = { git = "https://github.com/open-trade/confy" } dirs-next = "2.0" diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index b4d8eaff3..ee8433770 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -856,10 +856,34 @@ impl LocalConfig { } } +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +pub struct DiscoveryPeer { + pub id: String, + #[serde(with = "serde_with::rust::map_as_tuple_list")] + pub mac_ips: HashMap, + pub username: String, + pub hostname: String, + pub platform: String, + pub online: bool, +} + +impl DiscoveryPeer { + pub fn is_same_peer(&self, other: &DiscoveryPeer) -> bool { + self.id == other.id && self.username == other.username + } +} + #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct LanPeers { - #[serde(default)] - pub peers: String, + // #[serde(default)] + // pub peers: String, + pub peers: Vec, +} + +#[derive(Serialize, Deserialize)] +struct MyConfig { + version: u8, + api_key: String, } impl LanPeers { @@ -874,8 +898,10 @@ impl LanPeers { } } - pub fn store(peers: String) { - let f = LanPeers { peers }; + pub fn store(peers: &Vec) { + let f = LanPeers { + peers: peers.clone(), + }; if let Err(err) = confy::store_path(Config::file_("_lan_peers"), f) { log::error!("Failed to store lan peers: {}", err); } diff --git a/src/rendezvous_mediator.rs b/src/rendezvous_mediator.rs index 9471ad4b7..d87357366 100644 --- a/src/rendezvous_mediator.rs +++ b/src/rendezvous_mediator.rs @@ -16,7 +16,6 @@ use hbb_common::{ udp::FramedSocket, AddrMangle, IntoTargetAddr, ResultType, TargetAddr, }; -use serde_derive::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet}, net::{IpAddr, Ipv4Addr, SocketAddr, ToSocketAddrs, UdpSocket}, @@ -547,22 +546,6 @@ pub fn get_broadcast_port() -> u16 { (RENDEZVOUS_PORT + 3) as _ } -#[derive(Debug, Default, Serialize, Deserialize, Clone)] -pub struct DiscoveryPeer { - id: String, - mac_ips: HashMap, - username: String, - hostname: String, - platform: String, - online: bool, -} - -impl DiscoveryPeer { - fn is_same_peer(&self, other: &DiscoveryPeer) -> bool { - self.id == other.id && self.username == other.username - } -} - pub fn get_mac(ip: &IpAddr) -> String { #[cfg(not(any(target_os = "android", target_os = "ios")))] if let Ok(mac) = get_mac_by_ip(ip) { @@ -695,7 +678,7 @@ fn send_query() -> ResultType> { fn wait_response( socket: UdpSocket, timeout: Option, - tx: UnboundedSender, + tx: UnboundedSender, ) -> ResultType<()> { let mut last_recv_time = Instant::now(); @@ -715,7 +698,7 @@ fn wait_response( }; if mac != p.mac { - allow_err!(tx.send(DiscoveryPeer { + allow_err!(tx.send(config::DiscoveryPeer { id: p.id.clone(), mac_ips: HashMap::from([( p.mac.clone(), @@ -740,7 +723,7 @@ fn wait_response( Ok(()) } -fn spawn_wait_responses(sockets: Vec) -> UnboundedReceiver { +fn spawn_wait_responses(sockets: Vec) -> UnboundedReceiver { let (tx, rx) = unbounded_channel::<_>(); for socket in sockets { let tx_clone = tx.clone(); @@ -755,12 +738,8 @@ fn spawn_wait_responses(sockets: Vec) -> UnboundedReceiver) -> ResultType<()> { - let mut peers: Vec = match serde_json::from_str(&config::LanPeers::load().peers) - { - Ok(p) => p, - _ => Vec::new(), - }; +async fn handle_received_peers(mut rx: UnboundedReceiver) -> ResultType<()> { + let mut peers = config::LanPeers::load().peers; peers.iter_mut().for_each(|peer| { peer.online = false; }); @@ -793,7 +772,7 @@ async fn handle_received_peers(mut rx: UnboundedReceiver) -> Resu } if last_write_time.elapsed().as_millis() > 300 { - config::LanPeers::store(serde_json::to_string(&peers)?); + config::LanPeers::store(&peers); last_write_time = Instant::now(); } } @@ -804,7 +783,7 @@ async fn handle_received_peers(mut rx: UnboundedReceiver) -> Resu } } - config::LanPeers::store(serde_json::to_string(&peers)?); + config::LanPeers::store(&peers); Ok(()) } diff --git a/src/ui.rs b/src/ui.rs index a1f9093d0..4bf201c0e 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -541,6 +541,12 @@ impl UI { PeerConfig::remove(&id); } + fn remove_discovered(&mut self, id: String) { + let mut peers = config::LanPeers::load().peers; + peers.retain(|x| x.id != id); + config::LanPeers::store(&peers); + } + fn new_remote(&mut self, id: String, remote_type: String) { let mut lock = self.0.lock().unwrap(); let args = vec![format!("--{}", remote_type), id.clone()]; @@ -690,7 +696,7 @@ impl UI { } fn get_lan_peers(&self) -> String { - config::LanPeers::load().peers + serde_json::to_string(&config::LanPeers::load().peers).unwrap_or_default() } fn get_uuid(&self) -> String { @@ -781,6 +787,7 @@ impl sciter::EventHandler for UI { fn get_size(); fn new_remote(String, bool); fn remove_peer(String); + fn remove_discovered(String); fn get_connect_status(); fn get_mouse_time(); fn check_mouse_time(); diff --git a/src/ui/ab.tis b/src/ui/ab.tis index f2c8746d4..03768c6da 100644 --- a/src/ui/ab.tis +++ b/src/ui/ab.tis @@ -320,7 +320,7 @@ class SessionList: Reactor.Component {
  • RDP
  • {translate('Rename')}
  • - {this.type != "fav" && this.type != "lan" &&
  • {translate('Remove')}
  • } + {this.type != "fav" &&
  • {translate('Remove')}
  • } {is_win &&
  • {translate('Create Desktop Shortcut')}
  • }
  • {translate('Unremember Password')}
  • {(!this.type || this.type == "fav") &&
  • {translate('Add to Favorites')}
  • } @@ -429,6 +429,9 @@ class SessionList: Reactor.Component { break; } } + } else if (this.type == "lan") { + handler.remove_discovered(id); + app.update(); } else { handler.remove_peer(id); app.update();