[Spice-devel] [PATCH spice-gtk 1/2] main: remove SpiceFileTransferTaskPrivate

Pavel Grunt pgrunt at redhat.com
Wed May 25 15:42:48 UTC 2016


Of course it is correct, but I would wait with it after applying:
 https://lists.freedesktop.org/archives/spice-devel/2016-May/029359.html
or if Victor is ok with it?

Pavel

On Wed, 2016-05-25 at 17:33 +0200, Marc-André Lureau wrote:
> The struct is already private
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at gmail.com>
> ---
>  src/channel-main.c             | 227 +++++++++++++++++++---------------------
> -
>  src/spice-file-transfer-task.h |   1 -
>  2 files changed, 107 insertions(+), 121 deletions(-)
> 
> diff --git a/src/channel-main.c b/src/channel-main.c
> index b91daa5..c9bc668 100644
> --- a/src/channel-main.c
> +++ b/src/channel-main.c
> @@ -81,30 +81,6 @@ struct _SpiceFileTransferTask
>  {
>      GObject parent;
>  
> -    SpiceFileTransferTaskPrivate *priv;
> -};
> -
> -/**
> - * SpiceFileTransferTaskClass:
> - * @parent_class: Parent class.
> - *
> - * Class structure for #SpiceFileTransferTask.
> - */
> -struct _SpiceFileTransferTaskClass
> -{
> -    GObjectClass parent_class;
> -};
> -
> -G_DEFINE_TYPE(SpiceFileTransferTask, spice_file_transfer_task, G_TYPE_OBJECT)
> -
> -#define FILE_TRANSFER_TASK_PRIVATE(o) \
> -        (G_TYPE_INSTANCE_GET_PRIVATE((o), SPICE_TYPE_FILE_TRANSFER_TASK,
> SpiceFileTransferTaskPrivate))
> -
> -#define FILE_XFER_CHUNK_SIZE (VD_AGENT_MAX_DATA_SIZE * 32)
> -struct _SpiceFileTransferTaskPrivate
> -
> -/* private */
> -{
>      uint32_t                       id;
>      gboolean                       pending;
>      GFile                          *file;
> @@ -124,6 +100,21 @@ struct _SpiceFileTransferTaskPrivate
>      GError                         *error;
>  };
>  
> +/**
> + * SpiceFileTransferTaskClass:
> + * @parent_class: Parent class.
> + *
> + * Class structure for #SpiceFileTransferTask.
> + */
> +struct _SpiceFileTransferTaskClass
> +{
> +    GObjectClass parent_class;
> +};
> +
> +G_DEFINE_TYPE(SpiceFileTransferTask, spice_file_transfer_task, G_TYPE_OBJECT)
> +
> +#define FILE_XFER_CHUNK_SIZE (VD_AGENT_MAX_DATA_SIZE * 32)
> +
>  enum {
>      PROP_TASK_ID = 1,
>      PROP_TASK_CHANNEL,
> @@ -1837,23 +1828,23 @@ static void file_xfer_close_cb(GObject      *object,
>  
>      /* Notify to user that files have been transferred or something error
>         happened. */
> -    task = g_task_new(self->priv->channel,
> -                      self->priv->cancellable,
> -                      self->priv->callback,
> -                      self->priv->user_data);
> +    task = g_task_new(self->channel,
> +                      self->cancellable,
> +                      self->callback,
> +                      self->user_data);
>  
> -    if (self->priv->error) {
> -        g_task_return_error(task, self->priv->error);
> +    if (self->error) {
> +        g_task_return_error(task, self->error);
>      } else {
>          g_task_return_boolean(task, TRUE);
>          if (spice_util_get_debug()) {
>              gint64 now = g_get_monotonic_time();
> -            gchar *basename = g_file_get_basename(self->priv->file);
> -            double seconds = (double) (now - self->priv->start_time) /
> G_TIME_SPAN_SECOND;
> -            gchar *file_size_str = g_format_size(self->priv->file_size);
> -            gchar *transfer_speed_str = g_format_size(self->priv->file_size /
> seconds);
> +            gchar *basename = g_file_get_basename(self->file);
> +            double seconds = (double) (now - self->start_time) /
> G_TIME_SPAN_SECOND;
> +            gchar *file_size_str = g_format_size(self->file_size);
> +            gchar *transfer_speed_str = g_format_size(self->file_size /
> seconds);
>  
> -            g_warn_if_fail(self->priv->read_bytes == self->priv->file_size);
> +            g_warn_if_fail(self->read_bytes == self->file_size);
>              SPICE_DEBUG("transferred file %s of %s size in %.1f seconds
> (%s/s)",
>                          basename, file_size_str, seconds,
> transfer_speed_str);
>  
> @@ -1875,9 +1866,9 @@ static void file_xfer_data_flushed_cb(GObject
> *source_object,
>      SpiceMainChannel *channel = (SpiceMainChannel *)source_object;
>      GError *error = NULL;
>  
> -    self->priv->pending = FALSE;
> +    self->pending = FALSE;
>      file_xfer_flush_finish(channel, res, &error);
> -    if (error || self->priv->error) {
> +    if (error || self->error) {
>          spice_file_transfer_task_completed(self, error);
>          return;
>      }
> @@ -1886,19 +1877,19 @@ static void file_xfer_data_flushed_cb(GObject
> *source_object,
>          const GTimeSpan interval = 20 * G_TIME_SPAN_SECOND;
>          gint64 now = g_get_monotonic_time();
>  
> -        if (interval < now - self->priv->last_update) {
> -            gchar *basename = g_file_get_basename(self->priv->file);
> -            self->priv->last_update = now;
> +        if (interval < now - self->last_update) {
> +            gchar *basename = g_file_get_basename(self->file);
> +            self->last_update = now;
>              SPICE_DEBUG("transferred %.2f%% of the file %s",
> -                        100.0 * self->priv->read_bytes / self->priv-
> >file_size, basename);
> +                        100.0 * self->read_bytes / self->file_size,
> basename);
>              g_free(basename);
>          }
>      }
>  
> -    if (self->priv->progress_callback) {
> +    if (self->progress_callback) {
>          goffset read = 0;
>          goffset total = 0;
> -        SpiceMainChannel *main_channel = self->priv->channel;
> +        SpiceMainChannel *main_channel = self->channel;
>          GHashTableIter iter;
>          gpointer key, value;
>  
> @@ -1908,11 +1899,11 @@ static void file_xfer_data_flushed_cb(GObject
> *source_object,
>          g_hash_table_iter_init(&iter, main_channel->priv->file_xfer_tasks);
>          while (g_hash_table_iter_next(&iter, &key, &value)) {
>              SpiceFileTransferTask *t = (SpiceFileTransferTask *)value;
> -            read += t->priv->read_bytes;
> -            total += t->priv->file_size;
> +            read += t->read_bytes;
> +            total += t->file_size;
>          }
>  
> -        self->priv->progress_callback(read, total, self->priv-
> >progress_callback_data);
> +        self->progress_callback(read, total, self->progress_callback_data);
>      }
>  
>      /* Read more data */
> @@ -1922,13 +1913,13 @@ static void file_xfer_data_flushed_cb(GObject
> *source_object,
>  static void file_xfer_queue(SpiceFileTransferTask *self, int data_size)
>  {
>      VDAgentFileXferDataMessage msg;
> -    SpiceMainChannel *channel = SPICE_MAIN_CHANNEL(self->priv->channel);
> +    SpiceMainChannel *channel = SPICE_MAIN_CHANNEL(self->channel);
>  
> -    msg.id = self->priv->id;
> +    msg.id = self->id;
>      msg.size = data_size;
>      agent_msg_queue_many(channel, VD_AGENT_FILE_XFER_DATA,
>                           &msg, sizeof(msg),
> -                         self->priv->buffer, data_size, NULL);
> +                         self->buffer, data_size, NULL);
>      spice_channel_wakeup(SPICE_CHANNEL(channel), FALSE);
>  }
>  
> @@ -1938,30 +1929,30 @@ static void file_xfer_read_cb(GObject *source_object,
>                                gpointer user_data)
>  {
>      SpiceFileTransferTask *self = user_data;
> -    SpiceMainChannel *channel = self->priv->channel;
> +    SpiceMainChannel *channel = self->channel;
>      gssize count;
>      GError *error = NULL;
>  
> -    self->priv->pending = FALSE;
> -    count = g_input_stream_read_finish(G_INPUT_STREAM(self->priv-
> >file_stream),
> +    self->pending = FALSE;
> +    count = g_input_stream_read_finish(G_INPUT_STREAM(self->file_stream),
>                                         res, &error);
>      /* Check for pending earlier errors */
> -    if (self->priv->error) {
> +    if (self->error) {
>          spice_file_transfer_task_completed(self, error);
>          return;
>      }
>  
> -    if (count > 0 || self->priv->file_size == 0) {
> -        self->priv->read_bytes += count;
> +    if (count > 0 || self->file_size == 0) {
> +        self->read_bytes += count;
>          g_object_notify(G_OBJECT(self), "progress");
>          file_xfer_queue(self, count);
>          if (count == 0)
>              return;
> -        file_xfer_flush_async(channel, self->priv->cancellable,
> +        file_xfer_flush_async(channel, self->cancellable,
>                                file_xfer_data_flushed_cb, self);
> -        self->priv->pending = TRUE;
> +        self->pending = TRUE;
>      } else if (error) {
> -        spice_channel_wakeup(SPICE_CHANNEL(self->priv->channel), FALSE);
> +        spice_channel_wakeup(SPICE_CHANNEL(self->channel), FALSE);
>          spice_file_transfer_task_completed(self, error);
>      }
>      /* else EOF, do nothing (wait for VD_AGENT_FILE_XFER_STATUS from agent)
> */
> @@ -1970,14 +1961,14 @@ static void file_xfer_read_cb(GObject *source_object,
>  /* coroutine context */
>  static void file_xfer_continue_read(SpiceFileTransferTask *self)
>  {
> -    g_input_stream_read_async(G_INPUT_STREAM(self->priv->file_stream),
> -                              self->priv->buffer,
> +    g_input_stream_read_async(G_INPUT_STREAM(self->file_stream),
> +                              self->buffer,
>                                FILE_XFER_CHUNK_SIZE,
>                                G_PRIORITY_DEFAULT,
> -                              self->priv->cancellable,
> +                              self->cancellable,
>                                file_xfer_read_cb,
>                                self);
> -    self->priv->pending = TRUE;
> +    self->pending = TRUE;
>  }
>  
>  /* coroutine context */
> @@ -1998,7 +1989,7 @@ static void file_xfer_handle_status(SpiceMainChannel
> *channel,
>  
>      switch (msg->result) {
>      case VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA:
> -        if (task->priv->pending) {
> +        if (task->pending) {
>              error = g_error_new(SPICE_CLIENT_ERROR,
> SPICE_CLIENT_ERROR_FAILED,
>                             "transfer received CAN_SEND_DATA in pending
> state");
>              break;
> @@ -2014,7 +2005,7 @@ static void file_xfer_handle_status(SpiceMainChannel
> *channel,
>                              "some errors occurred in the spice agent");
>          break;
>      case VD_AGENT_FILE_XFER_STATUS_SUCCESS:
> -        if (task->priv->pending)
> +        if (task->pending)
>              error = g_error_new(SPICE_CLIENT_ERROR,
> SPICE_CLIENT_ERROR_FAILED,
>                                  "transfer received success in pending
> state");
>          break;
> @@ -2975,42 +2966,42 @@ static void
> spice_file_transfer_task_completed(SpiceFileTransferTask *self,
>                                                 GError *error)
>  {
>      /* In case of multiple errors we only report the first error */
> -    if (self->priv->error)
> +    if (self->error)
>          g_clear_error(&error);
>      if (error) {
> -        gchar *path = g_file_get_path(self->priv->file);
> +        gchar *path = g_file_get_path(self->file);
>          SPICE_DEBUG("File %s xfer failed: %s",
>                      path, error->message);
>          g_free(path);
> -        self->priv->error = error;
> +        self->error = error;
>      }
>  
> -    if (self->priv->error) {
> +    if (self->error) {
>          VDAgentFileXferStatusMessage msg = {
> -            .id = self->priv->id,
> -            .result = self->priv->error->code == G_IO_ERROR_CANCELLED ?
> +            .id = self->id,
> +            .result = self->error->code == G_IO_ERROR_CANCELLED ?
>                      VD_AGENT_FILE_XFER_STATUS_CANCELLED :
> VD_AGENT_FILE_XFER_STATUS_ERROR,
>          };
> -        agent_msg_queue_many(self->priv->channel, VD_AGENT_FILE_XFER_STATUS,
> +        agent_msg_queue_many(self->channel, VD_AGENT_FILE_XFER_STATUS,
>                               &msg, sizeof(msg), NULL);
>      }
>  
> -    if (self->priv->pending)
> +    if (self->pending)
>          return;
>  
> -    if (!self->priv->file_stream) {
> +    if (!self->file_stream) {
>          file_xfer_close_cb(NULL, NULL, self);
>          goto signal;
>      }
>  
> -    g_input_stream_close_async(G_INPUT_STREAM(self->priv->file_stream),
> +    g_input_stream_close_async(G_INPUT_STREAM(self->file_stream),
>                                 G_PRIORITY_DEFAULT,
> -                               self->priv->cancellable,
> +                               self->cancellable,
>                                 file_xfer_close_cb,
>                                 self);
> -    self->priv->pending = TRUE;
> +    self->pending = TRUE;
>  signal:
> -    g_signal_emit(self, task_signals[SIGNAL_FINISHED], 0, self->priv->error);
> +    g_signal_emit(self, task_signals[SIGNAL_FINISHED], 0, self->error);
>  }
>  
>  
> @@ -3026,12 +3017,12 @@ static void file_xfer_info_async_cb(GObject *obj,
> GAsyncResult *res, gpointer da
>      gchar *string;
>      SpiceFileTransferTask *self = SPICE_FILE_TRANSFER_TASK(data);
>  
> -    self->priv->pending = FALSE;
> +    self->pending = FALSE;
>      info = g_file_query_info_finish(file, res, &error);
> -    if (error || self->priv->error)
> +    if (error || self->error)
>          goto failed;
>  
> -    self->priv->file_size =
> +    self->file_size =
>          g_file_info_get_attribute_uint64(info,
> G_FILE_ATTRIBUTE_STANDARD_SIZE);
>      g_object_notify(G_OBJECT(self), "progress");
>      keyfile = g_key_file_new();
> @@ -3041,7 +3032,7 @@ static void file_xfer_info_async_cb(GObject *obj,
> GAsyncResult *res, gpointer da
>      g_key_file_set_string(keyfile, "vdagent-file-xfer", "name", basename);
>      g_free(basename);
>      /* File size */
> -    g_key_file_set_uint64(keyfile, "vdagent-file-xfer", "size", self->priv-
> >file_size);
> +    g_key_file_set_uint64(keyfile, "vdagent-file-xfer", "size", self-
> >file_size);
>  
>      /* Save keyfile content to memory. TODO: more file attributions
>         need to be sent to guest */
> @@ -3051,12 +3042,12 @@ static void file_xfer_info_async_cb(GObject *obj,
> GAsyncResult *res, gpointer da
>          goto failed;
>  
>      /* Create file-xfer start message */
> -    msg.id = self->priv->id;
> -    agent_msg_queue_many(self->priv->channel, VD_AGENT_FILE_XFER_START,
> +    msg.id = self->id;
> +    agent_msg_queue_many(self->channel, VD_AGENT_FILE_XFER_START,
>                           &msg, sizeof(msg),
>                           string, data_len + 1, NULL);
>      g_free(string);
> -    spice_channel_wakeup(SPICE_CHANNEL(self->priv->channel), FALSE);
> +    spice_channel_wakeup(SPICE_CHANNEL(self->channel), FALSE);
>      return;
>  
>  failed:
> @@ -3069,21 +3060,21 @@ static void file_xfer_read_async_cb(GObject *obj,
> GAsyncResult *res, gpointer da
>      SpiceFileTransferTask *self = SPICE_FILE_TRANSFER_TASK(data);
>      GError *error = NULL;
>  
> -    self->priv->pending = FALSE;
> -    self->priv->file_stream = g_file_read_finish(file, res, &error);
> -    if (error || self->priv->error) {
> +    self->pending = FALSE;
> +    self->file_stream = g_file_read_finish(file, res, &error);
> +    if (error || self->error) {
>          spice_file_transfer_task_completed(self, error);
>          return;
>      }
>  
> -    g_file_query_info_async(self->priv->file,
> +    g_file_query_info_async(self->file,
>                              G_FILE_ATTRIBUTE_STANDARD_SIZE,
>                              G_FILE_QUERY_INFO_NONE,
>                              G_PRIORITY_DEFAULT,
> -                            self->priv->cancellable,
> +                            self->cancellable,
>                              file_xfer_info_async_cb,
>                              self);
> -    self->priv->pending = TRUE;
> +    self->pending = TRUE;
>  }
>  
>  static SpiceFileTransferTask *spice_file_transfer_task_new(SpiceMainChannel
> *channel,
> @@ -3095,7 +3086,7 @@ static void task_finished(SpiceFileTransferTask *task,
>                            gpointer data)
>  {
>      SpiceMainChannel *channel = SPICE_MAIN_CHANNEL(data);
> -    g_hash_table_remove(channel->priv->file_xfer_tasks,
> GUINT_TO_POINTER(task->priv->id));
> +    g_hash_table_remove(channel->priv->file_xfer_tasks,
> GUINT_TO_POINTER(task->id));
>  }
>  
>  static void file_xfer_send_start_msg_async(SpiceMainChannel *channel,
> @@ -3120,16 +3111,15 @@ static void
> file_xfer_send_start_msg_async(SpiceMainChannel *channel,
>              task_cancellable = g_cancellable_new();
>  
>          task = spice_file_transfer_task_new(channel, files[i],
> task_cancellable);
> -        task->priv->flags = flags;
> -        task->priv->progress_callback = progress_callback;
> -        task->priv->progress_callback_data = progress_callback_data;
> -        task->priv->callback = callback;
> -        task->priv->user_data = user_data;
> -
> -        CHANNEL_DEBUG(channel, "Insert a xfer task:%d to task list",
> -                      task->priv->id);
> +        task->flags = flags;
> +        task->progress_callback = progress_callback;
> +        task->progress_callback_data = progress_callback_data;
> +        task->callback = callback;
> +        task->user_data = user_data;
> +
> +        CHANNEL_DEBUG(channel, "Insert a xfer task:%d to task list", task-
> >id);
>          g_hash_table_insert(c->file_xfer_tasks,
> -                            GUINT_TO_POINTER(task->priv->id),
> +                            GUINT_TO_POINTER(task->id),
>                              task);
>          g_signal_connect(task, "finished", G_CALLBACK(task_finished),
> channel);
>          g_signal_emit(channel, signals[SPICE_MAIN_NEW_FILE_TRANSFER], 0,
> task);
> @@ -3139,7 +3129,7 @@ static void
> file_xfer_send_start_msg_async(SpiceMainChannel *channel,
>                            cancellable,
>                            file_xfer_read_async_cb,
>                            g_object_ref(task));
> -        task->priv->pending = TRUE;
> +        task->pending = TRUE;
>  
>          /* if we created a per-task cancellable above, free it */
>          if (!cancellable)
> @@ -3252,10 +3242,10 @@ spice_file_transfer_task_get_property(GObject *object,
>      switch (property_id)
>      {
>          case PROP_TASK_ID:
> -            g_value_set_uint(value, self->priv->id);
> +            g_value_set_uint(value, self->id);
>              break;
>          case PROP_TASK_FILE:
> -            g_value_set_object(value, self->priv->file);
> +            g_value_set_object(value, self->file);
>              break;
>          case PROP_TASK_PROGRESS:
>              g_value_set_double(value,
> spice_file_transfer_task_get_progress(self));
> @@ -3276,16 +3266,16 @@ spice_file_transfer_task_set_property(GObject *object,
>      switch (property_id)
>      {
>          case PROP_TASK_ID:
> -            self->priv->id = g_value_get_uint(value);
> +            self->id = g_value_get_uint(value);
>              break;
>          case PROP_TASK_FILE:
> -            self->priv->file = g_value_dup_object(value);
> +            self->file = g_value_dup_object(value);
>              break;
>          case PROP_TASK_CHANNEL:
> -            self->priv->channel = g_value_dup_object(value);
> +            self->channel = g_value_dup_object(value);
>              break;
>          case PROP_TASK_CANCELLABLE:
> -            self->priv->cancellable = g_value_dup_object(value);
> +            self->cancellable = g_value_dup_object(value);
>              break;
>          default:
>              G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
> @@ -3297,7 +3287,7 @@ spice_file_transfer_task_dispose(GObject *object)
>  {
>      SpiceFileTransferTask *self = SPICE_FILE_TRANSFER_TASK(object);
>  
> -    g_clear_object(&self->priv->file);
> +    g_clear_object(&self->file);
>  
>      G_OBJECT_CLASS(spice_file_transfer_task_parent_class)->dispose(object);
>  }
> @@ -3307,7 +3297,7 @@ spice_file_transfer_task_finalize(GObject *object)
>  {
>      SpiceFileTransferTask *self = SPICE_FILE_TRANSFER_TASK(object);
>  
> -    g_free(self->priv->buffer);
> +    g_free(self->buffer);
>  
>      G_OBJECT_CLASS(spice_file_transfer_task_parent_class)->finalize(object);
>  }
> @@ -3318,9 +3308,9 @@ spice_file_transfer_task_constructed(GObject *object)
>      SpiceFileTransferTask *self = SPICE_FILE_TRANSFER_TASK(object);
>  
>      if (spice_util_get_debug()) {
> -        gchar *basename = g_file_get_basename(self->priv->file);
> -        self->priv->start_time = g_get_monotonic_time();
> -        self->priv->last_update = self->priv->start_time;
> +        gchar *basename = g_file_get_basename(self->file);
> +        self->start_time = g_get_monotonic_time();
> +        self->last_update = self->start_time;
>  
>          SPICE_DEBUG("transfer of file %s has started", basename);
>          g_free(basename);
> @@ -3332,8 +3322,6 @@
> spice_file_transfer_task_class_init(SpiceFileTransferTaskClass *klass)
>  {
>      GObjectClass *object_class = G_OBJECT_CLASS(klass);
>  
> -    g_type_class_add_private(klass, sizeof(SpiceFileTransferTaskPrivate));
> -
>      object_class->get_property = spice_file_transfer_task_get_property;
>      object_class->set_property = spice_file_transfer_task_set_property;
>      object_class->finalize = spice_file_transfer_task_finalize;
> @@ -3439,8 +3427,7 @@
> spice_file_transfer_task_class_init(SpiceFileTransferTaskClass *klass)
>  static void
>  spice_file_transfer_task_init(SpiceFileTransferTask *self)
>  {
> -    self->priv = FILE_TRANSFER_TASK_PRIVATE(self);
> -    self->priv->buffer = g_malloc0(FILE_XFER_CHUNK_SIZE);
> +    self->buffer = g_malloc0(FILE_XFER_CHUNK_SIZE);
>  }
>  
>  static SpiceFileTransferTask *
> @@ -3469,10 +3456,10 @@ spice_file_transfer_task_new(SpiceMainChannel
> *channel, GFile *file, GCancellabl
>   **/
>  double spice_file_transfer_task_get_progress(SpiceFileTransferTask *self)
>  {
> -    if (self->priv->file_size == 0)
> +    if (self->file_size == 0)
>          return 0.0;
>  
> -    return (double)self->priv->read_bytes / self->priv->file_size;
> +    return (double)self->read_bytes / self->file_size;
>  }
>  
>  /**
> @@ -3488,7 +3475,7 @@ double
> spice_file_transfer_task_get_progress(SpiceFileTransferTask *self)
>   **/
>  void spice_file_transfer_task_cancel(SpiceFileTransferTask *self)
>  {
> -    g_cancellable_cancel(self->priv->cancellable);
> +    g_cancellable_cancel(self->cancellable);
>  }
>  
>  /**
> @@ -3503,5 +3490,5 @@ void
> spice_file_transfer_task_cancel(SpiceFileTransferTask *self)
>   **/
>  char* spice_file_transfer_task_get_filename(SpiceFileTransferTask *self)
>  {
> -    return g_file_get_basename(self->priv->file);
> +    return g_file_get_basename(self->file);
>  }
> diff --git a/src/spice-file-transfer-task.h b/src/spice-file-transfer-task.h
> index 389668e..4f179fb 100644
> --- a/src/spice-file-transfer-task.h
> +++ b/src/spice-file-transfer-task.h
> @@ -38,7 +38,6 @@ G_BEGIN_DECLS
>  
>  typedef struct _SpiceFileTransferTask SpiceFileTransferTask;
>  typedef struct _SpiceFileTransferTaskClass SpiceFileTransferTaskClass;
> -typedef struct _SpiceFileTransferTaskPrivate SpiceFileTransferTaskPrivate;
>  
>  GType spice_file_transfer_task_get_type(void) G_GNUC_CONST;
>  


More information about the Spice-devel mailing list