After dragging a zero-size file, then I open it in guest, I get a warning message box which says: "the process cannot access the file because it is being used by another process". And I get to know the file is occupied by vdagent. Now we look back the process:
a) When dragging a zero-size file, spice-gtk gets the name and size, then sends the message to vd_agent with VD_AGENT_FILE_XFER_START b) vd_agent receives and parsers the message, then gets file name and size, creates(open) the file and gets the handler, at last, sends VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA c) spice-gtk receives the VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA message, the sends data with VD_AGENT_FILE_XFER_DATA d) vd_agent receives and writes data to the file opened e) After finishing the writing, vd_agent closes the handler But in step c, we take a look the code: //spice-channel.c >static void file_xfer_read_cb(...) >{ > //... > count = g_input_stream_read_finish(G_INPUT_STREAM(task->file_stream), res, &error); > if (count > 0) { > task->read_bytes += count; > file_xfer_queue(task, count); > file_xfer_flush_async(channel, task->cancellable, > file_xfer_data_flushed_cb, task); > task->pending = TRUE; > } else if (error) { > VDAgentFileXferStatusMessage msg = { > .id = task->id, > .result = VD_AGENT_FILE_XFER_STATUS_ERROR, > }; > agent_msg_queue_many(task->channel, VD_AGENT_FILE_XFER_STATUS, > &msg, sizeof(msg), NULL); > spice_channel_wakeup(SPICE_CHANNEL(task->channel), FALSE); > file_xfer_completed(task, error); > } >} If count == 0, then it does nothing! Then vd_agent will receive nothing after opening a file, and always occupy the file. Here we close the file if file_size = 0, even though it doesn't make sense to send a zero-size file. --- vdagent/file_xfer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp index 34a9ee6..17d842e 100644 --- a/vdagent/file_xfer.cpp +++ b/vdagent/file_xfer.cpp @@ -89,6 +89,10 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, vd_printf("failed creating %s %lu", file_path, GetLastError()); return; } + if (file_size == 0){ + CloseHandle(handle); + return; + } task = new FileXferTask(handle, file_size, file_path); _tasks[start->id] = task; status->result = VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA; -- 1.9.3 -- QSBDT0RFUiBGUk9NIFJJRVNUIE9GIENUU0VV
_______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel