lan_discovery_WOL: remove discovered peer

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou
2022-07-13 18:06:19 +08:00
parent cbb34fb021
commit 897d2b8e57
6 changed files with 73 additions and 34 deletions

View File

@@ -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<String, String>,
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<Vec<UdpSocket>> {
fn wait_response(
socket: UdpSocket,
timeout: Option<std::time::Duration>,
tx: UnboundedSender<DiscoveryPeer>,
tx: UnboundedSender<config::DiscoveryPeer>,
) -> 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<UdpSocket>) -> UnboundedReceiver<DiscoveryPeer> {
fn spawn_wait_responses(sockets: Vec<UdpSocket>) -> UnboundedReceiver<config::DiscoveryPeer> {
let (tx, rx) = unbounded_channel::<_>();
for socket in sockets {
let tx_clone = tx.clone();
@@ -755,12 +738,8 @@ fn spawn_wait_responses(sockets: Vec<UdpSocket>) -> UnboundedReceiver<DiscoveryP
rx
}
async fn handle_received_peers(mut rx: UnboundedReceiver<DiscoveryPeer>) -> ResultType<()> {
let mut peers: Vec<DiscoveryPeer> = match serde_json::from_str(&config::LanPeers::load().peers)
{
Ok(p) => p,
_ => Vec::new(),
};
async fn handle_received_peers(mut rx: UnboundedReceiver<config::DiscoveryPeer>) -> 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<DiscoveryPeer>) -> 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<DiscoveryPeer>) -> Resu
}
}
config::LanPeers::store(serde_json::to_string(&peers)?);
config::LanPeers::store(&peers);
Ok(())
}

View File

@@ -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();

View File

@@ -320,7 +320,7 @@ class SessionList: Reactor.Component {
<li #rdp>RDP<EditRdpPort /></li>
<div .separator />
<li #rename>{translate('Rename')}</li>
{this.type != "fav" && this.type != "lan" && <li #remove>{translate('Remove')}</li>}
{this.type != "fav" && <li #remove>{translate('Remove')}</li>}
{is_win && <li #shortcut>{translate('Create Desktop Shortcut')}</li>}
<li #forget-password>{translate('Unremember Password')}</li>
{(!this.type || this.type == "fav") && <li #add-fav>{translate('Add to Favorites')}</li>}
@@ -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();