[gimp] app: add a GOutputStream* parameter to GimpData::save()



commit aab55c34c83490869865f097d8707c3e40f4c81d
Author: Michael Natterer <mitch gimp org>
Date:   Thu Jul 3 23:44:38 2014 +0200

    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 25d6bbb..73c794f 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 8bca39e..89924e5 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 1790178..c533061 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 c5870d3..99d425e 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 c7eb698..1e0d0bb 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 a2173ae..133fad7 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 0b92e19..8095b99 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 c4a6976..1ae9958 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 35fbbc5..b684292 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 866a80a..9e46f58 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 d0a40c9..dde2d67 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 4775f88..9ed2e37 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 9cd72a3..0513e7b 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 91e0549..2d66d8f 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__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]