static void closed_async (GObject *source, GAsyncResult *result, gpointer user_data) { GOutputStream *body_ostream = G_OUTPUT_STREAM (source); SoupMessage *msg = user_data; SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg); SoupMessageIOData *io = priv->io_data; GCancellable *async_close_wait; if (!io || !io->async_close_wait || io->body_ostream != body_ostream) { g_object_unref (msg); return; } g_output_stream_close_finish (body_ostream, result, &io->async_close_error); g_clear_object (&io->body_ostream); async_close_wait = io->async_close_wait; io->async_close_wait = NULL; g_cancellable_cancel (async_close_wait); g_object_unref (async_close_wait); g_object_unref (msg); }
static void on_outputstream_closed (GObject *source, GAsyncResult *res, gpointer user_data) { GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); g_output_stream_close_finish (G_OUTPUT_STREAM (source), res, &self->pv->error); complete_async_result (self); }
static gboolean g_filter_output_stream_close_finish (GOutputStream *stream, GAsyncResult *result, GError **error) { GFilterOutputStream *filter_stream; gboolean res; filter_stream = G_FILTER_OUTPUT_STREAM (stream); res = g_output_stream_close_finish (filter_stream->base_stream, result, error); return res; }
static void on_output_closed (GObject *object, GAsyncResult *result, gpointer user_data) { CockpitStream *self = COCKPIT_STREAM (user_data); GError *error = NULL; g_output_stream_close_finish (G_OUTPUT_STREAM (object), result, &error); if (error) { g_warning ("%s: couldn't close output stream: %s", self->priv->name, error->message); close_immediately (self, "internal-error"); } close_maybe (self); g_object_unref (self); }
/* BEGIN NOTE: * * This fixes an issue in GOutputStream that applies the atomic replace save * strategy. The stream moves the written file to the original file when the * stream is closed. However, there is no way currently to tell the stream that * the save should be aborted (there could be a conversion error). The patch * explicitly closes the output stream in all these cases with a GCancellable in * the cancelled state, causing the output stream to close, but not move the * file. This makes use of an implementation detail in the local file stream * and should be properly fixed by adding the appropriate API in GIO. Until * then, at least we prevent data corruption for now. * * Relevant bug reports: * * Bug 615110 - write file ignore encoding errors (gedit) * https://bugzilla.gnome.org/show_bug.cgi?id=615110 * * Bug 602412 - g_file_replace does not restore original file when there is * errors while writing (glib/gio) * https://bugzilla.gnome.org/show_bug.cgi?id=602412 */ static void cancel_output_stream_ready_cb (GOutputStream *output_stream, GAsyncResult *result, GtkSourceFileSaver *saver) { g_output_stream_close_finish (output_stream, result, NULL); if (saver->priv->error != NULL) { GError *error = saver->priv->error; saver->priv->error = NULL; g_task_return_error (saver->priv->task, error); } else { g_task_return_boolean (saver->priv->task, FALSE); } }
static void photos_thumbnailer_generate_thumbnail_stream_close (GObject *source_object, GAsyncResult *res, gpointer user_data) { GOutputStream *stream = G_OUTPUT_STREAM (source_object); g_autoptr (GTask) task = G_TASK (user_data); { g_autoptr (GError) error = NULL; if (!g_output_stream_close_finish (stream, res, &error)) { g_task_return_error (task, g_steal_pointer (&error)); goto out; } } g_task_return_boolean (task, TRUE); out: return; }
static void on_output_stream_close_ready (GObject * object, GAsyncResult * res, gpointer data) { GError * error = NULL; g_output_stream_close_finish (G_OUTPUT_STREAM(object), res, &error); handle_critical_error (error); }