diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index 061a4c376..1b5f84b32 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -1172,6 +1172,7 @@ g_simple_async_result_set_error g_simple_async_result_set_error_va g_simple_async_report_error_in_idle g_simple_async_report_gerror_in_idle +g_simple_async_report_take_gerror_in_idle GSimpleAsyncResultClass G_SIMPLE_ASYNC_RESULT diff --git a/gio/gbufferedinputstream.c b/gio/gbufferedinputstream.c index 78e61cbf4..f79787c70 100644 --- a/gio/gbufferedinputstream.c +++ b/gio/gbufferedinputstream.c @@ -496,11 +496,10 @@ g_buffered_input_stream_fill_async (GBufferedInputStream *stream, if (!g_input_stream_set_pending (G_INPUT_STREAM (stream), &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/gfileinputstream.c b/gio/gfileinputstream.c index 74b17ba9b..685d768d0 100644 --- a/gio/gfileinputstream.c +++ b/gio/gfileinputstream.c @@ -215,11 +215,10 @@ g_file_input_stream_query_info_async (GFileInputStream *stream, if (!g_input_stream_set_pending (input_stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/gfileiostream.c b/gio/gfileiostream.c index 3af27fda2..1e5f17ff1 100644 --- a/gio/gfileiostream.c +++ b/gio/gfileiostream.c @@ -227,11 +227,10 @@ g_file_io_stream_query_info_async (GFileIOStream *stream, if (!g_io_stream_set_pending (io_stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/gfileoutputstream.c b/gio/gfileoutputstream.c index 735b6d8fc..ce09eb853 100644 --- a/gio/gfileoutputstream.c +++ b/gio/gfileoutputstream.c @@ -225,11 +225,10 @@ g_file_output_stream_query_info_async (GFileOutputStream *stream, if (!g_output_stream_set_pending (output_stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/ginputstream.c b/gio/ginputstream.c index 7535bfa48..3071a4743 100644 --- a/gio/ginputstream.c +++ b/gio/ginputstream.c @@ -560,11 +560,10 @@ g_input_stream_read_async (GInputStream *stream, if (!g_input_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } @@ -685,11 +684,10 @@ g_input_stream_skip_async (GInputStream *stream, if (!g_input_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } @@ -784,11 +782,10 @@ g_input_stream_close_async (GInputStream *stream, if (!g_input_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/gio.symbols b/gio/gio.symbols index cccb48841..eb79b705e 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -810,6 +810,7 @@ g_simple_async_result_set_error_va g_simple_async_result_is_valid g_simple_async_report_error_in_idle g_simple_async_report_gerror_in_idle +g_simple_async_report_take_gerror_in_idle #endif #endif diff --git a/gio/giostream.c b/gio/giostream.c index 3f601a83b..7c5bdf02e 100644 --- a/gio/giostream.c +++ b/gio/giostream.c @@ -497,11 +497,10 @@ g_io_stream_close_async (GIOStream *stream, if (!g_io_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/goutputstream.c b/gio/goutputstream.c index 9bdc4081f..5152de56c 100644 --- a/gio/goutputstream.c +++ b/gio/goutputstream.c @@ -730,11 +730,10 @@ g_output_stream_write_async (GOutputStream *stream, if (!g_output_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } @@ -853,11 +852,10 @@ g_output_stream_splice_async (GOutputStream *stream, if (!g_output_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } @@ -936,11 +934,10 @@ g_output_stream_flush_async (GOutputStream *stream, if (!g_output_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } @@ -1048,11 +1045,10 @@ g_output_stream_close_async (GOutputStream *stream, if (!g_output_stream_set_pending (stream, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c index 554387e16..68cd02eec 100644 --- a/gio/gsimpleasyncresult.c +++ b/gio/gsimpleasyncresult.c @@ -987,7 +987,7 @@ void g_simple_async_report_gerror_in_idle (GObject *object, GAsyncReadyCallback callback, gpointer user_data, - GError *error) + const GError *error) { GSimpleAsyncResult *simple; @@ -1001,3 +1001,35 @@ g_simple_async_report_gerror_in_idle (GObject *object, g_simple_async_result_complete_in_idle (simple); g_object_unref (simple); } + +/** + * g_simple_async_report_take_gerror_in_idle: + * @object: a #GObject. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * @error: the #GError to report + * + * Reports an error in an idle function. Similar to + * g_simple_async_report_gerror_in_idle(), but takes over the caller's + * ownership of @error, so the caller does not have to free it any more. + * + * Since: 2.28 + **/ +void +g_simple_async_report_take_gerror_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (error != NULL); + + simple = g_simple_async_result_new_take_error (object, + callback, + user_data, + error); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} diff --git a/gio/gsimpleasyncresult.h b/gio/gsimpleasyncresult.h index 0abbd6774..6d99c7acf 100644 --- a/gio/gsimpleasyncresult.h +++ b/gio/gsimpleasyncresult.h @@ -122,7 +122,11 @@ void g_simple_async_report_error_in_idle (GObject *object, void g_simple_async_report_gerror_in_idle (GObject *object, GAsyncReadyCallback callback, gpointer user_data, - GError *error); + const GError *error); +void g_simple_async_report_take_gerror_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error); G_END_DECLS diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c index b2cbcee3e..982dedc89 100644 --- a/gio/gsocketclient.c +++ b/gio/gsocketclient.c @@ -1279,9 +1279,8 @@ g_socket_client_connect_to_host_async (GSocketClient *client, &error); if (connectable == NULL) { - g_simple_async_report_gerror_in_idle (G_OBJECT (client), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (client), callback, user_data, error); - g_error_free (error); } else { @@ -1355,9 +1354,8 @@ g_socket_client_connect_to_uri_async (GSocketClient *client, connectable = g_network_address_parse_uri (uri, default_port, &error); if (connectable == NULL) { - g_simple_async_report_gerror_in_idle (G_OBJECT (client), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (client), callback, user_data, error); - g_error_free (error); } else { diff --git a/gio/gsocketconnection.c b/gio/gsocketconnection.c index e67237fc5..495f81c36 100644 --- a/gio/gsocketconnection.c +++ b/gio/gsocketconnection.c @@ -332,10 +332,9 @@ g_socket_connection_close_async (GIOStream *stream, if (class->close_fn && !class->close_fn (stream, cancellable, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (stream), callback, user_data, error); - g_error_free (error); return; } diff --git a/gio/gsocketlistener.c b/gio/gsocketlistener.c index 503fa313b..babefcdf2 100644 --- a/gio/gsocketlistener.c +++ b/gio/gsocketlistener.c @@ -747,10 +747,9 @@ g_socket_listener_accept_socket_async (GSocketListener *listener, if (!check_listener (listener, &error)) { - g_simple_async_report_gerror_in_idle (G_OBJECT (listener), + g_simple_async_report_take_gerror_in_idle (G_OBJECT (listener), callback, user_data, error); - g_error_free (error); return; }