[Spice-devel] [PATCH spice-gtk 2/2] file-xfer: Inform client of errors on init of xfer
Victor Toso
victortoso at redhat.com
Tue Jul 11 10:35:43 UTC 2017
On Tue, Jul 11, 2017 at 11:39:57AM +0200, Pavel Grunt wrote:
> Hi,
>
> On Mon, 2017-07-03 at 15:28 +0200, Victor Toso wrote:
> > From: Victor Toso <me at victortoso.com>
> >
> > With SpiceFileTransferTask we suggest that Spice clients watch
> > (signal) SpiceMainChannel::new-file-transfer so it can follow the
> ... so they can..
> > transfer's progress till the moment it is finished.
> >
> > On (signal) SpiceFileTransferTask::finished, we will issue if any
> > error has happened to the application.
>
> imo this sentence is hard to read. What about:
> The signal SpiceFileTransferTask::finished informs if an error happens to the
> application
>
>
> >
> > This patch solves the problem of SpiceFileTransferTask::finished not
> > being emitted when the agent is not connected nor when file-transfer
> > is disabled in the host.
> >
> > We should fist emit SpiceMainChannel::new-file-transfer followed up by
> first
>
> > SpiceFileTransferTask::finished, which is done by the function
> > spice_file_transfer_task_completed().
> >
> > As channel-main chains up the "finish" signal by removing the
> > SpiceFileTransferTask from its GHashTable, we have to change from
> > GHashTableIter to a simple GList of keys.
> okay
> >
> > Related: https://bugzilla.redhat.com/show_bug.cgi?id=1373830
> > Signed-off-by: Victor Toso <victortoso at redhat.com>
> > ---
> > src/channel-main.c | 50 ++++++++++++++++++++++----------------------------
> > 1 file changed, 22 insertions(+), 28 deletions(-)
> >
> > diff --git a/src/channel-main.c b/src/channel-main.c
> > index 1c77c7b..0140d5b 100644
> > --- a/src/channel-main.c
> > +++ b/src/channel-main.c
> > @@ -3103,9 +3103,9 @@ void spice_main_file_copy_async(SpiceMainChannel
> > *channel,
> > gpointer user_data)
> > {
> > SpiceMainChannelPrivate *c;
> > - GHashTableIter iter;
> > - gpointer key, value;
> > FileTransferOperation *xfer_op;
> > + GError *error = NULL;
> > + GList *it, *keys;
> >
> > g_return_if_fail(channel != NULL);
> > g_return_if_fail(SPICE_IS_MAIN_CHANNEL(channel));
> > @@ -3113,25 +3113,13 @@ void spice_main_file_copy_async(SpiceMainChannel
> > *channel,
> >
> > c = channel->priv;
> > if (!c->agent_connected) {
> > - g_task_report_new_error(channel,
> > - callback,
> > - user_data,
> > - spice_main_file_copy_async,
> > - SPICE_CLIENT_ERROR,
> > - SPICE_CLIENT_ERROR_FAILED,
> > - _("The agent is not connected"));
> > - return;
> > - }
> > -
> > - if (test_agent_cap(channel, VD_AGENT_CAP_FILE_XFER_DISABLED)) {
> > - g_task_report_new_error(channel,
> > - callback,
> > - user_data,
> > - spice_main_file_copy_async,
> > - SPICE_CLIENT_ERROR,
> > - SPICE_CLIENT_ERROR_FAILED,
> > - _("The file transfer is disabled"));
> > - return;
> > + error = g_error_new(SPICE_CLIENT_ERROR,
> > + SPICE_CLIENT_ERROR_FAILED,
> > + _("The agent is not connected"));
> > + } else if (test_agent_cap(channel, VD_AGENT_CAP_FILE_XFER_DISABLED)) {
> > + error = g_error_new(SPICE_CLIENT_ERROR,
> > + SPICE_CLIENT_ERROR_FAILED,
> > + _("The file transfer is disabled"));
> > }
> >
> > xfer_op = g_new0(FileTransferOperation, 1);
> > @@ -3144,23 +3132,29 @@ void spice_main_file_copy_async(SpiceMainChannel
> > *channel,
> > flags,
> > cancellable);
> > xfer_op->stats.num_files = g_hash_table_size(xfer_op->xfer_task);
> > - g_hash_table_iter_init(&iter, xfer_op->xfer_task);
> > - while (g_hash_table_iter_next(&iter, &key, &value)) {
> > + keys = g_hash_table_get_keys(xfer_op->xfer_task);
> > + for (it = keys; it != NULL; it = it->next) {
> > guint32 task_id;
> > - SpiceFileTransferTask *xfer_task = value;
> > + SpiceFileTransferTask *xfer_task = g_hash_table_lookup(xfer_op-
> > >xfer_task, it->data);
> >
> > task_id = spice_file_transfer_task_get_id(xfer_task);
> >
> > SPICE_DEBUG("Insert a xfer task:%u to task list", task_id);
> >
> > - g_hash_table_insert(c->file_xfer_tasks, key, xfer_op);
> > + g_hash_table_insert(c->file_xfer_tasks, it->data, xfer_op);
> > g_signal_connect(xfer_task, "finished",
> > G_CALLBACK(file_transfer_operation_task_finished), NULL);
> > g_signal_emit(channel, signals[SPICE_MAIN_NEW_FILE_TRANSFER], 0,
> > xfer_task);
> >
> > - spice_file_transfer_task_init_task_async(xfer_task,
> > - file_xfer_init_task_async_cb
> > ,
> > - xfer_op);
> > + if (error == NULL) {
> > + spice_file_transfer_task_init_task_async(xfer_task,
> > + file_xfer_init_task_asyn
> > c_cb,
> > + xfer_op);
> > + } else {
> > + spice_file_transfer_task_completed(xfer_task,
> > g_error_copy(error));
> > + }
> > }
> > + g_list_free(keys);
> > + g_clear_pointer(&error, g_error_free);
>
> g_clear_error
>
> Thanks,
> Pavel
Sure, Thanks for the review
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170711/16ae9f31/attachment.sig>
More information about the Spice-devel
mailing list