This mapping has 36 multi-map groups: several pairings are equally correct there. The code view shows one arbitrary valid pairing, not the only one.

Before

…lines 1–81 unchanged (81 lines)
82#[derive(Default)]
83struct ParsedPeerInfo {
84 platform: String,
85 is_installed: bool,
86 idd_impl: String,
87 support_view_camera: bool,
88}
89
90impl ParsedPeerInfo {
91 fn is_support_virtual_display(&self) -> bool {
92 self.is_installed
93 && self.platform == "Windows"
94 && (self.idd_impl == "rustdesk_idd" || self.idd_impl == "amyuni_idd")
…lines 95–127 unchanged (33 lines)
128 }
129
130 pub async fn io_loop(&mut self, key: &str, token: &str, round: u32) {
131 #[cfg(target_os = "windows")]
132 let _file_clip_context_holder = {
133 // `is_port_forward()` will not reach here, but we still check it for clarity.
134 if !self.handler.is_file_transfer()
135 && !self.handler.is_port_forward()
136 && !self.handler.is_view_camera()
137 {
138 // It is ok to call this function multiple times.
139 ContextSend::enable(true);
140 Some(crate::SimpleCallOnReturn {
141 b: true,
142 f: Box::new(|| {
143 // No need to call `enable(false)` for sciter version, because each client of sciter version is a new process.
144 // It's better to check if the peers are windows(support file copy&paste), but it's not necessary.
145 #[cfg(feature = "flutter")]
146 if !crate::flutter::sessions::has_sessions_running(ConnType::DEFAULT_CONN) {
147 ContextSend::enable(false);
148 };
149 }),
150 })
151 } else {
152 None
153 }
154 };
155
156 let mut last_recv_time = Instant::now();
157 let mut received = false;
158 let conn_type = if self.handler.is_file_transfer() {
159 ConnType::FILE_TRANSFER
160 } else if self.handler.is_view_camera() {
161 ConnType::VIEW_CAMERA
162 } else {
163 ConnType::default()
164 };
165
166 match Client::start(
167 &self.handler.get_id(),
168 key,
…lines 169–191 unchanged (23 lines)
192 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
193 let (_tx_holder, rx) = mpsc::unbounded_channel();
194 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
195 let mut rx_clip_client_holder = (Arc::new(TokioMutex::new(rx)), None);
196 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
197 {
198 let is_conn_not_default = self.handler.is_file_transfer()
199 || self.handler.is_port_forward()
200 || self.handler.is_rdp()
201 || self.handler.is_view_camera();
202 if !is_conn_not_default {
203 (self.client_conn_id, rx_clip_client_holder.0) =
204 clipboard::get_rx_cliprdr_client(&self.handler.get_id());
205 log::debug!("get cliprdr client for conn_id {}", self.client_conn_id);
206 let client_conn_id = self.client_conn_id;
207 rx_clip_client_holder.1 = Some(crate::SimpleCallOnReturn {
208 b: true,
209 f: Box::new(move || {
210 clipboard::remove_channel_by_conn_id(client_conn_id);
211 }),
212 });
213 };
214 }
215 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
216 let mut rx_clip_client = rx_clip_client_holder.0.lock().await;
217
218 let mut status_timer =
219 crate::rustdesk_interval(time::interval(Duration::new(1, 0)));
…lines 220–334 unchanged (115 lines)
335 .connection_round_state
336 .lock()
337 .unwrap()
338 .set_disconnected(round);
339
340 #[cfg(not(target_os = "ios"))]
341 if !self.handler.is_view_camera() && _set_disconnected_ok {
342 Client::try_stop_clipboard();
343 }
344
345 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
346 if !self.handler.is_view_camera() && _set_disconnected_ok {
347 crate::clipboard::try_empty_clipboard_files(ClipboardSide::Client, self.client_conn_id);
348 }
349 }
350
351 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
352 async fn handle_local_clipboard_msg(
353 &self,
354 peer: &mut Stream,
…lines 355–433 unchanged (79 lines)
434 let _ = stopper.send(());
435 }
436 }
437
438 // Start a voice call recorder, records audio and send to remote
439 fn start_voice_call(&mut self) -> Option<std::sync::mpsc::Sender<()>> {
440 if self.handler.is_file_transfer() || self.handler.is_port_forward() {
441 return None;
442 }
443 // iOS does not have this server.
444 #[cfg(not(any(target_os = "ios")))]
445 {
446 // NOTE:
447 // The client server and --server both use the same sound input device.
448 // It's better to distinguish the server side and client side.
…lines 449–1225 unchanged (777 lines)
1226 );
1227 } else {
1228 self.handler.on_error("view_camera_unsupported_tip");
1229 }
1230 return false;
1231 }
1232
1233 async fn handle_msg_from_peer(&mut self, data: &[u8], peer: &mut Stream) -> bool {
1234 if let Ok(msg_in) = Message::parse_from_bytes(&data) {
1235 match msg_in.union {
1236 Some(message::Union::VideoFrame(vf)) => {
1237 if !self.first_frame {
1238 self.first_frame = true;
…lines 1239–1286 unchanged (48 lines)
1287 if self.handler.is_view_camera() {
1288 if !self.check_view_camera_support(&peer_version, &peer_platform) {
1289 self.handler.lc.write().unwrap().handle_peer_info(&pi);
1290 return false;
1291 }
1292 }
1293 self.handler.handle_peer_info(pi);
1294 #[cfg(all(target_os = "windows", not(feature = "flutter")))]
1295 self.check_clipboard_file_context();
1296 if !(self.handler.is_file_transfer()
1297 || self.handler.is_port_forward()
1298 || self.handler.is_view_camera())
1299 {
1300 #[cfg(feature = "flutter")]
1301 #[cfg(not(target_os = "ios"))]
1302 let rx = Client::try_start_clipboard(None);
1303 #[cfg(not(feature = "flutter"))]
1304 #[cfg(not(any(target_os = "android", target_os = "ios")))]
1305 let rx = Client::try_start_clipboard(Some(
1306 crate::client::ClientClipboardContext {
1307 cfg: self.handler.get_permission_config(),
1308 tx: self.sender.clone(),
1309 #[cfg(feature = "unix-file-copy-paste")]
1310 is_file_supported: crate::is_support_file_copy_paste(
1311 &peer_version,
1312 ),
1313 },
1314 ));
1315 // To make sure current text clipboard data is updated.
1316 #[cfg(not(target_os = "ios"))]
1317 if let Some(mut rx) = rx {
1318 timeout(CLIPBOARD_INTERVAL, rx.recv()).await.ok();
1319 }
1320
1321 #[cfg(not(any(target_os = "android", target_os = "ios")))]
1322 if self.handler.lc.read().unwrap().sync_init_clipboard.v {
1323 if let Some(msg_out) = crate::clipboard::get_current_clipboard_msg(
1324 &peer_version,
1325 &peer_platform,
1326 crate::clipboard::ClipboardSide::Client,
1327 ) {
1328 let sender = self.sender.clone();
1329 let permission_config = self.handler.get_permission_config();
1330 tokio::spawn(async move {
1331 if permission_config.is_text_clipboard_required() {
1332 sender.send(Data::Message(msg_out)).ok();
1333 }
1334 });
1335 }
1336 }
1337 // to-do: Android, is `sync_init_clipboard` really needed?
1338 // https://github.com/rustdesk/rustdesk/discussions/9010
1339
1340 #[cfg(feature = "flutter")]
1341 #[cfg(not(target_os = "ios"))]
1342 crate::flutter::update_text_clipboard_required();
1343
1344 #[cfg(all(feature = "flutter", feature = "unix-file-copy-paste"))]
1345 crate::flutter::update_file_clipboard_required();
1346
1347 // on connection established client
1348 #[cfg(all(feature = "flutter", feature = "plugin_framework"))]
1349 #[cfg(not(any(target_os = "android", target_os = "ios")))]
1350 crate::plugin::handle_listen_event(
1351 crate::plugin::EVENT_ON_CONN_CLIENT.to_owned(),
1352 self.handler.get_id(),
1353 );
1354 }
1355
1356 if self.handler.is_file_transfer() {
1357 self.handler.load_last_jobs();
1358 }
1359
1360 self.is_connected = true;
…lines 1361–1657 unchanged (297 lines)
1658 try_empty_clipboard_files(
1659 ClipboardSide::Client,
1660 self.client_conn_id,
1661 );
1662 }
1663 }
1664 Ok(Permission::Camera) => {
1665 self.handler.set_permission("camera", p.enabled);
1666 }
1667 Ok(Permission::Restart) => {
1668 self.handler.set_permission("restart", p.enabled);
1669 }
1670 Ok(Permission::Recording) => {
1671 self.handler.lc.write().unwrap().record_permission = p.enabled;
1672 self.update_record_state();
…lines 1673–1919 unchanged (247 lines)
1920 }
1921 Some(message::Union::ScreenshotResponse(response)) => {
1922 crate::client::screenshot::set_screenshot(response.data);
1923 self.handler
1924 .handle_screenshot_resp(response.sid, response.msg);
1925 }
1926 _ => {}
1927 }
1928 }
1929 true
1930 }
1931
1932 fn set_peer_info(&mut self, pi: &PeerInfo) {
1933 self.peer_info.platform = pi.platform.clone();
1934 if let Ok(platform_additions) =
1935 serde_json::from_str::<HashMap<String, serde_json::Value>>(&pi.platform_additions)
1936 {
1937 self.peer_info.is_installed = platform_additions
1938 .get("is_installed")
1939 .map(|v| v.as_bool())
1940 .flatten()
…lines 1941–2342 unchanged (402 lines)

After

…lines 1–81 unchanged (81 lines)
82#[derive(Default)]
83struct ParsedPeerInfo {
84 platform: String,
85 is_installed: bool,
86 idd_impl: String,
87 support_view_camera: bool,
88 support_terminal: bool,
89}
90
91impl ParsedPeerInfo {
92 fn is_support_virtual_display(&self) -> bool {
93 self.is_installed
94 && self.platform == "Windows"
…lines 95–128 unchanged (34 lines)
129 }
130
131 pub async fn io_loop(&mut self, key: &str, token: &str, round: u32) {
132 #[cfg(target_os = "windows")]
133 let _file_clip_context_holder = {
134 // `is_port_forward()` will not reach here, but we still check it for clarity.
135 if self.handler.is_default() {
136 // It is ok to call this function multiple times.
137 ContextSend::enable(true);
138 Some(crate::SimpleCallOnReturn {
139 b: true,
140 f: Box::new(|| {
141 // No need to call `enable(false)` for sciter version, because each client of sciter version is a new process.
142 // It's better to check if the peers are windows(support file copy&paste), but it's not necessary.
143 #[cfg(feature = "flutter")]
144 if !crate::flutter::sessions::has_sessions_running(ConnType::DEFAULT_CONN) {
145 ContextSend::enable(false);
146 };
147 }),
148 })
149 } else {
150 None
151 }
152 };
153
154 let mut last_recv_time = Instant::now();
155 let mut received = false;
156 let conn_type = if self.handler.is_file_transfer() {
157 ConnType::FILE_TRANSFER
158 } else if self.handler.is_view_camera() {
159 ConnType::VIEW_CAMERA
160 } else if self.handler.is_terminal() {
161 ConnType::TERMINAL
162 } else {
163 ConnType::default()
164 };
165
166 match Client::start(
167 &self.handler.get_id(),
168 key,
…lines 169–191 unchanged (23 lines)
192 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
193 let (_tx_holder, rx) = mpsc::unbounded_channel();
194 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
195 let mut rx_clip_client_holder = (Arc::new(TokioMutex::new(rx)), None);
196 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
197 {
198 if self.handler.is_default() {
199 (self.client_conn_id, rx_clip_client_holder.0) =
200 clipboard::get_rx_cliprdr_client(&self.handler.get_id());
201 log::debug!("get cliprdr client for conn_id {}", self.client_conn_id);
202 let client_conn_id = self.client_conn_id;
203 rx_clip_client_holder.1 = Some(crate::SimpleCallOnReturn {
204 b: true,
205 f: Box::new(move || {
206 clipboard::remove_channel_by_conn_id(client_conn_id);
207 }),
208 });
209 };
210 }
211 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
212 let mut rx_clip_client = rx_clip_client_holder.0.lock().await;
213
214 let mut status_timer =
215 crate::rustdesk_interval(time::interval(Duration::new(1, 0)));
…lines 216–330 unchanged (115 lines)
331 .connection_round_state
332 .lock()
333 .unwrap()
334 .set_disconnected(round);
335
336 #[cfg(not(target_os = "ios"))]
337 if self.handler.is_default() && _set_disconnected_ok {
338 Client::try_stop_clipboard();
339 }
340
341 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
342 if self.handler.is_default() && _set_disconnected_ok {
343 crate::clipboard::try_empty_clipboard_files(ClipboardSide::Client, self.client_conn_id);
344 }
345 }
346
347 #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
348 async fn handle_local_clipboard_msg(
349 &self,
350 peer: &mut Stream,
…lines 351–430 unchanged (80 lines)
431 }
432 }
433
434 // Start a voice call recorder, records audio and send to remote
435 fn start_voice_call(&mut self) -> Option<std::sync::mpsc::Sender<()>> {
436 if self.handler.is_file_transfer()
437 || self.handler.is_port_forward()
438 || self.handler.is_terminal()
439 {
440 return None;
441 }
442 // iOS does not have this server.
443 #[cfg(not(any(target_os = "ios")))]
444 {
445 // NOTE:
446 // The client server and --server both use the same sound input device.
447 // It's better to distinguish the server side and client side.
…lines 448–1225 unchanged (778 lines)
1226 } else {
1227 self.handler.on_error("view_camera_unsupported_tip");
1228 }
1229 return false;
1230 }
1231
1232 fn check_terminal_support(&self, peer_version: &str) -> bool {
1233 if self.peer_info.support_terminal {
1234 return true;
1235 }
1236 if hbb_common::get_version_number(&peer_version) < hbb_common::get_version_number("1.4.1") {
1237 self.handler.msgbox(
1238 "error",
1239 "Remote terminal not supported",
1240 "Remote terminal is not supported by the remote side. Please upgrade to version 1.4.1 or higher.",
1241 "",
1242 );
1243 } else {
1244 self.handler
1245 .on_error("Remote terminal is not supported by the remote side");
1246 }
1247 return false;
1248 }
1249
1250 async fn handle_msg_from_peer(&mut self, data: &[u8], peer: &mut Stream) -> bool {
1251 if let Ok(msg_in) = Message::parse_from_bytes(&data) {
1252 match msg_in.union {
1253 Some(message::Union::VideoFrame(vf)) => {
1254 if !self.first_frame {
…lines 1255–1303 unchanged (49 lines)
1304 if self.handler.is_view_camera() {
1305 if !self.check_view_camera_support(&peer_version, &peer_platform) {
1306 self.handler.lc.write().unwrap().handle_peer_info(&pi);
1307 return false;
1308 }
1309 }
1310 if self.handler.is_terminal() {
1311 if !self.check_terminal_support(&peer_version) {
1312 self.handler.lc.write().unwrap().handle_peer_info(&pi);
1313 return false;
1314 }
1315 }
1316 self.handler.handle_peer_info(pi);
1317 #[cfg(all(target_os = "windows", not(feature = "flutter")))]
1318 self.check_clipboard_file_context();
1319 if self.handler.is_default() {
1320 #[cfg(feature = "flutter")]
1321 #[cfg(not(target_os = "ios"))]
1322 let rx = Client::try_start_clipboard(None);
1323 #[cfg(not(feature = "flutter"))]
1324 #[cfg(not(any(target_os = "android", target_os = "ios")))]
1325 let rx = Client::try_start_clipboard(Some(
1326 crate::client::ClientClipboardContext {
1327 cfg: self.handler.get_permission_config(),
1328 tx: self.sender.clone(),
1329 #[cfg(feature = "unix-file-copy-paste")]
1330 is_file_supported: crate::is_support_file_copy_paste(
1331 &peer_version,
1332 ),
1333 },
1334 ));
1335 // To make sure current text clipboard data is updated.
1336 #[cfg(not(target_os = "ios"))]
1337 if let Some(mut rx) = rx {
1338 timeout(CLIPBOARD_INTERVAL, rx.recv()).await.ok();
1339 }
1340
1341 #[cfg(not(any(target_os = "android", target_os = "ios")))]
1342 if self.handler.lc.read().unwrap().sync_init_clipboard.v {
1343 if let Some(msg_out) = crate::clipboard::get_current_clipboard_msg(
1344 &peer_version,
1345 &peer_platform,
1346 crate::clipboard::ClipboardSide::Client,
1347 ) {
1348 let sender = self.sender.clone();
1349 let permission_config = self.handler.get_permission_config();
1350 tokio::spawn(async move {
1351 if permission_config.is_text_clipboard_required() {
1352 sender.send(Data::Message(msg_out)).ok();
1353 }
1354 });
1355 }
1356 }
1357 // to-do: Android, is `sync_init_clipboard` really needed?
1358 // https://github.com/rustdesk/rustdesk/discussions/9010
1359
1360 #[cfg(feature = "flutter")]
1361 #[cfg(not(target_os = "ios"))]
1362 crate::flutter::update_text_clipboard_required();
1363
1364 #[cfg(all(feature = "flutter", feature = "unix-file-copy-paste"))]
1365 crate::flutter::update_file_clipboard_required();
1366
1367 // on connection established client
1368 #[cfg(all(feature = "flutter", feature = "plugin_framework"))]
1369 #[cfg(not(any(target_os = "android", target_os = "ios")))]
1370 crate::plugin::handle_listen_event(
1371 crate::plugin::EVENT_ON_CONN_CLIENT.to_owned(),
1372 self.handler.get_id(),
1373 );
1374 }
1375
1376 if self.handler.is_file_transfer() {
1377 self.handler.load_last_jobs();
1378 }
1379
1380 self.is_connected = true;
…lines 1381–1677 unchanged (297 lines)
1678 try_empty_clipboard_files(
1679 ClipboardSide::Client,
1680 self.client_conn_id,
1681 );
1682 }
1683 }
1684 Ok(Permission::Restart) => {
1685 self.handler.set_permission("restart", p.enabled);
1686 }
1687 Ok(Permission::Recording) => {
1688 self.handler.lc.write().unwrap().record_permission = p.enabled;
1689 self.update_record_state();
1690 self.handler.set_permission("recording", p.enabled);
…lines 1691–1936 unchanged (246 lines)
1937 }
1938 Some(message::Union::ScreenshotResponse(response)) => {
1939 crate::client::screenshot::set_screenshot(response.data);
1940 self.handler
1941 .handle_screenshot_resp(response.sid, response.msg);
1942 }
1943 Some(message::Union::TerminalResponse(response)) => {
1944 use hbb_common::message_proto::terminal_response::Union;
1945 if let Some(Union::Opened(opened)) = &response.union {
1946 if opened.success && !opened.service_id.is_empty() {
1947 self.handler.lc.write().unwrap().set_option(
1948 "terminal-service-id".to_owned(),
1949 opened.service_id.clone(),
1950 );
1951 }
1952 }
1953 self.handler.handle_terminal_response(response);
1954 }
1955 _ => {}
1956 }
1957 }
1958 true
1959 }
1960
1961 fn set_peer_info(&mut self, pi: &PeerInfo) {
1962 self.peer_info.platform = pi.platform.clone();
1963
1964 // Check features field for terminal support
1965 if let Some(features) = pi.features.as_ref() {
1966 self.peer_info.support_terminal = features.terminal;
1967 }
1968
1969 if let Ok(platform_additions) =
1970 serde_json::from_str::<HashMap<String, serde_json::Value>>(&pi.platform_additions)
1971 {
1972 self.peer_info.is_installed = platform_additions
1973 .get("is_installed")
…lines 1974–2377 unchanged (404 lines)

Before

source_file
attribute_item (+30 nodes collapsed)
use_declaration
use "use"
scoped_use_list
scoped_identifier
crate "crate"
:: "::"
identifier "clipboard"
:: "::"
use_list
{ "{"
identifier "update_clipboard"
, ","
identifier "ClipboardSide"
} "}"
; ";"
attribute_item (+23 nodes collapsed)
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
identifier "audio_service"
, ","
scoped_identifier
identifier "clipboard"
:: "::"
identifier "CLIPBOARD_INTERVAL"
, ","
identifier "ConnInner"
, ","
identifier "CLIENT_SERVER"
} "}"
; ";"
use_declaration (+51 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "feature"
= "="
string_literal
" "\""
string_content "unix-file-copy-paste"
" "\""
) ")"
] "]"
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
scoped_identifier
identifier "clipboard"
:: "::"
identifier "try_empty_clipboard_files"
, ","
scoped_identifier
identifier "clipboard_file"
:: "::"
identifier "unix_file_clip"
} "}"
; ";"
attribute_item (+37 nodes collapsed)
use_declaration
use "use"
scoped_identifier
identifier "clipboard"
:: "::"
identifier "ContextSend"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "crossbeam_queue"
:: "::"
identifier "ArrayQueue"
; ";"
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "not"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "ios"
" "\""
) ")"
) ")"
] "]"
use_declaration
use "use"
scoped_identifier
scoped_identifier
scoped_identifier
scoped_identifier
scoped_identifier
identifier "hbb_common"
:: "::"
identifier "tokio"
:: "::"
identifier "sync"
:: "::"
identifier "mpsc"
:: "::"
identifier "error"
:: "::"
identifier "TryRecvError"
; ";"
use_declaration (+107 nodes collapsed)
attribute_item (+26 nodes collapsed)
use_declaration (+21 nodes collapsed)
use_declaration
use "use"
scoped_identifier
identifier "scrap"
:: "::"
identifier "CodecFormat"
; ";"
use_declaration (+50 nodes collapsed)
struct_item (+263 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "derive"
token_tree
( "("
identifier "Default"
) ")"
] "]"
struct_item
struct "struct"
type_identifier "ParsedPeerInfo"
field_declaration_list
{ "{"
field_declaration
field_identifier "platform"
: ":"
type_identifier "String"
, ","
field_declaration
field_identifier "is_installed"
: ":"
primitive_type "bool"
, ","
field_declaration
field_identifier "idd_impl"
: ":"
type_identifier "String"
, ","
field_declaration
field_identifier "support_view_camera"
: ":"
primitive_type "bool"
, ","
} "}"
impl_item (+63 nodes collapsed)
impl_item
impl "impl"
type_parameters
< "<"
type_parameter
type_identifier "T"
trait_bounds
: ":"
type_identifier "InvokeUiSession"
> ">"
generic_type
type_identifier "Remote"
type_arguments
< "<"
type_identifier "T"
> ">"
declaration_list
{ "{"
function_item (+289 nodes collapsed)
function_item
visibility_modifier
pub "pub"
function_modifiers
async "async"
fn "fn"
identifier "io_loop"
parameters (+26 nodes collapsed)
block
{ "{"
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "windows"
" "\""
) ")"
] "]"
let_declaration
let "let"
identifier "_file_clip_context_holder"
= "="
block
{ "{"
line_comment
// "//"
expression_statement
if_expression
if "if"
binary_expression
binary_expression
unary_expression
! "!"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_file_transfer" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
&& "&&"
unary_expression
! "!"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_port_forward" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
&& "&&"
unary_expression
! "!"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_view_camera" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
block (+114 nodes collapsed)
else_clause
else "else"
block
{ "{"
identifier "None"
} "}"
} "}"
; ";"
let_declaration
let "let"
mutable_specifier "mut"
identifier "last_recv_time"
= "="
call_expression
scoped_identifier
identifier "Instant"
:: "::"
identifier "now"
arguments
( "("
) ")"
; ";"
let_declaration
let "let"
mutable_specifier "mut"
identifier "received"
= "="
boolean_literal
false "false"
; ";"
let_declaration
let "let"
identifier "conn_type"
= "="
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_file_transfer"
arguments
( "("
) ")"
block
{ "{"
scoped_identifier
identifier "ConnType"
:: "::"
identifier "FILE_TRANSFER"
} "}"
else_clause
else "else"
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_view_camera"
arguments
( "("
) ")"
block
{ "{"
scoped_identifier
identifier "ConnType"
:: "::"
identifier "VIEW_CAMERA"
} "}"
else_clause any 1:2
else "else" any 1:2
block
{ "{"
call_expression
scoped_identifier
identifier "ConnType"
:: "::"
identifier "default"
arguments
( "("
) ")"
} "}"
; ";"
expression_statement
match_expression
match "match"
await_expression (+43 nodes collapsed)
match_block
{ "{"
match_arm
match_pattern (+27 nodes collapsed)
=> "=>"
block
{ "{"
expression_statement (+30 nodes collapsed)
expression_statement (+23 nodes collapsed)
line_comment
// "//"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "update_direct"
arguments
( "("
call_expression
identifier "Some"
arguments
( "("
identifier "direct"
) ")"
) ")"
; ";"
expression_statement (+54 nodes collapsed)
line_comment
// "//"
attribute_item (+30 nodes collapsed)
let_declaration (+26 nodes collapsed)
attribute_item (+26 nodes collapsed)
let_declaration
let "let"
tuple_pattern
( "("
identifier "_tx_holder"
, ","
identifier "rx"
) ")"
= "="
call_expression
scoped_identifier
identifier "mpsc"
:: "::"
identifier "unbounded_channel"
arguments
( "("
) ")"
; ";"
attribute_item (+26 nodes collapsed)
let_declaration (+28 nodes collapsed)
attribute_item (+26 nodes collapsed)
expression_statement
block
{ "{"
let_declaration
let "let"
identifier "is_conn_not_default"
= "="
binary_expression
binary_expression
binary_expression
call_expression any 4:1
field_expression any 4:1
field_expression any 4:1
self "self" any 4:1
. "." any 4:1
field_identifier "handler" any 4:1
. "." any 4:1
field_identifier "is_file_transfer" any 4:1
arguments any 4:1
( "(" any 4:1
) ")" any 4:1
|| "||"
call_expression any 4:1
field_expression any 4:1
field_expression any 4:1
self "self" any 4:1
. "." any 4:1
field_identifier "handler" any 4:1
. "." any 4:1
field_identifier "is_port_forward" any 4:1
arguments any 4:1
( "(" any 4:1
) ")" any 4:1
|| "||"
call_expression any 4:1
field_expression any 4:1
field_expression any 4:1
self "self" any 4:1
. "." any 4:1
field_identifier "handler" any 4:1
. "." any 4:1
field_identifier "is_rdp" any 4:1
arguments any 4:1
( "(" any 4:1
) ")" any 4:1
|| "||"
call_expression any 4:1
field_expression any 4:1
field_expression any 4:1
self "self" any 4:1
. "." any 4:1
field_identifier "handler" any 4:1
. "." any 4:1
field_identifier "is_view_camera" any 4:1
arguments any 4:1
( "(" any 4:1
) ")" any 4:1
; ";"
expression_statement
if_expression
if "if"
unary_expression
! "!"
identifier "is_conn_not_default"
block (+126 nodes collapsed)
empty_statement
; ";"
} "}"
attribute_item (+26 nodes collapsed)
let_declaration
let "let"
mutable_specifier "mut"
identifier "rx_clip_client"
= "="
await_expression
call_expression
field_expression
field_expression
identifier "rx_clip_client_holder"
. "."
integer_literal "0"
. "."
field_identifier "lock"
arguments
( "("
) ")"
. "."
await "await"
; ";"
let_declaration (+33 nodes collapsed)
let_declaration
let "let"
mutable_specifier "mut"
identifier "fps_instant"
= "="
call_expression
scoped_identifier
identifier "Instant"
:: "::"
identifier "now"
arguments
( "("
) ")"
; ";"
let_declaration (+21 nodes collapsed)
expression_statement (+885 nodes collapsed)
expression_statement (+24 nodes collapsed)
line_comment
// "//"
expression_statement (+45 nodes collapsed)
} "}"
match_arm (+32 nodes collapsed)
} "}"
line_comment
// "//"
let_declaration (+34 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "not"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "ios"
" "\""
) ")"
) ")"
] "]"
expression_statement
if_expression
if "if"
binary_expression
unary_expression
! "!"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_view_camera"
arguments
( "("
) ")"
&& "&&"
identifier "_set_disconnected_ok"
block
{ "{"
expression_statement
call_expression
scoped_identifier
identifier "Client"
:: "::"
identifier "try_stop_clipboard"
arguments
( "("
) ")"
; ";"
} "}"
attribute_item (+26 nodes collapsed)
expression_statement
if_expression
if "if"
binary_expression
unary_expression
! "!"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_view_camera"
arguments
( "("
) ")"
&& "&&"
identifier "_set_disconnected_ok"
block (+25 nodes collapsed)
} "}"
attribute_item (+26 nodes collapsed)
function_item (+437 nodes collapsed)
function_item (+319 nodes collapsed)
function_item (+69 nodes collapsed)
line_comment
// "//"
function_item
fn "fn"
identifier "start_voice_call"
parameters
( "("
self_parameter
& "&"
mutable_specifier "mut"
self "self"
) ")"
-> "->"
generic_type (+22 nodes collapsed)
block
{ "{"
expression_statement
if_expression
if "if"
binary_expression any 1:2
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_file_transfer"
arguments
( "("
) ")"
|| "||"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_port_forward"
arguments
( "("
) ")"
block
{ "{"
expression_statement
return_expression
return "return"
identifier "None"
; ";"
} "}"
line_comment
// "//"
attribute_item (+23 nodes collapsed)
expression_statement (+622 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "ios"
" "\""
) ")"
] "]"
expression_statement
block
{ "{"
identifier "None"
} "}"
} "}"
function_item (+4340 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "inline"
] "]"
function_item (+240 nodes collapsed)
function_item (+168 nodes collapsed)
function_item (+248 nodes collapsed)
function_item (+226 nodes collapsed)
function_item (+229 nodes collapsed)
function_item (+132 nodes collapsed)
line_comment
// "//"
line_comment
// "//"
attribute_item
# "#"
[ "["
attribute
identifier "inline"
] "]"
function_item (+1440 nodes collapsed)
function_item (+159 nodes collapsed)
function_item
function_modifiers
async "async"
fn "fn"
identifier "handle_msg_from_peer"
parameters (+25 nodes collapsed)
-> "->"
primitive_type "bool"
block
{ "{"
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Ok"
( "("
identifier "msg_in"
) ")"
= "="
call_expression
scoped_identifier
identifier "Message"
:: "::"
identifier "parse_from_bytes"
arguments
( "("
reference_expression
& "&"
identifier "data"
) ")"
block
{ "{"
expression_statement
match_expression
match "match"
field_expression
identifier "msg_in"
. "."
field_identifier "union"
match_block
{ "{"
match_arm (+352 nodes collapsed)
match_arm (+57 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "message"
:: "::"
identifier "Union"
:: "::"
identifier "LoginResponse"
( "("
identifier "lr"
) ")"
) ")"
=> "=>"
match_expression
match "match"
field_expression
identifier "lr"
. "."
field_identifier "union"
match_block
{ "{"
match_arm (+94 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "login_response"
:: "::"
identifier "Union"
:: "::"
identifier "PeerInfo"
( "("
identifier "pi"
) ")"
) ")"
=> "=>"
block
{ "{"
let_declaration
let "let"
identifier "peer_version"
= "="
call_expression
field_expression
field_expression
identifier "pi"
. "."
field_identifier "version"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
let_declaration
let "let"
identifier "peer_platform"
= "="
call_expression
field_expression
field_expression
identifier "pi"
. "."
field_identifier "platform"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
expression_statement
call_expression
field_expression
self "self"
. "."
field_identifier "set_peer_info"
arguments
( "("
reference_expression
& "&"
identifier "pi"
) ")"
; ";"
expression_statement (+79 nodes collapsed)
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "handle_peer_info"
arguments
( "("
identifier "pi"
) ")"
; ";"
attribute_item (+30 nodes collapsed)
expression_statement
call_expression
field_expression
self "self"
. "."
field_identifier "check_clipboard_file_context"
arguments
( "("
) ")"
; ";"
expression_statement
if_expression
if "if"
unary_expression
! "!"
parenthesized_expression
( "("
binary_expression
binary_expression
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_file_transfer" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
|| "||"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_port_forward" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
|| "||"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_view_camera" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
) ")"
block (+639 nodes collapsed)
expression_statement (+30 nodes collapsed)
expression_statement
assignment_expression
field_expression
self "self"
. "."
field_identifier "is_connected"
= "="
boolean_literal
true "true"
; ";"
} "}"
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
, ","
match_arm (+35 nodes collapsed)
match_arm (+42 nodes collapsed)
match_arm (+35 nodes collapsed)
match_arm (+237 nodes collapsed)
match_arm (+131 nodes collapsed)
match_arm (+63 nodes collapsed)
match_arm (+2026 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "message"
:: "::"
identifier "Union"
:: "::"
identifier "Misc"
( "("
identifier "misc"
) ")"
) ")"
=> "=>"
match_expression
match "match"
field_expression
identifier "misc"
. "."
field_identifier "union"
match_block
{ "{"
match_arm (+50 nodes collapsed)
match_arm (+38 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "misc"
:: "::"
identifier "Union"
:: "::"
identifier "PermissionInfo"
( "("
identifier "p"
) ")"
) ")"
=> "=>"
block
{ "{"
expression_statement (+23 nodes collapsed)
line_comment
// "//"
expression_statement
match_expression
match "match"
call_expression
field_expression
field_expression
identifier "p"
. "."
field_identifier "permission"
. "."
field_identifier "enum_value"
arguments
( "("
) ")"
match_block
{ "{"
match_arm (+153 nodes collapsed)
match_arm (+114 nodes collapsed)
match_arm (+36 nodes collapsed)
match_arm (+181 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Ok"
( "("
scoped_identifier
identifier "Permission"
:: "::"
identifier "Camera"
) ")"
=> "=>"
block
{ "{"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "set_permission"
arguments
( "("
string_literal
" "\""
string_content "camera"
" "\""
, ","
field_expression
identifier "p"
. "."
field_identifier "enabled"
) ")"
; ";"
} "}"
match_arm (+36 nodes collapsed)
match_arm (+78 nodes collapsed)
match_arm (+36 nodes collapsed)
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
} "}"
match_arm (+158 nodes collapsed)
match_arm (+57 nodes collapsed)
match_arm (+47 nodes collapsed)
match_arm (+298 nodes collapsed)
match_arm (+298 nodes collapsed)
match_arm (+116 nodes collapsed)
match_arm (+80 nodes collapsed)
match_arm (+62 nodes collapsed)
match_arm (+114 nodes collapsed)
match_arm (+150 nodes collapsed)
match_arm (+67 nodes collapsed)
match_arm (+35 nodes collapsed)
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
, ","
match_arm (+40 nodes collapsed)
match_arm (+93 nodes collapsed)
match_arm (+434 nodes collapsed)
match_arm (+152 nodes collapsed)
match_arm (+111 nodes collapsed)
match_arm (+165 nodes collapsed)
match_arm (+59 nodes collapsed)
match_arm (+63 nodes collapsed)
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
} "}"
boolean_literal
true "true"
} "}"
function_item
fn "fn"
identifier "set_peer_info"
parameters
( "("
self_parameter
& "&"
mutable_specifier "mut"
self "self"
, ","
parameter
identifier "pi"
: ":"
reference_type
& "&"
type_identifier "PeerInfo"
) ")"
block
{ "{"
expression_statement (+22 nodes collapsed)
expression_statement (+226 nodes collapsed)
} "}"
function_item (+168 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "inline"
token_tree
( "("
identifier "always"
) ")"
] "]"
function_item (+32 nodes collapsed)
function_item (+237 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "inline"
token_tree
( "("
identifier "always"
) ")"
] "]"
function_item (+149 nodes collapsed)
function_item (+657 nodes collapsed)
attribute_item (+30 nodes collapsed)
function_item (+80 nodes collapsed)
attribute_item (+26 nodes collapsed)
function_item (+723 nodes collapsed)
function_item (+505 nodes collapsed)
function_item (+312 nodes collapsed)
} "}"
struct_item (+46 nodes collapsed)
impl_item (+133 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "derive"
token_tree
( "("
identifier "Debug"
, ","
identifier "Default"
) ")"
] "]"
struct_item (+31 nodes collapsed)
struct_item (+86 nodes collapsed)
impl_item (+49 nodes collapsed)

After

source_file
attribute_item (+30 nodes collapsed)
use_declaration
use "use"
scoped_use_list
scoped_identifier
crate "crate"
:: "::"
identifier "clipboard"
:: "::"
use_list
{ "{"
identifier "update_clipboard"
, ","
identifier "ClipboardSide"
} "}"
; ";"
attribute_item (+23 nodes collapsed)
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
identifier "audio_service"
, ","
scoped_identifier
identifier "clipboard"
:: "::"
identifier "CLIPBOARD_INTERVAL"
, ","
identifier "ConnInner"
, ","
identifier "CLIENT_SERVER"
} "}"
; ";"
use_declaration (+51 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "feature"
= "="
string_literal
" "\""
string_content "unix-file-copy-paste"
" "\""
) ")"
] "]"
use_declaration
use "use"
scoped_use_list
crate "crate"
:: "::"
use_list
{ "{"
scoped_identifier
identifier "clipboard"
:: "::"
identifier "try_empty_clipboard_files"
, ","
scoped_identifier
identifier "clipboard_file"
:: "::"
identifier "unix_file_clip"
} "}"
; ";"
attribute_item (+37 nodes collapsed)
use_declaration
use "use"
scoped_identifier
identifier "clipboard"
:: "::"
identifier "ContextSend"
; ";"
use_declaration
use "use"
scoped_identifier
identifier "crossbeam_queue"
:: "::"
identifier "ArrayQueue"
; ";"
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "not"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "ios"
" "\""
) ")"
) ")"
] "]"
use_declaration
use "use"
scoped_identifier
scoped_identifier
scoped_identifier
scoped_identifier
scoped_identifier
identifier "hbb_common"
:: "::"
identifier "tokio"
:: "::"
identifier "sync"
:: "::"
identifier "mpsc"
:: "::"
identifier "error"
:: "::"
identifier "TryRecvError"
; ";"
use_declaration (+107 nodes collapsed)
attribute_item (+26 nodes collapsed)
use_declaration (+21 nodes collapsed)
use_declaration
use "use"
scoped_identifier
identifier "scrap"
:: "::"
identifier "CodecFormat"
; ";"
use_declaration (+50 nodes collapsed)
struct_item (+263 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "derive"
token_tree
( "("
identifier "Default"
) ")"
] "]"
struct_item
struct "struct"
type_identifier "ParsedPeerInfo"
field_declaration_list
{ "{"
field_declaration
field_identifier "platform"
: ":"
type_identifier "String"
, ","
field_declaration
field_identifier "is_installed"
: ":"
primitive_type "bool"
, ","
field_declaration
field_identifier "idd_impl"
: ":"
type_identifier "String"
, ","
field_declaration
field_identifier "support_view_camera"
: ":"
primitive_type "bool"
, ","
field_declaration
field_identifier "support_terminal"
: ":"
primitive_type "bool"
, ","
} "}"
impl_item (+63 nodes collapsed)
impl_item
impl "impl"
type_parameters
< "<"
type_parameter
type_identifier "T"
trait_bounds
: ":"
type_identifier "InvokeUiSession"
> ">"
generic_type
type_identifier "Remote"
type_arguments
< "<"
type_identifier "T"
> ">"
declaration_list
{ "{"
function_item (+289 nodes collapsed)
function_item
visibility_modifier
pub "pub"
function_modifiers
async "async"
fn "fn"
identifier "io_loop"
parameters (+26 nodes collapsed)
block
{ "{"
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "windows"
" "\""
) ")"
] "]"
let_declaration
let "let"
identifier "_file_clip_context_holder"
= "="
block
{ "{"
line_comment
// "//"
expression_statement
if_expression
if "if"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_default" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
block (+114 nodes collapsed)
else_clause
else "else"
block
{ "{"
identifier "None"
} "}"
} "}"
; ";"
let_declaration
let "let"
mutable_specifier "mut"
identifier "last_recv_time"
= "="
call_expression
scoped_identifier
identifier "Instant"
:: "::"
identifier "now"
arguments
( "("
) ")"
; ";"
let_declaration
let "let"
mutable_specifier "mut"
identifier "received"
= "="
boolean_literal
false "false"
; ";"
let_declaration
let "let"
identifier "conn_type"
= "="
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_file_transfer"
arguments
( "("
) ")"
block
{ "{"
scoped_identifier
identifier "ConnType"
:: "::"
identifier "FILE_TRANSFER"
} "}"
else_clause
else "else"
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_view_camera"
arguments
( "("
) ")"
block
{ "{"
scoped_identifier
identifier "ConnType"
:: "::"
identifier "VIEW_CAMERA"
} "}"
else_clause any 1:2
else "else" any 1:2
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_terminal"
arguments
( "("
) ")"
block
{ "{"
scoped_identifier
identifier "ConnType"
:: "::"
identifier "TERMINAL"
} "}"
else_clause any 1:2
else "else" any 1:2
block
{ "{"
call_expression
scoped_identifier
identifier "ConnType"
:: "::"
identifier "default"
arguments
( "("
) ")"
} "}"
; ";"
expression_statement
match_expression
match "match"
await_expression (+43 nodes collapsed)
match_block
{ "{"
match_arm
match_pattern (+27 nodes collapsed)
=> "=>"
block
{ "{"
expression_statement (+30 nodes collapsed)
expression_statement (+23 nodes collapsed)
line_comment
// "//"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "update_direct"
arguments
( "("
call_expression
identifier "Some"
arguments
( "("
identifier "direct"
) ")"
) ")"
; ";"
expression_statement (+54 nodes collapsed)
line_comment
// "//"
attribute_item (+30 nodes collapsed)
let_declaration (+26 nodes collapsed)
attribute_item (+26 nodes collapsed)
let_declaration
let "let"
tuple_pattern
( "("
identifier "_tx_holder"
, ","
identifier "rx"
) ")"
= "="
call_expression
scoped_identifier
identifier "mpsc"
:: "::"
identifier "unbounded_channel"
arguments
( "("
) ")"
; ";"
attribute_item (+26 nodes collapsed)
let_declaration (+28 nodes collapsed)
attribute_item (+26 nodes collapsed)
expression_statement
block
{ "{"
expression_statement
if_expression
if "if"
call_expression any 4:1
field_expression any 4:1
field_expression any 4:1
self "self" any 4:1
. "." any 4:1
field_identifier "handler" any 4:1
. "." any 4:1
field_identifier "is_default" any 4:1
arguments any 4:1
( "(" any 4:1
) ")" any 4:1
block (+126 nodes collapsed)
empty_statement
; ";"
} "}"
attribute_item (+26 nodes collapsed)
let_declaration
let "let"
mutable_specifier "mut"
identifier "rx_clip_client"
= "="
await_expression
call_expression
field_expression
field_expression
identifier "rx_clip_client_holder"
. "."
integer_literal "0"
. "."
field_identifier "lock"
arguments
( "("
) ")"
. "."
await "await"
; ";"
let_declaration (+33 nodes collapsed)
let_declaration
let "let"
mutable_specifier "mut"
identifier "fps_instant"
= "="
call_expression
scoped_identifier
identifier "Instant"
:: "::"
identifier "now"
arguments
( "("
) ")"
; ";"
let_declaration (+21 nodes collapsed)
expression_statement (+885 nodes collapsed)
expression_statement (+24 nodes collapsed)
line_comment
// "//"
expression_statement (+45 nodes collapsed)
} "}"
match_arm (+32 nodes collapsed)
} "}"
line_comment
// "//"
let_declaration (+34 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "not"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "ios"
" "\""
) ")"
) ")"
] "]"
expression_statement
if_expression
if "if"
binary_expression
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_default"
arguments
( "("
) ")"
&& "&&"
identifier "_set_disconnected_ok"
block
{ "{"
expression_statement
call_expression
scoped_identifier
identifier "Client"
:: "::"
identifier "try_stop_clipboard"
arguments
( "("
) ")"
; ";"
} "}"
attribute_item (+26 nodes collapsed)
expression_statement
if_expression
if "if"
binary_expression
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_default"
arguments
( "("
) ")"
&& "&&"
identifier "_set_disconnected_ok"
block (+25 nodes collapsed)
} "}"
attribute_item (+26 nodes collapsed)
function_item (+437 nodes collapsed)
function_item (+319 nodes collapsed)
function_item (+69 nodes collapsed)
line_comment
// "//"
function_item
fn "fn"
identifier "start_voice_call"
parameters
( "("
self_parameter
& "&"
mutable_specifier "mut"
self "self"
) ")"
-> "->"
generic_type (+22 nodes collapsed)
block
{ "{"
expression_statement
if_expression
if "if"
binary_expression any 1:2
binary_expression any 1:2
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_file_transfer"
arguments
( "("
) ")"
|| "||"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_port_forward"
arguments
( "("
) ")"
|| "||"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_terminal"
arguments
( "("
) ")"
block
{ "{"
expression_statement
return_expression
return "return"
identifier "None"
; ";"
} "}"
line_comment
// "//"
attribute_item (+23 nodes collapsed)
expression_statement (+622 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "cfg"
token_tree
( "("
identifier "target_os"
= "="
string_literal
" "\""
string_content "ios"
" "\""
) ")"
] "]"
expression_statement
block
{ "{"
identifier "None"
} "}"
} "}"
function_item (+4340 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "inline"
] "]"
function_item (+240 nodes collapsed)
function_item (+168 nodes collapsed)
function_item (+248 nodes collapsed)
function_item (+226 nodes collapsed)
function_item (+229 nodes collapsed)
function_item (+132 nodes collapsed)
line_comment
// "//"
line_comment
// "//"
attribute_item
# "#"
[ "["
attribute
identifier "inline"
] "]"
function_item (+1440 nodes collapsed)
function_item (+159 nodes collapsed)
function_item
fn "fn"
identifier "check_terminal_support"
parameters
( "("
self_parameter
& "&"
self "self"
, ","
parameter
identifier "peer_version"
: ":"
reference_type
& "&"
primitive_type "str"
) ")"
-> "->"
primitive_type "bool"
block
{ "{"
expression_statement
if_expression
if "if"
field_expression
field_expression
self "self"
. "."
field_identifier "peer_info"
. "."
field_identifier "support_terminal"
block
{ "{"
expression_statement
return_expression
return "return"
boolean_literal
true "true"
; ";"
} "}"
expression_statement
if_expression
if "if"
binary_expression
call_expression
scoped_identifier
identifier "hbb_common"
:: "::"
identifier "get_version_number"
arguments
( "("
reference_expression
& "&"
identifier "peer_version"
) ")"
< "<"
call_expression
scoped_identifier
identifier "hbb_common"
:: "::"
identifier "get_version_number"
arguments
( "("
string_literal
" "\""
string_content "1.4.1"
" "\""
) ")"
block
{ "{"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "msgbox"
arguments
( "("
string_literal
" "\""
string_content "error"
" "\""
, ","
string_literal
" "\""
string_content "Remote terminal not supported"
" "\""
, ","
string_literal
" "\""
string_content "Remote terminal is not supported by the remote side. Please "...
" "\""
, ","
string_literal
" "\""
" "\""
, ","
) ")"
; ";"
} "}"
else_clause
else "else"
block
{ "{"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "on_error"
arguments
( "("
string_literal
" "\""
string_content "Remote terminal is not supported by the remote side"
" "\""
) ")"
; ";"
} "}"
expression_statement
return_expression
return "return"
boolean_literal
false "false"
; ";"
} "}"
function_item
function_modifiers
async "async"
fn "fn"
identifier "handle_msg_from_peer"
parameters (+25 nodes collapsed)
-> "->"
primitive_type "bool"
block
{ "{"
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Ok"
( "("
identifier "msg_in"
) ")"
= "="
call_expression
scoped_identifier
identifier "Message"
:: "::"
identifier "parse_from_bytes"
arguments
( "("
reference_expression
& "&"
identifier "data"
) ")"
block
{ "{"
expression_statement
match_expression
match "match"
field_expression
identifier "msg_in"
. "."
field_identifier "union"
match_block
{ "{"
match_arm (+352 nodes collapsed)
match_arm (+57 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "message"
:: "::"
identifier "Union"
:: "::"
identifier "LoginResponse"
( "("
identifier "lr"
) ")"
) ")"
=> "=>"
match_expression
match "match"
field_expression
identifier "lr"
. "."
field_identifier "union"
match_block
{ "{"
match_arm (+94 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "login_response"
:: "::"
identifier "Union"
:: "::"
identifier "PeerInfo"
( "("
identifier "pi"
) ")"
) ")"
=> "=>"
block
{ "{"
let_declaration
let "let"
identifier "peer_version"
= "="
call_expression
field_expression
field_expression
identifier "pi"
. "."
field_identifier "version"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
let_declaration
let "let"
identifier "peer_platform"
= "="
call_expression
field_expression
field_expression
identifier "pi"
. "."
field_identifier "platform"
. "."
field_identifier "clone"
arguments
( "("
) ")"
; ";"
expression_statement
call_expression
field_expression
self "self"
. "."
field_identifier "set_peer_info"
arguments
( "("
reference_expression
& "&"
identifier "pi"
) ")"
; ";"
expression_statement (+79 nodes collapsed)
expression_statement
if_expression
if "if"
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "is_terminal"
arguments
( "("
) ")"
block
{ "{"
expression_statement
if_expression
if "if"
unary_expression
! "!"
call_expression
field_expression
self "self"
. "."
field_identifier "check_terminal_support"
arguments
( "("
reference_expression
& "&"
identifier "peer_version"
) ")"
block
{ "{"
expression_statement
call_expression
field_expression
call_expression
field_expression
call_expression
field_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "lc"
. "."
field_identifier "write"
arguments
( "("
) ")"
. "."
field_identifier "unwrap"
arguments
( "("
) ")"
. "."
field_identifier "handle_peer_info"
arguments
( "("
reference_expression
& "&"
identifier "pi"
) ")"
; ";"
expression_statement
return_expression
return "return"
boolean_literal
false "false"
; ";"
} "}"
} "}"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "handle_peer_info"
arguments
( "("
identifier "pi"
) ")"
; ";"
attribute_item (+30 nodes collapsed)
expression_statement
call_expression
field_expression
self "self"
. "."
field_identifier "check_clipboard_file_context"
arguments
( "("
) ")"
; ";"
expression_statement
if_expression
if "if"
call_expression any 3:1
field_expression any 3:1
field_expression any 3:1
self "self" any 3:1
. "." any 3:1
field_identifier "handler" any 3:1
. "." any 3:1
field_identifier "is_default" any 3:1
arguments any 3:1
( "(" any 3:1
) ")" any 3:1
block (+639 nodes collapsed)
expression_statement (+30 nodes collapsed)
expression_statement
assignment_expression
field_expression
self "self"
. "."
field_identifier "is_connected"
= "="
boolean_literal
true "true"
; ";"
} "}"
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
, ","
match_arm (+35 nodes collapsed)
match_arm (+42 nodes collapsed)
match_arm (+35 nodes collapsed)
match_arm (+237 nodes collapsed)
match_arm (+131 nodes collapsed)
match_arm (+63 nodes collapsed)
match_arm (+2026 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "message"
:: "::"
identifier "Union"
:: "::"
identifier "Misc"
( "("
identifier "misc"
) ")"
) ")"
=> "=>"
match_expression
match "match"
field_expression
identifier "misc"
. "."
field_identifier "union"
match_block
{ "{"
match_arm (+50 nodes collapsed)
match_arm (+38 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "misc"
:: "::"
identifier "Union"
:: "::"
identifier "PermissionInfo"
( "("
identifier "p"
) ")"
) ")"
=> "=>"
block
{ "{"
expression_statement (+23 nodes collapsed)
line_comment
// "//"
expression_statement
match_expression
match "match"
call_expression
field_expression
field_expression
identifier "p"
. "."
field_identifier "permission"
. "."
field_identifier "enum_value"
arguments
( "("
) ")"
match_block
{ "{"
match_arm (+153 nodes collapsed)
match_arm (+114 nodes collapsed)
match_arm (+36 nodes collapsed)
match_arm (+181 nodes collapsed)
match_arm (+36 nodes collapsed)
match_arm (+78 nodes collapsed)
match_arm (+36 nodes collapsed)
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
} "}"
match_arm (+158 nodes collapsed)
match_arm (+57 nodes collapsed)
match_arm (+47 nodes collapsed)
match_arm (+298 nodes collapsed)
match_arm (+298 nodes collapsed)
match_arm (+116 nodes collapsed)
match_arm (+80 nodes collapsed)
match_arm (+62 nodes collapsed)
match_arm (+114 nodes collapsed)
match_arm (+150 nodes collapsed)
match_arm (+67 nodes collapsed)
match_arm (+35 nodes collapsed)
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
, ","
match_arm (+40 nodes collapsed)
match_arm (+93 nodes collapsed)
match_arm (+434 nodes collapsed)
match_arm (+152 nodes collapsed)
match_arm (+111 nodes collapsed)
match_arm (+165 nodes collapsed)
match_arm (+59 nodes collapsed)
match_arm (+63 nodes collapsed)
match_arm
match_pattern
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
scoped_identifier
identifier "message"
:: "::"
identifier "Union"
:: "::"
identifier "TerminalResponse"
( "("
identifier "response"
) ")"
) ")"
=> "=>"
block
{ "{"
use_declaration
use "use"
scoped_identifier
scoped_identifier
scoped_identifier
identifier "hbb_common"
:: "::"
identifier "message_proto"
:: "::"
identifier "terminal_response"
:: "::"
identifier "Union"
; ";"
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Some"
( "("
tuple_struct_pattern
scoped_identifier
identifier "Union"
:: "::"
identifier "Opened"
( "("
identifier "opened"
) ")"
) ")"
= "="
reference_expression
& "&"
field_expression
identifier "response"
. "."
field_identifier "union"
block
{ "{"
expression_statement
if_expression
if "if"
binary_expression
field_expression
identifier "opened"
. "."
field_identifier "success"
&& "&&"
unary_expression
! "!"
call_expression
field_expression
field_expression
identifier "opened"
. "."
field_identifier "service_id"
. "."
field_identifier "is_empty"
arguments
( "("
) ")"
block
{ "{"
expression_statement
call_expression
field_expression
call_expression
field_expression
call_expression
field_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "lc"
. "."
field_identifier "write"
arguments
( "("
) ")"
. "."
field_identifier "unwrap"
arguments
( "("
) ")"
. "."
field_identifier "set_option"
arguments
( "("
call_expression
field_expression
string_literal
" "\""
string_content "terminal-service-id"
" "\""
. "."
field_identifier "to_owned"
arguments
( "("
) ")"
, ","
call_expression
field_expression
field_expression
identifier "opened"
. "."
field_identifier "service_id"
. "."
field_identifier "clone"
arguments
( "("
) ")"
, ","
) ")"
; ";"
} "}"
} "}"
expression_statement
call_expression
field_expression
field_expression
self "self"
. "."
field_identifier "handler"
. "."
field_identifier "handle_terminal_response"
arguments
( "("
identifier "response"
) ")"
; ";"
} "}"
match_arm
match_pattern
_ "_"
=> "=>"
block
{ "{"
} "}"
} "}"
} "}"
boolean_literal
true "true"
} "}"
function_item
fn "fn"
identifier "set_peer_info"
parameters
( "("
self_parameter
& "&"
mutable_specifier "mut"
self "self"
, ","
parameter
identifier "pi"
: ":"
reference_type
& "&"
type_identifier "PeerInfo"
) ")"
block
{ "{"
expression_statement (+22 nodes collapsed)
line_comment
// "//"
expression_statement
if_expression
if "if"
let_condition
let "let"
tuple_struct_pattern
identifier "Some"
( "("
identifier "features"
) ")"
= "="
call_expression
field_expression
field_expression
identifier "pi"
. "."
field_identifier "features"
. "."
field_identifier "as_ref"
arguments
( "("
) ")"
block
{ "{"
expression_statement
assignment_expression
field_expression
field_expression
self "self"
. "."
field_identifier "peer_info"
. "."
field_identifier "support_terminal"
= "="
field_expression
identifier "features"
. "."
field_identifier "terminal"
; ";"
} "}"
expression_statement (+226 nodes collapsed)
} "}"
function_item (+168 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "inline"
token_tree
( "("
identifier "always"
) ")"
] "]"
function_item (+32 nodes collapsed)
function_item (+237 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "inline"
token_tree
( "("
identifier "always"
) ")"
] "]"
function_item (+149 nodes collapsed)
function_item (+657 nodes collapsed)
attribute_item (+30 nodes collapsed)
function_item (+80 nodes collapsed)
attribute_item (+26 nodes collapsed)
function_item (+723 nodes collapsed)
function_item (+505 nodes collapsed)
function_item (+312 nodes collapsed)
} "}"
struct_item (+46 nodes collapsed)
impl_item (+133 nodes collapsed)
attribute_item
# "#"
[ "["
attribute
identifier "derive"
token_tree
( "("
identifier "Debug"
, ","
identifier "Default"
) ")"
] "]"
struct_item (+31 nodes collapsed)
struct_item (+86 nodes collapsed)
impl_item (+49 nodes collapsed)