lan_discovery_WOL: remove discovered peer
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
parent
cbb34fb021
commit
897d2b8e57
23
Cargo.lock
generated
23
Cargo.lock
generated
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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<String, String>,
|
||||
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<DiscoveryPeer>,
|
||||
}
|
||||
|
||||
#[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<DiscoveryPeer>) {
|
||||
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);
|
||||
}
|
||||
|
@ -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(())
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user