Merge pull request #5198 from dignow/fix/win_file_clipboard
Fix/win file clipboard
This commit is contained in:
		
						commit
						285387c4c1
					
				@ -181,32 +181,37 @@ pub fn server_clip_file(
 | 
				
			|||||||
        ClipboardFile::MonitorReady => {
 | 
					        ClipboardFile::MonitorReady => {
 | 
				
			||||||
            log::debug!("server_monitor_ready called");
 | 
					            log::debug!("server_monitor_ready called");
 | 
				
			||||||
            ret = server_monitor_ready(context, conn_id);
 | 
					            ret = server_monitor_ready(context, conn_id);
 | 
				
			||||||
            log::debug!("server_monitor_ready called, return {}", ret);
 | 
					            log::debug!("server_monitor_ready called, conn_id {}, return {}", conn_id, ret);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClipboardFile::FormatList { format_list } => {
 | 
					        ClipboardFile::FormatList { format_list } => {
 | 
				
			||||||
            log::debug!("server_format_list called");
 | 
					            log::debug!("server_format_list called, conn_id {}, format_list: {:?}", conn_id, &format_list);
 | 
				
			||||||
            ret = server_format_list(context, conn_id, format_list);
 | 
					            ret = server_format_list(context, conn_id, format_list);
 | 
				
			||||||
            log::debug!("server_format_list called, return {}", ret);
 | 
					            log::debug!("server_format_list called, conn_id {}, return {}", conn_id, ret);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClipboardFile::FormatListResponse { msg_flags } => {
 | 
					        ClipboardFile::FormatListResponse { msg_flags } => {
 | 
				
			||||||
            log::debug!("format_list_response called");
 | 
					            log::debug!("server_format_list_response called");
 | 
				
			||||||
            ret = server_format_list_response(context, conn_id, msg_flags);
 | 
					            ret = server_format_list_response(context, conn_id, msg_flags);
 | 
				
			||||||
            log::debug!("server_format_list_response called, return {}", ret);
 | 
					            log::debug!("server_format_list_response called, conn_id {}, msg_flags {}, return {}", conn_id, msg_flags, ret);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClipboardFile::FormatDataRequest {
 | 
					        ClipboardFile::FormatDataRequest {
 | 
				
			||||||
            requested_format_id,
 | 
					            requested_format_id,
 | 
				
			||||||
        } => {
 | 
					        } => {
 | 
				
			||||||
            log::debug!("format_data_request called");
 | 
					            log::debug!("server_format_data_request called");
 | 
				
			||||||
            ret = server_format_data_request(context, conn_id, requested_format_id);
 | 
					            ret = server_format_data_request(context, conn_id, requested_format_id);
 | 
				
			||||||
            log::debug!("server_format_data_request called, return {}", ret);
 | 
					            log::debug!("server_format_data_request called, conn_id {}, requested_format_id {}, return {}", conn_id, requested_format_id, ret);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClipboardFile::FormatDataResponse {
 | 
					        ClipboardFile::FormatDataResponse {
 | 
				
			||||||
            msg_flags,
 | 
					            msg_flags,
 | 
				
			||||||
            format_data,
 | 
					            format_data,
 | 
				
			||||||
        } => {
 | 
					        } => {
 | 
				
			||||||
            log::debug!("format_data_response called");
 | 
					            log::debug!("server_format_data_response called");
 | 
				
			||||||
            ret = server_format_data_response(context, conn_id, msg_flags, format_data);
 | 
					            ret = server_format_data_response(context, conn_id, msg_flags, format_data);
 | 
				
			||||||
            log::debug!("server_format_data_response called, return {}", ret);
 | 
					            log::debug!(
 | 
				
			||||||
 | 
					                "server_format_data_response called, conn_id {}, msg_flags: {}, return {}",
 | 
				
			||||||
 | 
					                conn_id,
 | 
				
			||||||
 | 
					                msg_flags,
 | 
				
			||||||
 | 
					                ret
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClipboardFile::FileContentsRequest {
 | 
					        ClipboardFile::FileContentsRequest {
 | 
				
			||||||
            stream_id,
 | 
					            stream_id,
 | 
				
			||||||
@ -218,7 +223,7 @@ pub fn server_clip_file(
 | 
				
			|||||||
            have_clip_data_id,
 | 
					            have_clip_data_id,
 | 
				
			||||||
            clip_data_id,
 | 
					            clip_data_id,
 | 
				
			||||||
        } => {
 | 
					        } => {
 | 
				
			||||||
            log::debug!("file_contents_request called");
 | 
					            log::debug!("server_file_contents_request called");
 | 
				
			||||||
            ret = server_file_contents_request(
 | 
					            ret = server_file_contents_request(
 | 
				
			||||||
                context,
 | 
					                context,
 | 
				
			||||||
                conn_id,
 | 
					                conn_id,
 | 
				
			||||||
@ -231,14 +236,24 @@ pub fn server_clip_file(
 | 
				
			|||||||
                have_clip_data_id,
 | 
					                have_clip_data_id,
 | 
				
			||||||
                clip_data_id,
 | 
					                clip_data_id,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            log::debug!("server_file_contents_request called, return {}", ret);
 | 
					            log::debug!("server_file_contents_request called, conn_id {}, stream_id: {}, list_index {}, dw_flags {}, n_position_low {}, n_position_high {}, cb_requested {}, have_clip_data_id {}, clip_data_id {}, return {}",                 conn_id,
 | 
				
			||||||
 | 
					                stream_id,
 | 
				
			||||||
 | 
					                list_index,
 | 
				
			||||||
 | 
					                dw_flags,
 | 
				
			||||||
 | 
					                n_position_low,
 | 
				
			||||||
 | 
					                n_position_high,
 | 
				
			||||||
 | 
					                cb_requested,
 | 
				
			||||||
 | 
					                have_clip_data_id,
 | 
				
			||||||
 | 
					                clip_data_id,
 | 
				
			||||||
 | 
					                ret
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClipboardFile::FileContentsResponse {
 | 
					        ClipboardFile::FileContentsResponse {
 | 
				
			||||||
            msg_flags,
 | 
					            msg_flags,
 | 
				
			||||||
            stream_id,
 | 
					            stream_id,
 | 
				
			||||||
            requested_data,
 | 
					            requested_data,
 | 
				
			||||||
        } => {
 | 
					        } => {
 | 
				
			||||||
            log::debug!("file_contents_response called");
 | 
					            log::debug!("server_file_contents_response called");
 | 
				
			||||||
            ret = server_file_contents_response(
 | 
					            ret = server_file_contents_response(
 | 
				
			||||||
                context,
 | 
					                context,
 | 
				
			||||||
                conn_id,
 | 
					                conn_id,
 | 
				
			||||||
@ -246,7 +261,12 @@ pub fn server_clip_file(
 | 
				
			|||||||
                stream_id,
 | 
					                stream_id,
 | 
				
			||||||
                requested_data,
 | 
					                requested_data,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            log::debug!("server_file_contents_response called, return {}", ret);
 | 
					            log::debug!("server_file_contents_response called, conn_id {}, msg_flags {}, stream_id {}, return {}",
 | 
				
			||||||
 | 
					                conn_id,
 | 
				
			||||||
 | 
					                msg_flags,
 | 
				
			||||||
 | 
					                stream_id,
 | 
				
			||||||
 | 
					                ret
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
@ -515,8 +535,6 @@ extern "C" fn client_format_list(
 | 
				
			|||||||
    _context: *mut CliprdrClientContext,
 | 
					    _context: *mut CliprdrClientContext,
 | 
				
			||||||
    clip_format_list: *const CLIPRDR_FORMAT_LIST,
 | 
					    clip_format_list: *const CLIPRDR_FORMAT_LIST,
 | 
				
			||||||
) -> UINT {
 | 
					) -> UINT {
 | 
				
			||||||
    log::debug!("client_format_list called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let conn_id;
 | 
					    let conn_id;
 | 
				
			||||||
    let mut format_list: Vec<(i32, String)> = Vec::new();
 | 
					    let mut format_list: Vec<(i32, String)> = Vec::new();
 | 
				
			||||||
    unsafe {
 | 
					    unsafe {
 | 
				
			||||||
@ -541,6 +559,7 @@ extern "C" fn client_format_list(
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        conn_id = (*clip_format_list).connID as i32;
 | 
					        conn_id = (*clip_format_list).connID as i32;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    log::debug!("client_format_list called, client id: {}, format_list: {:?}", conn_id, &format_list);
 | 
				
			||||||
    let data = ClipboardFile::FormatList { format_list };
 | 
					    let data = ClipboardFile::FormatList { format_list };
 | 
				
			||||||
    // no need to handle result here
 | 
					    // no need to handle result here
 | 
				
			||||||
    if conn_id == 0 {
 | 
					    if conn_id == 0 {
 | 
				
			||||||
@ -560,14 +579,13 @@ extern "C" fn client_format_list_response(
 | 
				
			|||||||
    _context: *mut CliprdrClientContext,
 | 
					    _context: *mut CliprdrClientContext,
 | 
				
			||||||
    format_list_response: *const CLIPRDR_FORMAT_LIST_RESPONSE,
 | 
					    format_list_response: *const CLIPRDR_FORMAT_LIST_RESPONSE,
 | 
				
			||||||
) -> UINT {
 | 
					) -> UINT {
 | 
				
			||||||
    log::debug!("client_format_list_response called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let conn_id;
 | 
					    let conn_id;
 | 
				
			||||||
    let msg_flags;
 | 
					    let msg_flags;
 | 
				
			||||||
    unsafe {
 | 
					    unsafe {
 | 
				
			||||||
        conn_id = (*format_list_response).connID as i32;
 | 
					        conn_id = (*format_list_response).connID as i32;
 | 
				
			||||||
        msg_flags = (*format_list_response).msgFlags as i32;
 | 
					        msg_flags = (*format_list_response).msgFlags as i32;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    log::debug!("client_format_list_response called, client id: {}, msg_flags: {}", conn_id, msg_flags);
 | 
				
			||||||
    let data = ClipboardFile::FormatListResponse { msg_flags };
 | 
					    let data = ClipboardFile::FormatListResponse { msg_flags };
 | 
				
			||||||
    send_data(conn_id, data);
 | 
					    send_data(conn_id, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -578,8 +596,6 @@ extern "C" fn client_format_data_request(
 | 
				
			|||||||
    _context: *mut CliprdrClientContext,
 | 
					    _context: *mut CliprdrClientContext,
 | 
				
			||||||
    format_data_request: *const CLIPRDR_FORMAT_DATA_REQUEST,
 | 
					    format_data_request: *const CLIPRDR_FORMAT_DATA_REQUEST,
 | 
				
			||||||
) -> UINT {
 | 
					) -> UINT {
 | 
				
			||||||
    log::debug!("client_format_data_request called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let conn_id;
 | 
					    let conn_id;
 | 
				
			||||||
    let requested_format_id;
 | 
					    let requested_format_id;
 | 
				
			||||||
    unsafe {
 | 
					    unsafe {
 | 
				
			||||||
@ -589,6 +605,7 @@ extern "C" fn client_format_data_request(
 | 
				
			|||||||
    let data = ClipboardFile::FormatDataRequest {
 | 
					    let data = ClipboardFile::FormatDataRequest {
 | 
				
			||||||
        requested_format_id,
 | 
					        requested_format_id,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    log::debug!("client_format_data_request called, conn_id: {}, requested_format_id: {}", conn_id, requested_format_id);
 | 
				
			||||||
    // no need to handle result here
 | 
					    // no need to handle result here
 | 
				
			||||||
    send_data(conn_id, data);
 | 
					    send_data(conn_id, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -599,8 +616,6 @@ extern "C" fn client_format_data_response(
 | 
				
			|||||||
    _context: *mut CliprdrClientContext,
 | 
					    _context: *mut CliprdrClientContext,
 | 
				
			||||||
    format_data_response: *const CLIPRDR_FORMAT_DATA_RESPONSE,
 | 
					    format_data_response: *const CLIPRDR_FORMAT_DATA_RESPONSE,
 | 
				
			||||||
) -> UINT {
 | 
					) -> UINT {
 | 
				
			||||||
    log::debug!("cconn_idlient_format_data_response called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let conn_id;
 | 
					    let conn_id;
 | 
				
			||||||
    let msg_flags;
 | 
					    let msg_flags;
 | 
				
			||||||
    let format_data;
 | 
					    let format_data;
 | 
				
			||||||
@ -617,6 +632,7 @@ extern "C" fn client_format_data_response(
 | 
				
			|||||||
            .to_vec();
 | 
					            .to_vec();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    log::debug!("client_format_data_response called, client id: {}, msg_flags: {}", conn_id, msg_flags);
 | 
				
			||||||
    let data = ClipboardFile::FormatDataResponse {
 | 
					    let data = ClipboardFile::FormatDataResponse {
 | 
				
			||||||
        msg_flags,
 | 
					        msg_flags,
 | 
				
			||||||
        format_data,
 | 
					        format_data,
 | 
				
			||||||
@ -630,8 +646,6 @@ extern "C" fn client_file_contents_request(
 | 
				
			|||||||
    _context: *mut CliprdrClientContext,
 | 
					    _context: *mut CliprdrClientContext,
 | 
				
			||||||
    file_contents_request: *const CLIPRDR_FILE_CONTENTS_REQUEST,
 | 
					    file_contents_request: *const CLIPRDR_FILE_CONTENTS_REQUEST,
 | 
				
			||||||
) -> UINT {
 | 
					) -> UINT {
 | 
				
			||||||
    log::debug!("client_file_contents_request called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TODO: support huge file?
 | 
					    // TODO: support huge file?
 | 
				
			||||||
    // if (!cliprdr->hasHugeFileSupport)
 | 
					    // if (!cliprdr->hasHugeFileSupport)
 | 
				
			||||||
    // {
 | 
					    // {
 | 
				
			||||||
@ -662,7 +676,6 @@ extern "C" fn client_file_contents_request(
 | 
				
			|||||||
        have_clip_data_id = (*file_contents_request).haveClipDataId == TRUE;
 | 
					        have_clip_data_id = (*file_contents_request).haveClipDataId == TRUE;
 | 
				
			||||||
        clip_data_id = (*file_contents_request).clipDataId as i32;
 | 
					        clip_data_id = (*file_contents_request).clipDataId as i32;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    let data = ClipboardFile::FileContentsRequest {
 | 
					    let data = ClipboardFile::FileContentsRequest {
 | 
				
			||||||
        stream_id,
 | 
					        stream_id,
 | 
				
			||||||
        list_index,
 | 
					        list_index,
 | 
				
			||||||
@ -673,6 +686,7 @@ extern "C" fn client_file_contents_request(
 | 
				
			|||||||
        have_clip_data_id,
 | 
					        have_clip_data_id,
 | 
				
			||||||
        clip_data_id,
 | 
					        clip_data_id,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    log::debug!("client_file_contents_request called, data: {:?}", &data);
 | 
				
			||||||
    send_data(conn_id, data);
 | 
					    send_data(conn_id, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    0
 | 
					    0
 | 
				
			||||||
@ -682,8 +696,6 @@ extern "C" fn client_file_contents_response(
 | 
				
			|||||||
    _context: *mut CliprdrClientContext,
 | 
					    _context: *mut CliprdrClientContext,
 | 
				
			||||||
    file_contents_response: *const CLIPRDR_FILE_CONTENTS_RESPONSE,
 | 
					    file_contents_response: *const CLIPRDR_FILE_CONTENTS_RESPONSE,
 | 
				
			||||||
) -> UINT {
 | 
					) -> UINT {
 | 
				
			||||||
    log::debug!("client_file_contents_response called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let conn_id;
 | 
					    let conn_id;
 | 
				
			||||||
    let msg_flags;
 | 
					    let msg_flags;
 | 
				
			||||||
    let stream_id;
 | 
					    let stream_id;
 | 
				
			||||||
@ -707,6 +719,7 @@ extern "C" fn client_file_contents_response(
 | 
				
			|||||||
        stream_id,
 | 
					        stream_id,
 | 
				
			||||||
        requested_data,
 | 
					        requested_data,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    log::debug!("client_file_contents_response called, conn_id: {}, msg_flags: {}, stream_id: {}", conn_id, msg_flags, stream_id);
 | 
				
			||||||
    send_data(conn_id, data);
 | 
					    send_data(conn_id, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    0
 | 
					    0
 | 
				
			||||||
 | 
				
			|||||||
@ -1367,6 +1367,11 @@ static UINT cliprdr_send_format_list(wfClipboard *clipboard, UINT32 connID)
 | 
				
			|||||||
	if (!clipboard)
 | 
						if (!clipboard)
 | 
				
			||||||
		return ERROR_INTERNAL_ERROR;
 | 
							return ERROR_INTERNAL_ERROR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!IsClipboardFormatAvailable(CF_HDROP))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return ERROR_SUCCESS;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ZeroMemory(&formatList, sizeof(CLIPRDR_FORMAT_LIST));
 | 
						ZeroMemory(&formatList, sizeof(CLIPRDR_FORMAT_LIST));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ignore if other app is holding clipboard */
 | 
						/* Ignore if other app is holding clipboard */
 | 
				
			||||||
@ -1392,21 +1397,11 @@ static UINT cliprdr_send_format_list(wfClipboard *clipboard, UINT32 connID)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		index = 0;
 | 
							index = 0;
 | 
				
			||||||
 | 
							// IsClipboardFormatAvailable(CF_HDROP) is checked above
 | 
				
			||||||
		if (IsClipboardFormatAvailable(CF_HDROP))
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		UINT fsid = RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW);
 | 
							UINT fsid = RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW);
 | 
				
			||||||
		UINT fcid = RegisterClipboardFormat(CFSTR_FILECONTENTS);
 | 
							UINT fcid = RegisterClipboardFormat(CFSTR_FILECONTENTS);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		formats[index++].formatId = fsid;
 | 
							formats[index++].formatId = fsid;
 | 
				
			||||||
		formats[index++].formatId = fcid;
 | 
							formats[index++].formatId = fcid;
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			while (formatId = EnumClipboardFormats(formatId) && index < numFormats)
 | 
					 | 
				
			||||||
				formats[index++].formatId = formatId;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		numFormats = index;
 | 
							numFormats = index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!CloseClipboard())
 | 
							if (!CloseClipboard())
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user