Skip to content

Commit b727016

Browse files
authored
Add files via upload
1 parent 7d06de0 commit b727016

File tree

1 file changed

+138
-68
lines changed

1 file changed

+138
-68
lines changed

src/client.rs

Lines changed: 138 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,41 +1782,13 @@ impl LoginConfigHandler {
17821782
shared_password: Option<String>,
17831783
conn_token: Option<String>,
17841784
) {
1785-
let mut id = id;
1786-
if id.contains("@") {
1787-
let mut v = id.split("@");
1788-
let raw_id: &str = v.next().unwrap_or_default();
1789-
let mut server_key = v.next().unwrap_or_default().split('?');
1790-
let server = server_key.next().unwrap_or_default();
1791-
let args = server_key.next().unwrap_or_default();
1792-
let key = if server == PUBLIC_SERVER {
1793-
config::RS_PUB_KEY.to_owned()
1794-
} else {
1795-
let mut args_map: HashMap<String, &str> = HashMap::new();
1796-
for arg in args.split('&') {
1797-
if let Some(kv) = arg.find('=') {
1798-
let k = arg[0..kv].to_lowercase();
1799-
let v = &arg[kv + 1..];
1800-
args_map.insert(k, v);
1801-
}
1802-
}
1803-
let key = args_map.remove("key").unwrap_or_default();
1804-
key.to_owned()
1805-
};
1806-
1807-
// here we can check <id>/r@server
1808-
let real_id = crate::ui_interface::handle_relay_id(raw_id).to_string();
1809-
if real_id != raw_id {
1810-
force_relay = true;
1811-
}
1812-
self.other_server = Some((real_id.clone(), server.to_owned(), key));
1813-
id = format!("{real_id}@{server}");
1814-
} else {
1815-
let real_id = crate::ui_interface::handle_relay_id(&id);
1816-
if real_id != id {
1817-
force_relay = true;
1818-
id = real_id.to_owned();
1819-
}
1785+
let format_id = format_id(id.as_str());
1786+
let id = format_id.id;
1787+
if format_id.force_relay {
1788+
force_relay = true;
1789+
};
1790+
if format_id.server.is_some() {
1791+
self.other_server = format_id.server;
18201792
}
18211793

18221794
self.id = id;
@@ -1976,24 +1948,13 @@ impl LoginConfigHandler {
19761948
///
19771949
/// # Arguments
19781950
///
1979-
/// * `value` - The scroll style to be saved.
1951+
/// * `value` - The view style to be saved.
19801952
pub fn save_scroll_style(&mut self, value: String) {
19811953
let mut config = self.load_config();
19821954
config.scroll_style = value;
19831955
self.save_config(config);
19841956
}
19851957

1986-
/// Save edge scroll edge thickness to the current config.
1987-
///
1988-
/// # Arguments
1989-
///
1990-
/// * `value` - The edge thickness to be saved.
1991-
pub fn save_edge_scroll_edge_thickness(&mut self, value: i32) {
1992-
let mut config = self.load_config();
1993-
config.edge_scroll_edge_thickness = value;
1994-
self.save_config(config);
1995-
}
1996-
19971958
/// Set a ui config of flutter for handler's [`PeerConfig`].
19981959
///
19991960
/// # Arguments
@@ -3924,14 +3885,65 @@ async fn hc_connection_(
39243885
Ok(())
39253886
}
39263887

3888+
#[derive(Debug, Clone)]
3889+
pub struct FormatId {
3890+
pub id: String,
3891+
pub server: Option<(String, String, String)>,
3892+
pub force_relay: bool,
3893+
}
3894+
3895+
fn format_id(id: &str) -> FormatId {
3896+
if id.contains("@") {
3897+
let mut force_relay = false;
3898+
let mut v = id.split("@");
3899+
let raw_id: &str = v.next().unwrap_or_default();
3900+
let mut server_key = v.next().unwrap_or_default().split('?');
3901+
let server = server_key.next().unwrap_or_default();
3902+
let args = server_key.next().unwrap_or_default();
3903+
let key = if server == PUBLIC_SERVER {
3904+
config::RS_PUB_KEY.to_owned()
3905+
} else {
3906+
let mut args_map: HashMap<String, &str> = HashMap::new();
3907+
for arg in args.split('&') {
3908+
if let Some(kv) = arg.find('=') {
3909+
let k = arg[0..kv].to_lowercase();
3910+
let v = &arg[kv + 1..];
3911+
args_map.insert(k, v);
3912+
}
3913+
}
3914+
let key = args_map.remove("key").unwrap_or_default();
3915+
key.to_owned()
3916+
};
3917+
3918+
// here we can check <id>/r@server
3919+
let real_id = crate::ui_interface::handle_relay_id(raw_id).to_string();
3920+
if real_id != raw_id {
3921+
force_relay = true;
3922+
}
3923+
FormatId {
3924+
id: format!("{real_id}@{server}"),
3925+
server: Some((real_id.to_string(), server.to_string(), key.to_string())),
3926+
force_relay,
3927+
}
3928+
} else {
3929+
let real_id = crate::ui_interface::handle_relay_id(&id);
3930+
FormatId {
3931+
id: real_id.to_string(),
3932+
server: None,
3933+
force_relay: real_id != id,
3934+
}
3935+
}
3936+
}
39273937
pub mod peer_online {
3938+
use std::collections::HashMap;
3939+
39283940
use hbb_common::{
39293941
anyhow::bail,
39303942
config::{Config, CONNECT_TIMEOUT, READ_TIMEOUT},
39313943
log,
39323944
rendezvous_proto::*,
39333945
sleep,
3934-
socket_client::connect_tcp,
3946+
socket_client::{check_port, connect_tcp},
39353947
ResultType, Stream,
39363948
};
39373949

@@ -3944,35 +3956,93 @@ pub mod peer_online {
39443956
f(onlines, offlines)
39453957
} else {
39463958
let query_timeout = std::time::Duration::from_millis(3_000);
3947-
match query_online_states_(&ids, query_timeout).await {
3948-
Ok((onlines, offlines)) => {
3949-
f(onlines, offlines);
3950-
}
3951-
Err(e) => {
3952-
log::debug!("query onlines, {}", &e);
3959+
let (rendezvous_server, _servers, _contained) =
3960+
crate::get_rendezvous_server(READ_TIMEOUT).await;
3961+
3962+
let group = ids
3963+
.iter()
3964+
.map(|id| (id, super::format_id(id)))
3965+
.map(|(raw_id, format)| {
3966+
if let Some((pure_id, server, _key)) = format.server {
3967+
(raw_id, pure_id, server)
3968+
} else {
3969+
(raw_id, format.id, rendezvous_server.clone())
3970+
}
3971+
})
3972+
.map(|(raw_id, id, server)| {
3973+
if server == crate::client::PUBLIC_SERVER {
3974+
(
3975+
raw_id,
3976+
id,
3977+
hbb_common::config::RENDEZVOUS_SERVERS[0].to_string(),
3978+
)
3979+
} else {
3980+
(
3981+
raw_id,
3982+
id,
3983+
check_port(server, hbb_common::config::RENDEZVOUS_PORT),
3984+
)
3985+
}
3986+
})
3987+
.fold(HashMap::new(), |mut map, (raw_id, id, server)| {
3988+
map.entry(server)
3989+
.or_insert(HashMap::new())
3990+
.insert(id, raw_id);
3991+
map
3992+
});
3993+
3994+
let query_group = group.iter().map(|(server, map)| {
3995+
let ids: Vec<String> = map.keys().map(|t| t.to_string()).collect();
3996+
(map, query_online_states_(ids, query_timeout, server))
3997+
});
3998+
3999+
let mut onlines = Vec::new();
4000+
let mut offlines = Vec::new();
4001+
4002+
for (map, query) in query_group.into_iter() {
4003+
match query.await {
4004+
Ok((on, off)) => {
4005+
for id in on.iter() {
4006+
if let Some(raw_id) = map.get(id) {
4007+
onlines.push(raw_id.to_string());
4008+
}
4009+
}
4010+
for id in off.iter() {
4011+
if let Some(raw_id) = map.get(id) {
4012+
offlines.push(raw_id.to_string());
4013+
}
4014+
}
4015+
}
4016+
Err(e) => {
4017+
log::debug!("query onlines, {}", &e);
4018+
}
39534019
}
39544020
}
4021+
f(onlines, offlines);
39554022
}
39564023
}
39574024

3958-
async fn create_online_stream() -> ResultType<Stream> {
3959-
let (rendezvous_server, _servers, _contained) =
3960-
crate::get_rendezvous_server(READ_TIMEOUT).await;
3961-
let tmp: Vec<&str> = rendezvous_server.split(":").collect();
3962-
if tmp.len() != 2 {
3963-
bail!("Invalid server address: {}", rendezvous_server);
3964-
}
3965-
let port: u16 = tmp[1].parse()?;
3966-
if port == 0 {
3967-
bail!("Invalid server address: {}", rendezvous_server);
4025+
async fn create_online_stream(rendezvous_server: &str) -> ResultType<Stream> {
4026+
let tmp = rendezvous_server.rfind(':').map(|pos| {
4027+
let url = &rendezvous_server[..pos];
4028+
let port: u16 = rendezvous_server[pos + 1..].parse().unwrap_or(0);
4029+
(url, port)
4030+
});
4031+
match tmp {
4032+
Some((url, port)) if port > 0 => {
4033+
let online_server = format!("{}:{}", url, port - 1);
4034+
connect_tcp(online_server, CONNECT_TIMEOUT).await
4035+
}
4036+
_ => {
4037+
bail!("Invalid server address: {}", rendezvous_server);
4038+
}
39684039
}
3969-
let online_server = format!("{}:{}", tmp[0], port - 1);
3970-
connect_tcp(online_server, CONNECT_TIMEOUT).await
39714040
}
39724041

39734042
async fn query_online_states_(
3974-
ids: &Vec<String>,
4043+
ids: Vec<String>,
39754044
timeout: std::time::Duration,
4045+
rendezvous_server: &str,
39764046
) -> ResultType<(Vec<String>, Vec<String>)> {
39774047
let mut msg_out = RendezvousMessage::new();
39784048
msg_out.set_online_request(OnlineRequest {
@@ -3981,7 +4051,7 @@ pub mod peer_online {
39814051
..Default::default()
39824052
});
39834053

3984-
let mut socket = match create_online_stream().await {
4054+
let mut socket = match create_online_stream(rendezvous_server).await {
39854055
Ok(s) => s,
39864056
Err(e) => {
39874057
log::debug!("Failed to create peers online stream, {e}");

0 commit comments

Comments
 (0)