diff --git a/libs/clipboard/src/cliprdr.rs b/libs/clipboard/src/cliprdr.rs index f8d5d84b0..08d4021e8 100644 --- a/libs/clipboard/src/cliprdr.rs +++ b/libs/clipboard/src/cliprdr.rs @@ -239,6 +239,8 @@ pub type CLIPRDR_FORMAT = _CLIPRDR_FORMAT; pub struct _CLIPRDR_FORMAT_LIST { pub connID: UINT32, pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, pub numFormats: UINT32, pub formats: *mut CLIPRDR_FORMAT, } diff --git a/libs/clipboard/src/lib.rs b/libs/clipboard/src/lib.rs index 9f9e7cda9..f4d3c9de1 100644 --- a/libs/clipboard/src/lib.rs +++ b/libs/clipboard/src/lib.rs @@ -62,9 +62,17 @@ struct MsgChannel { receiver: Arc>>, } +#[derive(PartialEq)] +pub enum ProcessSide { + UnknownSide, + ClientSide, + ServerSide, +} + lazy_static::lazy_static! { static ref VEC_MSG_CHANNEL: RwLock> = Default::default(); static ref CLIP_CONN_ENABLED: Mutex = Mutex::new(ConnEnabled::default()); + static ref PROCESS_SIDE: RwLock = RwLock::new(ProcessSide::UnknownSide); } #[inline] @@ -249,6 +257,8 @@ pub fn server_format_list( let format_list = CLIPRDR_FORMAT_LIST { connID: conn_id as UINT32, msgType: 0 as UINT16, + msgFlags: 0 as UINT16, + dataLen: 0 as UINT32, numFormats: num_formats, formats: formats.as_mut_ptr(), }; @@ -390,7 +400,10 @@ pub fn server_file_contents_response( pub fn create_cliprdr_context( enable_files: bool, enable_others: bool, + process_side: ProcessSide, ) -> ResultType> { + *PROCESS_SIDE.write().unwrap() = process_side; + Ok(CliprdrClientContext::create( enable_files, enable_others, @@ -405,8 +418,11 @@ pub fn create_cliprdr_context( } extern "C" fn check_enabled(conn_id: UINT32) -> BOOL { - let lock = CLIP_CONN_ENABLED.lock().unwrap(); + if *PROCESS_SIDE.read().unwrap() == ProcessSide::ClientSide { + return TRUE; + } + let lock = CLIP_CONN_ENABLED.lock().unwrap(); let mut connd_enabled = false; if conn_id != 0 { if let Some(true) = lock.conn_enabled.get(&(conn_id as i32)) { diff --git a/libs/clipboard/src/windows/wf_cliprdr.c b/libs/clipboard/src/windows/wf_cliprdr.c index 58c7a301e..9dcec737d 100644 --- a/libs/clipboard/src/windows/wf_cliprdr.c +++ b/libs/clipboard/src/windows/wf_cliprdr.c @@ -135,14 +135,14 @@ typedef struct _FORMAT_IDS FORMAT_IDS; #define TAG "windows" -#ifdef WITH_DEBUG_CLIPRDR -#define DEBUG_CLIPRDR(...) printf(TAG, __VA_ARGS__) -#else -#define DEBUG_CLIPRDR(...) \ - do \ - { \ - } while (0) -#endif +// #ifdef WITH_DEBUG_CLIPRDR +#define DEBUG_CLIPRDR(fmt, ...) fprintf(stderr, "DEBUG %s[%d] %s() " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__);fflush(stderr) +// #else +// #define DEBUG_CLIPRDR(fmt, ...) \ +// do \ +// { \ +// } while (0) +// #endif typedef BOOL(WINAPI *fnAddClipboardFormatListener)(HWND hwnd); typedef BOOL(WINAPI *fnRemoveClipboardFormatListener)(HWND hwnd); @@ -974,7 +974,7 @@ static BOOL wf_create_file_obj(UINT32 *connID, wfClipboard *clipboard, IDataObje stgmeds[1].tymed = TYMED_ISTREAM; stgmeds[1].pstm = NULL; stgmeds[1].pUnkForRelease = NULL; - *ppDataObject = (IDataObject *)CliprdrDataObject_New(*connID, *(connID + 1), fmtetc, stgmeds, 2, clipboard); + *ppDataObject = (IDataObject *)CliprdrDataObject_New(*connID, fmtetc, stgmeds, 2, clipboard); return (*ppDataObject) ? TRUE : FALSE; } diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index 6f85f6076..bf30cfae1 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -64,7 +64,8 @@ fn check_clipboard_file_context(enable_file_transfer: bool) { let mut lock = CLIPBOARD_FILE_CONTEXT.lock().unwrap(); if enabled { if *lock == 0 { - match clipboard::create_cliprdr_context(true, false) { + match clipboard::create_cliprdr_context(true, false, clipboard::ProcessSide::ClientSide) + { Ok(context) => { log::info!("clipboard context for file transfer created."); *lock = Box::into_raw(context) as _; diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index 188398bb2..26f3d636c 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -730,7 +730,7 @@ pub async fn start_clipboard_file(mut rx: mpsc::UnboundedReceiver { if enabled && cliprdr_context.is_none() { - cliprdr_context = Some(match clipboard::create_cliprdr_context(true, false) { + cliprdr_context = Some(match clipboard::create_cliprdr_context(true, false, clipboard::ProcessSide::ServerSide) { Ok(context) => { log::info!("clipboard context for file transfer created."); context