From aab55c34c83490869865f097d8707c3e40f4c81d Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 3 Jul 2014 23:44:38 +0200 Subject: [PATCH] app: add a GOutputStream* parameter to GimpData::save() Open/close the stream generically in GimpData. Improves error handling and simplifies the save() functions. --- app/core/gimpbrushgenerated-save.c | 21 +++----------------- app/core/gimpbrushgenerated-save.h | 5 +++-- app/core/gimpcurve-save.c | 15 ++++++++------- app/core/gimpcurve-save.h | 5 +++-- app/core/gimpdata.c | 31 +++++++++++++++++++++++++++++- app/core/gimpdata.h | 9 +++++---- app/core/gimpdynamics-save.c | 15 ++++++++------- app/core/gimpdynamics-save.h | 5 +++-- app/core/gimpgradient-save.c | 21 +++----------------- app/core/gimpgradient-save.h | 11 ++++++----- app/core/gimppalette-save.c | 31 ++++++++---------------------- app/core/gimppalette-save.h | 5 +++-- app/core/gimptoolpreset-save.c | 15 ++++++++------- app/core/gimptoolpreset-save.h | 5 +++-- 14 files changed, 94 insertions(+), 100 deletions(-) diff --git a/app/core/gimpbrushgenerated-save.c b/app/core/gimpbrushgenerated-save.c index 25d6bbbdd3..73c794fa13 100644 --- a/app/core/gimpbrushgenerated-save.c +++ b/app/core/gimpbrushgenerated-save.c @@ -33,12 +33,12 @@ gboolean -gimp_brush_generated_save (GimpData *data, - GError **error) +gimp_brush_generated_save (GimpData *data, + GOutputStream *output, + GError **error) { GimpBrushGenerated *brush = GIMP_BRUSH_GENERATED (data); const gchar *name = gimp_object_get_name (data); - GOutputStream *output; GString *string; gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; gsize bytes_written; @@ -47,19 +47,6 @@ gimp_brush_generated_save (GimpData *data, g_return_val_if_fail (name != NULL && *name != '\0', FALSE); - output = G_OUTPUT_STREAM (g_file_replace (gimp_data_get_file (data), - NULL, FALSE, G_FILE_CREATE_NONE, - NULL, &my_error)); - if (! output) - { - g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN, - _("Could not open '%s' for writing: %s"), - gimp_file_get_utf8_name (gimp_data_get_file (data)), - my_error->message); - g_clear_error (&my_error); - return FALSE; - } - /* write magic header */ string = g_string_new ("GIMP-VBR\n"); @@ -130,12 +117,10 @@ gimp_brush_generated_save (GimpData *data, my_error->message); g_clear_error (&my_error); g_string_free (string, TRUE); - g_object_unref (output); return FALSE; } g_string_free (string, TRUE); - g_object_unref (output); return TRUE; } diff --git a/app/core/gimpbrushgenerated-save.h b/app/core/gimpbrushgenerated-save.h index 8bca39ef3a..89924e5710 100644 --- a/app/core/gimpbrushgenerated-save.h +++ b/app/core/gimpbrushgenerated-save.h @@ -22,8 +22,9 @@ /* don't call this function directly, use gimp_data_save() instead */ -gboolean gimp_brush_generated_save (GimpData *data, - GError **error); +gboolean gimp_brush_generated_save (GimpData *data, + GOutputStream *output, + GError **error); #endif /* __GIMP_BRUSH_GENERATED_SAVE_H__ */ diff --git a/app/core/gimpcurve-save.c b/app/core/gimpcurve-save.c index 1790178deb..c533061c4c 100644 --- a/app/core/gimpcurve-save.c +++ b/app/core/gimpcurve-save.c @@ -29,15 +29,16 @@ gboolean -gimp_curve_save (GimpData *data, - GError **error) +gimp_curve_save (GimpData *data, + GOutputStream *output, + GError **error) { g_return_val_if_fail (GIMP_IS_CURVE (data), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - return gimp_config_serialize_to_gfile (GIMP_CONFIG (data), - gimp_data_get_file (data), - "GIMP curve file", - "end of GIMP curve file", - NULL, error); + return gimp_config_serialize_to_stream (GIMP_CONFIG (data), + output, + "GIMP curve file", + "end of GIMP curve file", + NULL, error); } diff --git a/app/core/gimpcurve-save.h b/app/core/gimpcurve-save.h index c5870d30db..99d425e630 100644 --- a/app/core/gimpcurve-save.h +++ b/app/core/gimpcurve-save.h @@ -20,8 +20,9 @@ /* don't call this function directly, use gimp_data_save() instead */ -gboolean gimp_curve_save (GimpData *data, - GError **error); +gboolean gimp_curve_save (GimpData *data, + GOutputStream *output, + GError **error); #endif /* __GIMP_CURVE_SAVE_H__ */ diff --git a/app/core/gimpdata.c b/app/core/gimpdata.c index c7eb698c7a..1e0d0bba4c 100644 --- a/app/core/gimpdata.c +++ b/app/core/gimpdata.c @@ -518,7 +518,36 @@ gimp_data_save (GimpData *data, g_return_val_if_fail (private->file != NULL, FALSE); if (GIMP_DATA_GET_CLASS (data)->save) - success = GIMP_DATA_GET_CLASS (data)->save (data, error); + { + GOutputStream *output; + + output = G_OUTPUT_STREAM (g_file_replace (private->file, + NULL, FALSE, G_FILE_CREATE_NONE, + NULL, error)); + + if (output) + { + success = GIMP_DATA_GET_CLASS (data)->save (data, output, error); + + if (success && + ! g_output_stream_close (output, NULL, error)) + { + g_prefix_error (error, + _("Error writing '%s': "), + gimp_file_get_utf8_name (private->file)); + + success = FALSE; + } + + g_object_unref (output); + } + else + { + g_prefix_error (error, + _("Could not open '%s' for writing: "), + gimp_file_get_utf8_name (private->file)); + } + } if (success) { diff --git a/app/core/gimpdata.h b/app/core/gimpdata.h index a2173aec20..133fad7f98 100644 --- a/app/core/gimpdata.h +++ b/app/core/gimpdata.h @@ -57,10 +57,11 @@ struct _GimpDataClass void (* dirty) (GimpData *data); /* virtual functions */ - gboolean (* save) (GimpData *data, - GError **error); - const gchar * (* get_extension) (GimpData *data); - GimpData * (* duplicate) (GimpData *data); + gboolean (* save) (GimpData *data, + GOutputStream *output, + GError **error); + const gchar * (* get_extension) (GimpData *data); + GimpData * (* duplicate) (GimpData *data); }; diff --git a/app/core/gimpdynamics-save.c b/app/core/gimpdynamics-save.c index 0b92e19373..8095b99948 100644 --- a/app/core/gimpdynamics-save.c +++ b/app/core/gimpdynamics-save.c @@ -29,15 +29,16 @@ gboolean -gimp_dynamics_save (GimpData *data, - GError **error) +gimp_dynamics_save (GimpData *data, + GOutputStream *output, + GError **error) { g_return_val_if_fail (GIMP_IS_DYNAMICS (data), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - return gimp_config_serialize_to_gfile (GIMP_CONFIG (data), - gimp_data_get_file (data), - "GIMP dynamics file", - "end of GIMP dynamics file", - NULL, error); + return gimp_config_serialize_to_stream (GIMP_CONFIG (data), + output, + "GIMP dynamics file", + "end of GIMP dynamics file", + NULL, error); } diff --git a/app/core/gimpdynamics-save.h b/app/core/gimpdynamics-save.h index c4a6976d53..1ae995884f 100644 --- a/app/core/gimpdynamics-save.h +++ b/app/core/gimpdynamics-save.h @@ -20,8 +20,9 @@ /* don't call this function directly, use gimp_data_save() instead */ -gboolean gimp_dynamics_save (GimpData *data, - GError **error); +gboolean gimp_dynamics_save (GimpData *data, + GOutputStream *output, + GError **error); #endif /* __GIMP_DYNAMICS_SAVE_H__ */ diff --git a/app/core/gimpgradient-save.c b/app/core/gimpgradient-save.c index 35fbbc54b4..b684292846 100644 --- a/app/core/gimpgradient-save.c +++ b/app/core/gimpgradient-save.c @@ -31,30 +31,17 @@ gboolean -gimp_gradient_save (GimpData *data, - GError **error) +gimp_gradient_save (GimpData *data, + GOutputStream *output, + GError **error) { GimpGradient *gradient = GIMP_GRADIENT (data); - GOutputStream *output; GString *string; GimpGradientSegment *seg; gint num_segments; gsize bytes_written; GError *my_error = NULL; - output = G_OUTPUT_STREAM (g_file_replace (gimp_data_get_file (data), - NULL, FALSE, G_FILE_CREATE_NONE, - NULL, &my_error)); - if (! output) - { - g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN, - _("Could not open '%s' for writing: %s"), - gimp_file_get_utf8_name (gimp_data_get_file (data)), - my_error->message); - g_clear_error (&my_error); - return FALSE; - } - /* File format is: * * GIMP Gradient @@ -131,12 +118,10 @@ gimp_gradient_save (GimpData *data, my_error->message); g_clear_error (&my_error); g_string_free (string, TRUE); - g_object_unref (output); return FALSE; } g_string_free (string, TRUE); - g_object_unref (output); return TRUE; } diff --git a/app/core/gimpgradient-save.h b/app/core/gimpgradient-save.h index 866a80aace..9e46f5869a 100644 --- a/app/core/gimpgradient-save.h +++ b/app/core/gimpgradient-save.h @@ -20,12 +20,13 @@ /* don't call this function directly, use gimp_data_save() instead */ -gboolean gimp_gradient_save (GimpData *data, - GError **error); +gboolean gimp_gradient_save (GimpData *data, + GOutputStream *output, + GError **error); -gboolean gimp_gradient_save_pov (GimpGradient *gradient, - GFile *file, - GError **error); +gboolean gimp_gradient_save_pov (GimpGradient *gradient, + GFile *file, + GError **error); #endif /* __GIMP_GRADIENT_SAVE_H__ */ diff --git a/app/core/gimppalette-save.c b/app/core/gimppalette-save.c index d0a40c9086..dde2d67e7b 100644 --- a/app/core/gimppalette-save.c +++ b/app/core/gimppalette-save.c @@ -33,28 +33,15 @@ gboolean -gimp_palette_save (GimpData *data, - GError **error) +gimp_palette_save (GimpData *data, + GOutputStream *output, + GError **error) { - GimpPalette *palette = GIMP_PALETTE (data); - GOutputStream *output; - GString *string; - GList *list; - gsize bytes_written; - GError *my_error = NULL; - - output = G_OUTPUT_STREAM (g_file_replace (gimp_data_get_file (data), - NULL, FALSE, G_FILE_CREATE_NONE, - NULL, &my_error)); - if (! output) - { - g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN, - _("Could not open '%s' for writing: %s"), - gimp_file_get_utf8_name (gimp_data_get_file (data)), - my_error->message); - g_clear_error (&my_error); - return FALSE; - } + GimpPalette *palette = GIMP_PALETTE (data); + GString *string; + GList *list; + gsize bytes_written; + GError *my_error = NULL; string = g_string_new ("GIMP Palette\n"); @@ -87,12 +74,10 @@ gimp_palette_save (GimpData *data, my_error->message); g_clear_error (&my_error); g_string_free (string, TRUE); - g_object_unref (output); return FALSE; } g_string_free (string, TRUE); - g_object_unref (output); return TRUE; } diff --git a/app/core/gimppalette-save.h b/app/core/gimppalette-save.h index 4775f88749..9ed2e37fb9 100644 --- a/app/core/gimppalette-save.h +++ b/app/core/gimppalette-save.h @@ -20,8 +20,9 @@ /* don't call this function directly, use gimp_data_save() instead */ -gboolean gimp_palette_save (GimpData *data, - GError **error); +gboolean gimp_palette_save (GimpData *data, + GOutputStream *output, + GError **error); #endif /* __GIMP_PALETTE_SAVE_H__ */ diff --git a/app/core/gimptoolpreset-save.c b/app/core/gimptoolpreset-save.c index 9cd72a3c1b..0513e7b04c 100644 --- a/app/core/gimptoolpreset-save.c +++ b/app/core/gimptoolpreset-save.c @@ -29,15 +29,16 @@ gboolean -gimp_tool_preset_save (GimpData *data, - GError **error) +gimp_tool_preset_save (GimpData *data, + GOutputStream *output, + GError **error) { g_return_val_if_fail (GIMP_IS_TOOL_PRESET (data), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - return gimp_config_serialize_to_gfile (GIMP_CONFIG (data), - gimp_data_get_file (data), - "GIMP tool preset file", - "end of GIMP tool preset file", - NULL, error); + return gimp_config_serialize_to_stream (GIMP_CONFIG (data), + output, + "GIMP tool preset file", + "end of GIMP tool preset file", + NULL, error); } diff --git a/app/core/gimptoolpreset-save.h b/app/core/gimptoolpreset-save.h index 91e054982b..2d66d8fe66 100644 --- a/app/core/gimptoolpreset-save.h +++ b/app/core/gimptoolpreset-save.h @@ -20,8 +20,9 @@ /* don't call this function directly, use gimp_data_save() instead */ -gboolean gimp_tool_preset_save (GimpData *data, - GError **error); +gboolean gimp_tool_preset_save (GimpData *data, + GOutputStream *output, + GError **error); #endif /* __GIMP_TOOL_PRESET_SAVE_H__ */