static void selection_buffer_cancel_and_unref (SelectionBuffer *buffer_data) { if (buffer_data->cancellable) g_cancellable_cancel (buffer_data->cancellable); selection_buffer_unref (buffer_data); }
static void selection_buffer_read_cb (GObject *object, GAsyncResult *result, gpointer user_data) { SelectionBuffer *buffer = user_data; gboolean finished = TRUE; GError *error = NULL; GBytes *bytes; bytes = g_input_stream_read_bytes_finish (buffer->stream, result, &error); if (bytes) { finished = g_bytes_get_size (bytes) == 0; selection_buffer_append_data (buffer, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes)); g_bytes_unref (bytes); } if (!finished) selection_buffer_read (buffer); else { if (error) { g_warning (G_STRLOC ": error reading selection buffer: %s", error->message); g_error_free (error); } else selection_buffer_notify (buffer); g_input_stream_close (buffer->stream, NULL, NULL); g_clear_object (&buffer->stream); g_clear_object (&buffer->cancellable); } selection_buffer_unref (buffer); }