static SelectionBuffer * selection_buffer_new (GInputStream *stream, GdkAtom selection, GdkAtom target) { SelectionBuffer *buffer; buffer = g_new0 (SelectionBuffer, 1); buffer->stream = (stream) ? g_object_ref (stream) : NULL; buffer->cancellable = g_cancellable_new (); buffer->data = g_byte_array_new (); buffer->selection = selection; buffer->target = target; buffer->ref_count = 1; if (stream) selection_buffer_read (buffer); return buffer; }
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); }