mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-11-27 23:19:02 +08:00
patch: add more logs
Signed-off-by: ClSlaid <cailue@bupt.edu.cn>
This commit is contained in:
parent
9adda25e00
commit
1f91d4fa7b
@ -221,6 +221,12 @@ impl LocalFile {
|
|||||||
let wstr: WString<utf16string::LE> = WString::from(&self.name);
|
let wstr: WString<utf16string::LE> = WString::from(&self.name);
|
||||||
let name = wstr.as_bytes();
|
let name = wstr.as_bytes();
|
||||||
|
|
||||||
|
log::debug!(
|
||||||
|
"put file to list: name_len {}, name {}",
|
||||||
|
name.len(),
|
||||||
|
&self.name
|
||||||
|
);
|
||||||
|
|
||||||
let flags = 0x4064;
|
let flags = 0x4064;
|
||||||
|
|
||||||
// flags, 4 bytes
|
// flags, 4 bytes
|
||||||
@ -382,7 +388,9 @@ impl ClipboardContext {
|
|||||||
let prefix = self.fuse_mount_point.clone();
|
let prefix = self.fuse_mount_point.clone();
|
||||||
let paths: Vec<PathBuf> = paths.iter().cloned().map(|p| prefix.join(p)).collect();
|
let paths: Vec<PathBuf> = paths.iter().cloned().map(|p| prefix.join(p)).collect();
|
||||||
log::debug!("setting clipboard with paths: {:?}", paths);
|
log::debug!("setting clipboard with paths: {:?}", paths);
|
||||||
self.clipboard.set_file_list(&paths)
|
self.clipboard.set_file_list(&paths)?;
|
||||||
|
log::debug!("clipboard set, paths: {:?}", paths);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serve_file_contents(
|
fn serve_file_contents(
|
||||||
@ -544,8 +552,8 @@ impl ClipboardContext {
|
|||||||
|
|
||||||
pub fn serve(&self, conn_id: i32, msg: ClipboardFile) -> Result<(), CliprdrError> {
|
pub fn serve(&self, conn_id: i32, msg: ClipboardFile) -> Result<(), CliprdrError> {
|
||||||
if self.is_stopped() {
|
if self.is_stopped() {
|
||||||
log::debug!("cliprdr stopped, skip serving clipboard");
|
log::debug!("cliprdr stopped, restart it");
|
||||||
return Ok(());
|
self.run()?;
|
||||||
}
|
}
|
||||||
match msg {
|
match msg {
|
||||||
ClipboardFile::NotifyCallback { .. } => {
|
ClipboardFile::NotifyCallback { .. } => {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use std::{
|
use std::{
|
||||||
|
collections::BTreeSet,
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
sync::atomic::{AtomicBool, Ordering},
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
};
|
};
|
||||||
@ -8,6 +9,7 @@ use hbb_common::{
|
|||||||
log,
|
log,
|
||||||
};
|
};
|
||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::OnceCell;
|
||||||
|
use parking_lot::Mutex;
|
||||||
use x11_clipboard::Clipboard;
|
use x11_clipboard::Clipboard;
|
||||||
use x11rb::protocol::xproto::Atom;
|
use x11rb::protocol::xproto::Atom;
|
||||||
|
|
||||||
@ -23,6 +25,9 @@ use super::{encode_path_to_uri, parse_plain_uri_list, SysClipboard};
|
|||||||
|
|
||||||
static X11_CLIPBOARD: OnceCell<Clipboard> = OnceCell::new();
|
static X11_CLIPBOARD: OnceCell<Clipboard> = OnceCell::new();
|
||||||
|
|
||||||
|
// this is tested on an Arch Linux with X11
|
||||||
|
const X11_CLIPBOARD_TIMEOUT: std::time::Duration = std::time::Duration::from_millis(70);
|
||||||
|
|
||||||
fn get_clip() -> Result<&'static Clipboard, CliprdrError> {
|
fn get_clip() -> Result<&'static Clipboard, CliprdrError> {
|
||||||
X11_CLIPBOARD.get_or_try_init(|| Clipboard::new().map_err(|_| CliprdrError::CliprdrInit))
|
X11_CLIPBOARD.get_or_try_init(|| Clipboard::new().map_err(|_| CliprdrError::CliprdrInit))
|
||||||
}
|
}
|
||||||
@ -32,6 +37,8 @@ pub struct X11Clipboard {
|
|||||||
ignore_path: PathBuf,
|
ignore_path: PathBuf,
|
||||||
text_uri_list: Atom,
|
text_uri_list: Atom,
|
||||||
gnome_copied_files: Atom,
|
gnome_copied_files: Atom,
|
||||||
|
|
||||||
|
former_file_list: Mutex<Vec<PathBuf>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl X11Clipboard {
|
impl X11Clipboard {
|
||||||
@ -50,15 +57,18 @@ impl X11Clipboard {
|
|||||||
stop: AtomicBool::new(false),
|
stop: AtomicBool::new(false),
|
||||||
text_uri_list,
|
text_uri_list,
|
||||||
gnome_copied_files,
|
gnome_copied_files,
|
||||||
|
former_file_list: Mutex::new(vec![]),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load(&self, target: Atom) -> Result<Vec<u8>, CliprdrError> {
|
fn load(&self, target: Atom) -> Result<Vec<u8>, CliprdrError> {
|
||||||
let clip = get_clip()?.setter.atoms.clipboard;
|
let clip = get_clip()?.setter.atoms.clipboard;
|
||||||
let prop = get_clip()?.setter.atoms.property;
|
let prop = get_clip()?.setter.atoms.property;
|
||||||
log::debug!("try to load clipboard content");
|
// NOTE:
|
||||||
|
// # why not use `load_wait`
|
||||||
|
// load_wait is likely to wait forever, which is not what we want
|
||||||
get_clip()?
|
get_clip()?
|
||||||
.load_wait(clip, target, prop)
|
.load(clip, target, prop, X11_CLIPBOARD_TIMEOUT)
|
||||||
.map_err(|_| CliprdrError::ConversionFailure)
|
.map_err(|_| CliprdrError::ConversionFailure)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,6 +100,8 @@ impl X11Clipboard {
|
|||||||
|
|
||||||
impl SysClipboard for X11Clipboard {
|
impl SysClipboard for X11Clipboard {
|
||||||
fn set_file_list(&self, paths: &[PathBuf]) -> Result<(), CliprdrError> {
|
fn set_file_list(&self, paths: &[PathBuf]) -> Result<(), CliprdrError> {
|
||||||
|
*self.former_file_list.lock() = paths.to_vec();
|
||||||
|
|
||||||
let uri_list: Vec<String> = paths.iter().map(|pb| encode_path_to_uri(pb)).collect();
|
let uri_list: Vec<String> = paths.iter().map(|pb| encode_path_to_uri(pb)).collect();
|
||||||
let uri_list = uri_list.join("\n");
|
let uri_list = uri_list.join("\n");
|
||||||
let text_uri_list_data = uri_list.as_bytes().to_vec();
|
let text_uri_list_data = uri_list.as_bytes().to_vec();
|
||||||
@ -109,12 +121,22 @@ impl SysClipboard for X11Clipboard {
|
|||||||
fn start(&self) {
|
fn start(&self) {
|
||||||
self.stop.store(false, Ordering::Relaxed);
|
self.stop.store(false, Ordering::Relaxed);
|
||||||
|
|
||||||
while let Ok(sth) = self.wait_file_list() {
|
loop {
|
||||||
|
let sth = match self.wait_file_list() {
|
||||||
|
Ok(sth) => sth,
|
||||||
|
Err(e) => {
|
||||||
|
log::warn!("failed to get file list from clipboard: {}", e);
|
||||||
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if self.is_stopped() {
|
if self.is_stopped() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
let Some(paths) = sth else {
|
let Some(paths) = sth else {
|
||||||
|
// just sleep
|
||||||
std::thread::sleep(std::time::Duration::from_millis(100));
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
@ -129,8 +151,20 @@ impl SysClipboard for X11Clipboard {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// send update to server
|
{
|
||||||
log::debug!("clipboard updated: {:?}", filtered);
|
let mut former = self.former_file_list.lock();
|
||||||
|
|
||||||
|
let filtered_st: BTreeSet<_> = filtered.iter().collect();
|
||||||
|
let former_st = former.iter().collect();
|
||||||
|
if filtered_st == former_st {
|
||||||
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// send update to server
|
||||||
|
log::debug!("clipboard updated: {:?}", filtered);
|
||||||
|
*former = filtered;
|
||||||
|
}
|
||||||
|
|
||||||
if let Err(e) = send_format_list(0) {
|
if let Err(e) = send_format_list(0) {
|
||||||
log::warn!("failed to send format list: {}", e);
|
log::warn!("failed to send format list: {}", e);
|
||||||
@ -138,6 +172,7 @@ impl SysClipboard for X11Clipboard {
|
|||||||
|
|
||||||
std::thread::sleep(std::time::Duration::from_millis(100));
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
}
|
}
|
||||||
|
log::debug!("stop listening file related atoms on clipboard");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_format_list(&self, conn_id: i32) -> Result<(), CliprdrError> {
|
fn send_format_list(&self, conn_id: i32) -> Result<(), CliprdrError> {
|
||||||
|
@ -52,6 +52,8 @@ pub fn create_cliprdr_context(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let linux_ctx = linux::ClipboardContext::new(timeout, rd_mnt)?;
|
let linux_ctx = linux::ClipboardContext::new(timeout, rd_mnt)?;
|
||||||
|
log::debug!("start cliprdr FUSE");
|
||||||
|
linux_ctx.run().expect("failed to start cliprdr FUSE");
|
||||||
|
|
||||||
Ok(Box::new(linux_ctx) as Box<_>)
|
Ok(Box::new(linux_ctx) as Box<_>)
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,8 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
if stop {
|
if stop {
|
||||||
ContextSend::set_is_stopped();
|
ContextSend::set_is_stopped();
|
||||||
} else {
|
} else {
|
||||||
allow_err!(peer.send(&crate::clipboard_file::clip_2_msg(clip)).await);
|
let msg = crate::clipboard_file::clip_2_msg(clip);
|
||||||
|
allow_err!(peer.send(&msg).await);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -338,9 +338,11 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
|||||||
let _tx_clip;
|
let _tx_clip;
|
||||||
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
||||||
if self.conn_id > 0 && is_authorized {
|
if self.conn_id > 0 && is_authorized {
|
||||||
|
log::debug!("Clipboard is enabled from client peer: type 1");
|
||||||
rx_clip1 = clipboard::get_rx_cliprdr_server(self.conn_id);
|
rx_clip1 = clipboard::get_rx_cliprdr_server(self.conn_id);
|
||||||
rx_clip = rx_clip1.lock().await;
|
rx_clip = rx_clip1.lock().await;
|
||||||
} else {
|
} else {
|
||||||
|
log::debug!("Clipboard is enabled from client peer, actually useless: type 2");
|
||||||
let rx_clip2;
|
let rx_clip2;
|
||||||
(_tx_clip, rx_clip2) = unbounded_channel::<clipboard::ClipboardFile>();
|
(_tx_clip, rx_clip2) = unbounded_channel::<clipboard::ClipboardFile>();
|
||||||
rx_clip1 = Arc::new(TokioMutex::new(rx_clip2));
|
rx_clip1 = Arc::new(TokioMutex::new(rx_clip2));
|
||||||
@ -480,7 +482,8 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(data) = self.rx.recv() => {
|
Some(data) = self.rx.recv() => {
|
||||||
if self.stream.send(&data).await.is_err() {
|
if let Err(e) = self.stream.send(&data).await {
|
||||||
|
log::error!("error encountered in IPC task, quitting: {}", e);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
match &data {
|
match &data {
|
||||||
|
Loading…
Reference in New Issue
Block a user