mirror of
https://github.com/weyne85/rustdesk.git
synced 2025-10-29 17:00:05 +00:00
@@ -26,10 +26,10 @@ use hbb_common::{fs, log, Stream};
|
||||
|
||||
use crate::client::{
|
||||
new_voice_call_request, Client, CodecFormat, MediaData, MediaSender, QualityStatus, MILLI1,
|
||||
SEC30, SERVER_CLIPBOARD_ENABLED, SERVER_FILE_TRANSFER_ENABLED, SERVER_KEYBOARD_ENABLED,
|
||||
SEC30,
|
||||
};
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use crate::common::{check_clipboard, update_clipboard, ClipboardContext, CLIPBOARD_INTERVAL};
|
||||
use crate::common::update_clipboard;
|
||||
use crate::common::{get_default_sound_input, set_sound_input};
|
||||
use crate::ui_session_interface::{InvokeUiSession, Session};
|
||||
use crate::{audio_service, common, ConnInner, CLIENT_SERVER};
|
||||
@@ -91,7 +91,6 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
}
|
||||
|
||||
pub async fn io_loop(&mut self, key: &str, token: &str) {
|
||||
let stop_clipboard = self.start_clipboard();
|
||||
let mut last_recv_time = Instant::now();
|
||||
let mut received = false;
|
||||
let conn_type = if self.handler.is_file_transfer() {
|
||||
@@ -110,9 +109,6 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
.await
|
||||
{
|
||||
Ok((mut peer, direct)) => {
|
||||
SERVER_KEYBOARD_ENABLED.store(true, Ordering::SeqCst);
|
||||
SERVER_CLIPBOARD_ENABLED.store(true, Ordering::SeqCst);
|
||||
SERVER_FILE_TRANSFER_ENABLED.store(true, Ordering::SeqCst);
|
||||
self.handler.set_connection_type(peer.is_secured(), direct); // flutter -> connection_ready
|
||||
self.handler.set_connection_info(direct, false);
|
||||
|
||||
@@ -237,12 +233,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
.msgbox("error", "Connection Error", &err.to_string(), "");
|
||||
}
|
||||
}
|
||||
if let Some(stop) = stop_clipboard {
|
||||
stop.send(()).ok();
|
||||
}
|
||||
SERVER_KEYBOARD_ENABLED.store(false, Ordering::SeqCst);
|
||||
SERVER_CLIPBOARD_ENABLED.store(false, Ordering::SeqCst);
|
||||
SERVER_FILE_TRANSFER_ENABLED.store(false, Ordering::SeqCst);
|
||||
Client::try_stop_clipboard(&self.handler.id);
|
||||
}
|
||||
|
||||
fn handle_job_status(&mut self, id: i32, file_num: i32, err: Option<String>) {
|
||||
@@ -347,46 +338,6 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
Some(tx)
|
||||
}
|
||||
|
||||
fn start_clipboard(&mut self) -> Option<std::sync::mpsc::Sender<()>> {
|
||||
if self.handler.is_file_transfer() || self.handler.is_port_forward() {
|
||||
return None;
|
||||
}
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
let old_clipboard = self.old_clipboard.clone();
|
||||
let tx_protobuf = self.sender.clone();
|
||||
let lc = self.handler.lc.clone();
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
match ClipboardContext::new() {
|
||||
Ok(mut ctx) => {
|
||||
// ignore clipboard update before service start
|
||||
check_clipboard(&mut ctx, Some(&old_clipboard));
|
||||
std::thread::spawn(move || loop {
|
||||
std::thread::sleep(Duration::from_millis(CLIPBOARD_INTERVAL));
|
||||
match rx.try_recv() {
|
||||
Ok(_) | Err(std::sync::mpsc::TryRecvError::Disconnected) => {
|
||||
log::debug!("Exit clipboard service of client");
|
||||
break;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
if !SERVER_CLIPBOARD_ENABLED.load(Ordering::SeqCst)
|
||||
|| !SERVER_KEYBOARD_ENABLED.load(Ordering::SeqCst)
|
||||
|| lc.read().unwrap().disable_clipboard.v
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if let Some(msg) = check_clipboard(&mut ctx, Some(&old_clipboard)) {
|
||||
tx_protobuf.send(Data::Message(msg)).ok();
|
||||
}
|
||||
});
|
||||
}
|
||||
Err(err) => {
|
||||
log::error!("Failed to start clipboard service of client: {}", err);
|
||||
}
|
||||
}
|
||||
Some(tx)
|
||||
}
|
||||
|
||||
async fn handle_msg_from_ui(&mut self, data: Data, peer: &mut Stream) -> bool {
|
||||
match data {
|
||||
Data::Close => {
|
||||
@@ -885,22 +836,28 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
Some(login_response::Union::PeerInfo(pi)) => {
|
||||
self.handler.handle_peer_info(pi);
|
||||
self.check_clipboard_file_context();
|
||||
if !(self.handler.is_file_transfer()
|
||||
|| self.handler.is_port_forward()
|
||||
|| !SERVER_CLIPBOARD_ENABLED.load(Ordering::SeqCst)
|
||||
|| !SERVER_KEYBOARD_ENABLED.load(Ordering::SeqCst)
|
||||
|| self.handler.lc.read().unwrap().disable_clipboard.v)
|
||||
{
|
||||
let txt = self.old_clipboard.lock().unwrap().clone();
|
||||
if !txt.is_empty() {
|
||||
let msg_out = crate::create_clipboard_msg(txt);
|
||||
let sender = self.sender.clone();
|
||||
tokio::spawn(async move {
|
||||
// due to clipboard service interval time
|
||||
sleep(common::CLIPBOARD_INTERVAL as f32 / 1_000.).await;
|
||||
sender.send(Data::Message(msg_out)).ok();
|
||||
});
|
||||
}
|
||||
if !(self.handler.is_file_transfer() || self.handler.is_port_forward()) {
|
||||
let sender = self.sender.clone();
|
||||
let permission_config = self.handler.get_permission_config();
|
||||
|
||||
#[cfg(feature = "flutter")]
|
||||
Client::try_start_clipboard(None);
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
Client::try_start_clipboard(Some((
|
||||
permission_config.clone(),
|
||||
sender.clone(),
|
||||
)));
|
||||
|
||||
tokio::spawn(async move {
|
||||
// due to clipboard service interval time
|
||||
sleep(common::CLIPBOARD_INTERVAL as f32 / 1_000.).await;
|
||||
if permission_config.is_text_clipboard_required() {
|
||||
if let Some(msg_out) = Client::get_current_text_clipboard_msg()
|
||||
{
|
||||
sender.send(Data::Message(msg_out)).ok();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if self.handler.is_file_transfer() {
|
||||
@@ -1092,18 +1049,23 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
log::info!("Change permission {:?} -> {}", p.permission, p.enabled);
|
||||
match p.permission.enum_value_or_default() {
|
||||
Permission::Keyboard => {
|
||||
SERVER_KEYBOARD_ENABLED.store(p.enabled, Ordering::SeqCst);
|
||||
#[cfg(feature = "flutter")]
|
||||
crate::flutter::update_text_clipboard_required();
|
||||
*self.handler.server_keyboard_enabled.write().unwrap() = p.enabled;
|
||||
self.handler.set_permission("keyboard", p.enabled);
|
||||
}
|
||||
Permission::Clipboard => {
|
||||
SERVER_CLIPBOARD_ENABLED.store(p.enabled, Ordering::SeqCst);
|
||||
#[cfg(feature = "flutter")]
|
||||
crate::flutter::update_text_clipboard_required();
|
||||
*self.handler.server_clipboard_enabled.write().unwrap() = p.enabled;
|
||||
self.handler.set_permission("clipboard", p.enabled);
|
||||
}
|
||||
Permission::Audio => {
|
||||
self.handler.set_permission("audio", p.enabled);
|
||||
}
|
||||
Permission::File => {
|
||||
SERVER_FILE_TRANSFER_ENABLED.store(p.enabled, Ordering::SeqCst);
|
||||
*self.handler.server_file_transfer_enabled.write().unwrap() =
|
||||
p.enabled;
|
||||
if !p.enabled && self.handler.is_file_transfer() {
|
||||
return true;
|
||||
}
|
||||
@@ -1416,7 +1378,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
fn check_clipboard_file_context(&self) {
|
||||
#[cfg(windows)]
|
||||
{
|
||||
let enabled = SERVER_FILE_TRANSFER_ENABLED.load(Ordering::SeqCst)
|
||||
let enabled = *self.handler.server_file_transfer_enabled.read().unwrap()
|
||||
&& self.handler.lc.read().unwrap().enable_file_transfer.v;
|
||||
ContextSend::enable(enabled);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user