[gimp] app: Refactor palette loaders.



commit 198f2514ab03cd77c769b0cea9678fa0deba4f6e
Author: Warren Turkal <wt penguintechs org>
Date:   Sat Sep 14 23:46:28 2013 -0700

    app: Refactor palette loaders.
    
    I specifically moved the file opening/closing logic to the common
    code. This makes the code easier to understand for me since there
    is less duplication. In fact, this commit removes more lines than
    it adds.

 app/core/gimp.c               |    4 +-
 app/core/gimppalette-import.c |   31 +++++--
 app/core/gimppalette-load.c   |  208 ++++++++++++++---------------------------
 app/core/gimppalette-load.h   |   12 ++-
 4 files changed, 109 insertions(+), 146 deletions(-)
---
diff --git a/app/core/gimp.c b/app/core/gimp.c
index 33c0652..d27a19d 100644
--- a/app/core/gimp.c
+++ b/app/core/gimp.c
@@ -585,8 +585,8 @@ gimp_real_initialize (Gimp               *gimp,
 
   static const GimpDataFactoryLoaderEntry palette_loader_entries[] =
   {
-    { gimp_palette_load,         GIMP_PALETTE_FILE_EXTENSION,         TRUE  },
-    { gimp_palette_load,         NULL /* legacy loader */,            TRUE  }
+    { gimp_startup_palette_load,         GIMP_PALETTE_FILE_EXTENSION,         TRUE  },
+    { gimp_startup_palette_load,         NULL /* legacy loader */,            TRUE  }
   };
 
   static const GimpDataFactoryLoaderEntry tool_preset_loader_entries[] =
diff --git a/app/core/gimppalette-import.c b/app/core/gimppalette-import.c
index b815e4c..499ee95 100644
--- a/app/core/gimppalette-import.c
+++ b/app/core/gimppalette-import.c
@@ -17,12 +17,15 @@
 
 #include "config.h"
 
+#include <errno.h>
 #include <string.h>
 
 #include <cairo.h>
 #include <gegl.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
+#include <glib/gstdio.h>
+
 #include "libgimpbase/gimpbase.h"
 #include "libgimpcolor/gimpcolor.h"
 
@@ -497,35 +500,47 @@ gimp_palette_import_from_file (GimpContext  *context,
 {
   GList *palette_list = NULL;
 
+  FILE  *file;
+
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
   g_return_val_if_fail (filename != NULL, NULL);
   g_return_val_if_fail (palette_name != NULL, NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-  switch (gimp_palette_load_detect_format (filename))
+  file = g_fopen (filename, "rb");
+
+  if (!file)
+    {
+      g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
+                   _("Could not open '%s' for reading: %s"),
+                   gimp_filename_to_utf8 (filename), g_strerror (errno));
+      return NULL;
+    }
+
+  switch (gimp_palette_load_detect_format (filename, file))
     {
     case GIMP_PALETTE_FILE_FORMAT_GPL:
-      palette_list = gimp_palette_load (context, filename, error);
+      palette_list = gimp_palette_load (context, filename, file, error);
       break;
 
     case GIMP_PALETTE_FILE_FORMAT_ACT:
-      palette_list = gimp_palette_load_act (context, filename, error);
+      palette_list = gimp_palette_load_act (context, filename, file, error);
       break;
 
     case GIMP_PALETTE_FILE_FORMAT_RIFF_PAL:
-      palette_list = gimp_palette_load_riff (context, filename, error);
+      palette_list = gimp_palette_load_riff (context, filename, file, error);
       break;
 
     case GIMP_PALETTE_FILE_FORMAT_PSP_PAL:
-      palette_list = gimp_palette_load_psp (context, filename, error);
+      palette_list = gimp_palette_load_psp (context, filename, file, error);
       break;
 
     case GIMP_PALETTE_FILE_FORMAT_ACO:
-      palette_list = gimp_palette_load_aco (context, filename, error);
+      palette_list = gimp_palette_load_aco (context, filename, file, error);
       break;
 
     case GIMP_PALETTE_FILE_FORMAT_CSS:
-      palette_list = gimp_palette_load_css (context, filename, error);
+      palette_list = gimp_palette_load_css (context, filename, file, error);
       break;
 
     default:
@@ -536,6 +551,8 @@ gimp_palette_import_from_file (GimpContext  *context,
       break;
     }
 
+  fclose (file);
+
   if (palette_list)
     {
       GimpPalette *palette = g_object_ref (palette_list->data);
diff --git a/app/core/gimppalette-load.c b/app/core/gimppalette-load.c
index 377eb9a..e7f0237 100644
--- a/app/core/gimppalette-load.c
+++ b/app/core/gimppalette-load.c
@@ -27,10 +27,6 @@
 #include <unistd.h>
 #endif
 
-#ifndef _O_BINARY
-#define _O_BINARY 0
-#endif
-
 #include <cairo.h>
 #include <gegl.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
@@ -52,15 +48,42 @@
 
 
 GList *
+gimp_startup_palette_load (GimpContext  *context,
+                           const gchar  *filename,
+                           GError      **error)
+{
+  FILE  *file;
+  GList *glist;
+
+  g_return_val_if_fail (filename != NULL, NULL);
+  g_return_val_if_fail (g_path_is_absolute (filename), NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  file = g_fopen (filename, "rb");
+
+  if (! file)
+    {
+      g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
+                   _("Could not open '%s' for reading: %s"),
+                   gimp_filename_to_utf8 (filename), g_strerror (errno));
+      return NULL;
+    }
+  glist = gimp_palette_load (context, filename, file, error);
+  fclose (file);
+  return glist;
+}
+
+
+GList *
 gimp_palette_load (GimpContext  *context,
                    const gchar  *filename,
+                   FILE         *file,
                    GError      **error)
 {
   GimpPalette      *palette;
   GimpPaletteEntry *entry;
   gchar             str[1024];
   gchar            *tok;
-  FILE             *file;
   gint              r, g, b;
   gint              linenum;
 
@@ -70,16 +93,6 @@ gimp_palette_load (GimpContext  *context,
 
   r = g = b = 0;
 
-  file = g_fopen (filename, "rb");
-
-  if (! file)
-    {
-      g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
-                   _("Could not open '%s' for reading: %s"),
-                   gimp_filename_to_utf8 (filename), g_strerror (errno));
-      return NULL;
-    }
-
   linenum = 1;
   if (! fgets (str, sizeof (str), file))
     {
@@ -87,7 +100,6 @@ gimp_palette_load (GimpContext  *context,
                    _("Fatal parse error in palette file '%s': "
                      "Read error in line %d."),
                    gimp_filename_to_utf8 (filename), linenum);
-      fclose (file);
       return NULL;
     }
 
@@ -97,7 +109,6 @@ gimp_palette_load (GimpContext  *context,
                    _("Fatal parse error in palette file '%s': "
                      "Missing magic header."),
                    gimp_filename_to_utf8 (filename));
-      fclose (file);
       return NULL;
     }
 
@@ -113,7 +124,6 @@ gimp_palette_load (GimpContext  *context,
                    _("Fatal parse error in palette file '%s': "
                      "Read error in line %d."),
                    gimp_filename_to_utf8 (filename), linenum);
-      fclose (file);
       g_object_unref (palette);
       return NULL;
     }
@@ -134,7 +144,6 @@ gimp_palette_load (GimpContext  *context,
                        _("Fatal parse error in palette file '%s': "
                          "Read error in line %d."),
                        gimp_filename_to_utf8 (filename), linenum);
-          fclose (file);
           g_object_unref (palette);
           return NULL;
         }
@@ -163,7 +172,6 @@ gimp_palette_load (GimpContext  *context,
                            _("Fatal parse error in palette file '%s': "
                              "Read error in line %d."),
                            gimp_filename_to_utf8 (filename), linenum);
-              fclose (file);
               g_object_unref (palette);
               return NULL;
             }
@@ -239,14 +247,11 @@ gimp_palette_load (GimpContext  *context,
                        _("Fatal parse error in palette file '%s': "
                          "Read error in line %d."),
                        gimp_filename_to_utf8 (filename), linenum);
-          fclose (file);
           g_object_unref (palette);
           return NULL;
         }
     }
 
-  fclose (file);
-
   palette->colors = g_list_reverse (palette->colors);
 
   return g_list_prepend (NULL, palette);
@@ -255,28 +260,18 @@ gimp_palette_load (GimpContext  *context,
 GList *
 gimp_palette_load_act (GimpContext  *context,
                        const gchar  *filename,
+                       FILE         *file,
                        GError      **error)
 {
   GimpPalette *palette;
   gchar       *palette_name;
-  gint         fd;
+  gint         fd = fileno (file);
   guchar       color_bytes[4];
 
   g_return_val_if_fail (filename != NULL, NULL);
   g_return_val_if_fail (g_path_is_absolute (filename), NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-  fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
-  if (! fd)
-    {
-      g_set_error (error,
-                   G_FILE_ERROR, g_file_error_from_errno (errno),
-                   _("Could not open '%s' for reading: %s"),
-                   gimp_filename_to_utf8 (filename), g_strerror (errno));
-      return NULL;
-    }
-
   palette_name = g_filename_display_basename (filename);
   palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
   g_free (palette_name);
@@ -293,36 +288,24 @@ gimp_palette_load_act (GimpContext  *context,
       gimp_palette_add_entry (palette, -1, NULL, &color);
     }
 
-  close (fd);
-
   return g_list_prepend (NULL, palette);
 }
 
 GList *
 gimp_palette_load_riff (GimpContext  *context,
                         const gchar  *filename,
+                        FILE         *file,
                         GError      **error)
 {
   GimpPalette *palette;
   gchar       *palette_name;
-  gint         fd;
+  gint         fd = fileno (file);
   guchar       color_bytes[4];
 
   g_return_val_if_fail (filename != NULL, NULL);
   g_return_val_if_fail (g_path_is_absolute (filename), NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-  fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
-  if (! fd)
-    {
-      g_set_error (error,
-                   G_FILE_ERROR, g_file_error_from_errno (errno),
-                   _("Could not open '%s' for reading: %s"),
-                   gimp_filename_to_utf8 (filename), g_strerror (errno));
-      return NULL;
-    }
-
   palette_name = g_filename_display_basename (filename);
   palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
   g_free (palette_name);
@@ -342,19 +325,18 @@ gimp_palette_load_riff (GimpContext  *context,
       gimp_palette_add_entry (palette, -1, NULL, &color);
     }
 
-  close (fd);
-
   return g_list_prepend (NULL, palette);
 }
 
 GList *
 gimp_palette_load_psp (GimpContext  *context,
                        const gchar  *filename,
+                       FILE         *file,
                        GError      **error)
 {
   GimpPalette *palette;
   gchar       *palette_name;
-  gint         fd;
+  gint         fd = fileno (file);
   guchar       color_bytes[4];
   gint         number_of_colors;
   gint         data_size;
@@ -369,17 +351,6 @@ gimp_palette_load_psp (GimpContext  *context,
   g_return_val_if_fail (g_path_is_absolute (filename), NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-  fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
-  if (! fd)
-    {
-      g_set_error (error,
-                   G_FILE_ERROR, g_file_error_from_errno (errno),
-                   _("Could not open '%s' for reading: %s"),
-                   gimp_filename_to_utf8 (filename), g_strerror (errno));
-      return NULL;
-    }
-
   palette_name = g_filename_display_basename (filename);
   palette = GIMP_PALETTE (gimp_palette_new (context, palette_name));
   g_free (palette_name);
@@ -434,19 +405,18 @@ gimp_palette_load_psp (GimpContext  *context,
 
   g_strfreev (lines);
 
-  close (fd);
-
   return g_list_prepend (NULL, palette);
 }
 
 GList *
 gimp_palette_load_aco (GimpContext  *context,
                        const gchar  *filename,
+                       FILE         *file,
                        GError      **error)
 {
   GimpPalette *palette;
   gchar       *palette_name;
-  gint         fd;
+  gint         fd = fileno (file);
   gint         format_version;
   gint         number_of_colors;
   gint         i;
@@ -459,17 +429,6 @@ gimp_palette_load_aco (GimpContext  *context,
   g_return_val_if_fail (g_path_is_absolute (filename), NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-  fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
-  if (! fd)
-    {
-      g_set_error (error,
-                   G_FILE_ERROR, g_file_error_from_errno (errno),
-                   _("Could not open '%s' for reading: %s"),
-                   gimp_filename_to_utf8 (filename), g_strerror (errno));
-      return NULL;
-    }
-
   status = read (fd, header, sizeof (header));
 
   if (status != sizeof (header))
@@ -478,7 +437,6 @@ gimp_palette_load_aco (GimpContext  *context,
                    GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
                    _("Could not read header from palette file '%s'"),
                    gimp_filename_to_utf8 (filename));
-      close (fd);
       return NULL;
     }
 
@@ -501,7 +459,6 @@ gimp_palette_load_aco (GimpContext  *context,
           g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
                        _("Fatal parse error in palette file '%s'"),
                        gimp_filename_to_utf8 (filename));
-          close (fd);
           g_object_unref (palette);
           return NULL;
        }
@@ -589,7 +546,6 @@ gimp_palette_load_aco (GimpContext  *context,
              g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
                           _("Fatal parse error in palette file '%s'"),
                           gimp_filename_to_utf8 (filename));
-             close (fd);
              g_object_unref (palette);
              return NULL;
            }
@@ -602,8 +558,6 @@ gimp_palette_load_aco (GimpContext  *context,
         gimp_palette_add_entry (palette, -1, NULL, &color);
     }
 
-  close(fd);
-
   return g_list_prepend (NULL, palette);
 }
 
@@ -611,11 +565,11 @@ gimp_palette_load_aco (GimpContext  *context,
 GList *
 gimp_palette_load_css (GimpContext  *context,
                        const gchar  *filename,
+                       FILE         *file,
                        GError      **error)
 {
   GimpPalette *palette;
   gchar       *name;
-  FILE        *file;
   GRegex      *regex;
   GimpRGB      color;
 
@@ -627,16 +581,6 @@ gimp_palette_load_css (GimpContext  *context,
   if (! regex)
     return NULL;
 
-  file = g_fopen (filename, "rb");
-
-  if (! file)
-    {
-      g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
-                   _("Could not open '%s' for reading: %s"),
-                   gimp_filename_to_utf8 (filename), g_strerror (errno));
-      return NULL;
-    }
-
   name = g_filename_display_basename (filename);
   palette = GIMP_PALETTE (gimp_palette_new (context, name));
   g_free (name);
@@ -665,71 +609,63 @@ gimp_palette_load_css (GimpContext  *context,
         }
     } while (! feof (file));
 
-  fclose (file);
-
   g_regex_unref (regex);
 
   return g_list_prepend (NULL, palette);
 }
 
 GimpPaletteFileFormat
-gimp_palette_load_detect_format (const gchar *filename)
+gimp_palette_load_detect_format (const gchar *filename, FILE *file)
 {
   GimpPaletteFileFormat format = GIMP_PALETTE_FILE_FORMAT_UNKNOWN;
-  gint                  fd;
+  gint                  fd = fileno (file);
   gchar                 header[16];
 
-  fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
-  if (fd)
+  if (fread (header, 1, sizeof (header), file) == sizeof (header))
     {
-      if (read (fd, header, sizeof (header)) == sizeof (header))
+      if (g_str_has_prefix (header + 0, "RIFF") &&
+          g_str_has_prefix (header + 8, "PAL data"))
         {
-          if (g_str_has_prefix (header + 0, "RIFF") &&
-              g_str_has_prefix (header + 8, "PAL data"))
-            {
-              format = GIMP_PALETTE_FILE_FORMAT_RIFF_PAL;
-            }
-          else if (g_str_has_prefix (header, "GIMP Palette"))
-            {
-              format = GIMP_PALETTE_FILE_FORMAT_GPL;
-            }
-          else if (g_str_has_prefix (header, "JASC-PAL"))
-            {
-              format = GIMP_PALETTE_FILE_FORMAT_PSP_PAL;
-            }
+          format = GIMP_PALETTE_FILE_FORMAT_RIFF_PAL;
         }
-
-      if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+      else if (g_str_has_prefix (header, "GIMP Palette"))
         {
-          gchar *lower_filename = g_ascii_strdown (filename, -1);
+          format = GIMP_PALETTE_FILE_FORMAT_GPL;
+        }
+      else if (g_str_has_prefix (header, "JASC-PAL"))
+        {
+          format = GIMP_PALETTE_FILE_FORMAT_PSP_PAL;
+        }
+    }
 
-          if (g_str_has_suffix (lower_filename, ".aco"))
-            {
-              format = GIMP_PALETTE_FILE_FORMAT_ACO;
-            }
-          else if (g_str_has_suffix (lower_filename, ".css"))
-            {
-              format = GIMP_PALETTE_FILE_FORMAT_CSS;
-            }
+  if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+    {
+      gchar *lower_filename = g_ascii_strdown (filename, -1);
 
-          g_free (lower_filename);
+      if (g_str_has_suffix (lower_filename, ".aco"))
+        {
+          format = GIMP_PALETTE_FILE_FORMAT_ACO;
         }
-
-      if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+      else if (g_str_has_suffix (lower_filename, ".css"))
         {
-          struct stat file_stat;
-
-          if (fstat (fd, &file_stat) >= 0)
-            {
-              if (file_stat.st_size == 768)
-                format = GIMP_PALETTE_FILE_FORMAT_ACT;
-            }
+          format = GIMP_PALETTE_FILE_FORMAT_CSS;
         }
 
-      close (fd);
+      g_free (lower_filename);
+    }
+
+  if (format == GIMP_PALETTE_FILE_FORMAT_UNKNOWN)
+    {
+      struct stat file_stat;
+
+      if (fstat (fd, &file_stat) >= 0)
+        {
+          if (file_stat.st_size == 768)
+            format = GIMP_PALETTE_FILE_FORMAT_ACT;
+        }
     }
 
+  rewind (file);
   return format;
 }
 
diff --git a/app/core/gimppalette-load.h b/app/core/gimppalette-load.h
index b8764c5..5a1f80b 100644
--- a/app/core/gimppalette-load.h
+++ b/app/core/gimppalette-load.h
@@ -34,26 +34,36 @@ typedef enum
 } GimpPaletteFileFormat;
 
 
+GList               * gimp_startup_palette_load        (GimpContext  *context,
+                                                        const gchar  *filename,
+                                                        GError      **error);
 GList               * gimp_palette_load               (GimpContext  *context,
                                                        const gchar  *filename,
+                                                       FILE         *file,
                                                        GError      **error);
 GList               * gimp_palette_load_act           (GimpContext  *context,
                                                        const gchar  *filename,
+                                                       FILE         *file,
                                                        GError      **error);
 GList               * gimp_palette_load_riff          (GimpContext  *context,
                                                        const gchar  *filename,
+                                                       FILE         *file,
                                                        GError      **error);
 GList               * gimp_palette_load_psp           (GimpContext  *context,
                                                        const gchar  *filename,
+                                                       FILE         *file,
                                                        GError      **error);
 GList               * gimp_palette_load_aco           (GimpContext  *context,
                                                        const gchar  *filename,
+                                                       FILE         *file,
                                                        GError      **error);
 GList               * gimp_palette_load_css           (GimpContext  *context,
                                                        const gchar  *filename,
+                                                       FILE         *file,
                                                        GError      **error);
 
-GimpPaletteFileFormat gimp_palette_load_detect_format (const gchar  *filename);
+GimpPaletteFileFormat gimp_palette_load_detect_format (const gchar  *filename,
+                                                       FILE *file);
 
 
 #endif /* __GIMP_PALETTE_H__ */


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