[Spice-devel] [RFC] [PATCH spice-protocol] DND: Add VD_AGENT_DND_*

Dunrong Huang riegamaths at gmail.com
Fri Nov 23 03:23:21 PST 2012


Hi, Hans

Very thanks for your patient guidance.

2012/11/17 Hans de Goede <hdegoede at redhat.com>:
> Hi,
>
> First of all many many thanks for working on this. For a first version these
> patches look very good!
>
> Second sorry for being a bit late with this reply I started composing it a
> week ago, and then other stuff got in the way. In the mean time you've had
> some other replies so some of the things in here may repeat stuff said
> in other mails ...
>
> But I would like to first settle on a final agent protocol, which supports
> all features we want before merging any parts of this, as once merged we
> can no longer change the proto.
>
> So I've been discussing this a bit with Alon, and thinking about it, and
> in the end I think we need the following messages:
>
> 1) VD_AGENT_FILE_XFER_STATUS
>
> enum VDAgentFileXferResult { VD_AGENT_FILE_XFER_SUCCESS,
> VD_AGENT_FILE_XFER_DISK_FULL, VD_AGENT_FILE_XFER_CANCELLED };
>
> typedef struct SPICE_ATTR_PACKED VDAgentFileXferStatusMessage{
>    uint32_t id;
>    uint32_t result;
> } VDAgentFileXferStatusMessage;
>
> 2) VD_AGENT_FILE_XFER_START
>
> typedef struct SPICE_ATTR_PACKED VDAgentFileXferStartMessage{
>    uint32_t id;
>    uint64_t file_size;
>    uint8_t file_name[0];
> } VDAgentFileXferStartMessage;
I extend this protocol as below:
enum {
    VD_AGENT_FILE_XFER_FORMAT_RAW,
    VD_AGENT_FILE_XFER_RESULT_GZIP,
};

typedef struct SPICE_ATTR_PACKED VDAgentFileXferStartMessage {
   uint32_t id;
   uint32_t is_dir; // is directory or not
   uint32_t compressed_format; // enable data compressed
   uint32_t file_mode; // file mode
   uint64_t file_size;
   uint8_t file_name[0];
} VDAgentFileXferStartMessage;
>
> 3) VD_AGENT_FILE_XFER_DATA
>
> typedef struct SPICE_ATTR_PACKED VDAgentFileXferDataMessage{
>    uint32_t id;
>    uint64_t size;
>    uint8_t data[0];
> } VDAgentFileXferDataMessage;
>
> The id-field is there to allow multiple simultaneous file transfers,
> this is useful ie when a user drag and drops a dvd iso, and then
> while that is transferring also drags and drops a word file he wants
> to work on, without having to wait for the iso transfer to finish,
> before the word document gets send.
>
> Here are some examples to clarify how this would work at the protocol
> level:
>
> Steps of a single file file-transfer:
> 1) Client sends a VD_AGENT_FILE_XFER_START
> 2) Agent reserves diskspace and sends an
>    VD_AGENT_FILE_XFER_STATUS with a VD_AGENT_FILE_XFER_SUCCESS
>    result
> 3) Client sends VD_AGENT_FILE_XFER_DATA messages until it has
>    send file-size bytes of data.
>
> Steps of a too large file-transfer:
> 1) Client sends a VD_AGENT_FILE_XFER_START
> 2) Agent fails to reserve diskspace and sends an
>    VD_AGENT_FILE_XFER_STATUS with a VD_AGENT_FILE_XFER_DISK_FULL
>    result
> 3) Client shows error dialog to the user
>
> Steps of a cancelled file-transfer
> 1) Client sends a VD_AGENT_FILE_XFER_START
> 2) Agent reserves diskspace and sends an
>    VD_AGENT_FILE_XFER_STATUS with a VD_AGENT_FILE_XFER_SUCCESS
>    result
> 3) Since this is a large file, which will take a while, the client
>    shows a window with a progress bar and a cancel button
> 4) Client sends some VD_AGENT_FILE_XFER_DATA messages
> 5) user clicks cancel
> 6) Client sends a VD_AGENT_FILE_XFER_STATUS with a
>    VD_AGENT_FILE_XFER_CANCELLED result, stops sending
>    further data and closes the progress dialog
> 7) The agent frees the reserved diskspace upon reception of
>    the VD_AGENT_FILE_XFER_CANCELLED result
>
> Steps of a multi file file-transfer
> 1) Client sends a VD_AGENT_FILE_XFER_START, id = 1
> 2) Agent reserves diskspace and sends an
>    VD_AGENT_FILE_XFER_STATUS with a VD_AGENT_FILE_XFER_SUCCESS
>    result, id = 1
> 3) Client sends some VD_AGENT_FILE_XFER_DATA messages with id = 1
> 4) Client sends a VD_AGENT_FILE_XFER_START, id = 2
> 5) Agent reserves diskspace for id = 2 and sends an
>    VD_AGENT_FILE_XFER_STATUS with a VD_AGENT_FILE_XFER_SUCCESS
>    result, id = 2
> 6) Client sends some VD_AGENT_FILE_XFER_DATA messages with id = 1
> 7) Client sends some VD_AGENT_FILE_XFER_DATA messages with id = 2
> 8) 6 and 7 repeat, sending some data for each transfer until id = 2
>    is finished.
> 9) Client sends VD_AGENT_FILE_XFER_DATA messages with id = 2 until it
>    has finished too
>
> ###
>
> So about the spice-gtk implementation, both for copy and paste to keep
> working, as well as for multiple file transfers at the same time to work,
> the spice-gtk implementation cannot simply out the entire file in the
> agent msg queue in one go. So we need a mechanism to put some data in
> the agent msg queue, and then get called back when the queue is empty.
>
> I think the easiest way to do this is to:
> 1) add a callback ( + opaque context pointer) to the SpiceMsgOut struct,
>    with the callback prototype matching that of a GIdle function
> 2) Have a new spice_msg_out_new_callback function to create SpiceMsgOut
>    structs with the callback set, rather then with a regular msg
> 3) Have spice_msg_out_send call this callback rather then queuing the
>    packet when encountering such a callback SpiceMsgOut; and
> 4) spice_msg_out_send_internal schedule calling the callback through
>    g_idle_add
> 5) The file xfer code would then queue some agent messages with data,
>    followed by a callback SpiceMsgOut, which will then caused the
>    file xfer code to get called for more data when the agent queue is
>    empty
>
> This way we can have multiple file transfers going at the same time,
> and keep copy and paste (and other agent messages) working while
> a file is being transferred.
>
> And as already mentioned, the function to add some file data to
> the agent message queue should use async gio code, to ensure to
> not freeze the client while waiting for disk io.
>
> I believe that at least for the Linux agent the agent code can
> simply use synchronous file-io.
>
> Regards,
>
> Hans

V2 has been sent to mailing list

-- 
Best Regards,

Dunrong Huang


More information about the Spice-devel mailing list