[spice-gtk v1] file-xfer: differentiate error from host/guest and client

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Victor Toso <me@xxxxxxxxxxxxxx>

During file transfer, we can have error and cancellation in client,
host or guest side.

If error happens in the client side, we must send a message to the
guest, VD_AGENT_FILE_XFER_STATUS, with either _STATUS_CANCELLED or
_STATUS_ERROR.

But the current code is also sending a message to the guest when
error/cancellation does not come from client, leading to unexpected
messages to be received in host/guest.

SPICE_CLIENT_ERROR_FILE_TRANSFER_FAILED is introduced in this patch to
mark a SpiceFileTransferTask to be failed due host or guest problems.

The generic error code SPICE_CLIENT_ERROR_FAILED is still used in
spice_main_file_copy_async() API.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=99170
Signed-off-by: Victor Toso <victortoso@xxxxxxxxxx>
Reported-by: Pavel Grunt <pgrunt@xxxxxxxxxx>
---
 src/channel-main.c | 11 +++++++----
 src/spice-client.h |  1 +
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/channel-main.c b/src/channel-main.c
index ed5d611..e92d363 100644
--- a/src/channel-main.c
+++ b/src/channel-main.c
@@ -1862,18 +1862,18 @@ static void main_agent_handle_xfer_status(SpiceMainChannel *channel,
         spice_file_transfer_task_read_async(xfer_task, file_xfer_read_async_cb, xfer_op);
         return;
     case VD_AGENT_FILE_XFER_STATUS_CANCELLED:
-        error = g_error_new_literal(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+        error = g_error_new_literal(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FILE_TRANSFER_FAILED,
                                     _("The spice agent cancelled the file transfer"));
         break;
     case VD_AGENT_FILE_XFER_STATUS_ERROR:
-        error = g_error_new_literal(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+        error = g_error_new_literal(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FILE_TRANSFER_FAILED,
                                     _("The spice agent reported an error during the file transfer"));
         break;
     case VD_AGENT_FILE_XFER_STATUS_SUCCESS:
         break;
     default:
         g_warn_if_reached();
-        error = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+        error = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FILE_TRANSFER_FAILED,
                             "unhandled status type: %u", msg->result);
         break;
     }
@@ -2960,7 +2960,10 @@ static void file_transfer_operation_task_finished(SpiceFileTransferTask *xfer_ta
     task_id = spice_file_transfer_task_get_id(xfer_task);
     g_return_if_fail(task_id != 0);
 
-    if (error) {
+    if (g_error_matches(error, SPICE_CLIENT_ERROR,
+                        SPICE_CLIENT_ERROR_FILE_TRANSFER_FAILED)) {
+        spice_debug("xfer task: %u failed due cancel/error on server or agent", task_id);
+    } else if (error) {
         VDAgentFileXferStatusMessage msg;
         msg.id = task_id;
         if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
diff --git a/src/spice-client.h b/src/spice-client.h
index 32b79ea..8297537 100644
--- a/src/spice-client.h
+++ b/src/spice-client.h
@@ -82,6 +82,7 @@ typedef enum
     SPICE_CLIENT_ERROR_AUTH_NEEDS_USERNAME,
     SPICE_CLIENT_ERROR_AUTH_NEEDS_PASSWORD_AND_USERNAME,
     SPICE_CLIENT_ERROR_USB_SERVICE,
+    SPICE_CLIENT_ERROR_FILE_TRANSFER_FAILED,
 } SpiceClientError;
 
 #ifndef SPICE_DISABLE_DEPRECATED
-- 
2.9.3

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]