From 3fbf7436c9704f62b51ac743a63fa6926211ea53 Mon Sep 17 00:00:00 2001
From: Sven Neumann <sven@gimp.org>
Date: Thu, 10 Aug 2006 21:22:05 +0000
Subject: [PATCH] added a GError parameter to file_utils_find_proc().

2006-08-10  Sven Neumann  <sven@gimp.org>

	* app/file/file-utils.[ch]: added a GError parameter to
	file_utils_find_proc().

	* app/actions/file-commands.c
	* app/dialogs/file-save-dialog.c
	* app/file/file-open.c
	* app/widgets/gimpdnd-xds.c
	* tools/pdbgen/pdb/fileops.pdb: changed accordingly.

	* app/pdb/fileops_cmds.c: regenerated.
---
 ChangeLog                      | 13 +++++++++++++
 app/actions/file-commands.c    |  5 +++--
 app/dialogs/file-save-dialog.c | 10 +++++-----
 app/file/file-open.c           | 12 +++++-------
 app/file/file-utils.c          | 25 ++++++++++++++++++++++---
 app/file/file-utils.h          |  3 ++-
 app/pdb/fileops_cmds.c         |  6 ++++--
 app/widgets/gimpdnd-xds.c      |  3 ++-
 tools/pdbgen/pdb/fileops.pdb   |  6 ++++--
 9 files changed, 60 insertions(+), 23 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ab40e93f43..b30bb406f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2006-08-10  Sven Neumann  <sven@gimp.org>
+
+	* app/file/file-utils.[ch]: added a GError parameter to
+	file_utils_find_proc().
+
+	* app/actions/file-commands.c
+	* app/dialogs/file-save-dialog.c
+	* app/file/file-open.c
+	* app/widgets/gimpdnd-xds.c
+	* tools/pdbgen/pdb/fileops.pdb: changed accordingly.
+
+	* app/pdb/fileops_cmds.c: regenerated.
+
 2006-08-10  Bill Skaggs  <weskaggs@primate.ucdavis.edu>
 
 	* libgimpwidgets/gimpwidgets.c (gimp_coordinate_callback):
diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c
index 36f3d2b618..5de68df96f 100644
--- a/app/actions/file-commands.c
+++ b/app/actions/file-commands.c
@@ -206,8 +206,9 @@ file_save_cmd_callback (GtkAction *action,
       save_proc = gimp_image_get_save_proc (image);
 
       if (uri && ! save_proc)
-        save_proc = file_utils_find_proc (image->gimp->plug_in_manager->save_procs,
-                                          uri);
+        save_proc =
+          file_utils_find_proc (image->gimp->plug_in_manager->save_procs,
+                                uri, NULL);
 
       if (! (uri && save_proc))
         {
diff --git a/app/dialogs/file-save-dialog.c b/app/dialogs/file-save-dialog.c
index 4e125a11a0..815cb5b265 100644
--- a/app/dialogs/file-save-dialog.c
+++ b/app/dialogs/file-save-dialog.c
@@ -173,9 +173,9 @@ file_save_dialog_check_uri (GtkWidget            *save_dialog,
 
   save_proc     = dialog->file_proc;
   uri_proc      = file_utils_find_proc (gimp->plug_in_manager->save_procs,
-                                        uri);
+                                        uri, NULL);
   basename_proc = file_utils_find_proc (gimp->plug_in_manager->save_procs,
-                                        basename);
+                                        basename, NULL);
 
 #ifdef DEBUG_SPEW
   g_print ("\n\n%s: URI = %s\n",
@@ -234,10 +234,10 @@ file_save_dialog_check_uri (GtkWidget            *save_dialog,
               uri      = ext_uri;
               basename = ext_basename;
 
-              uri_proc      = file_utils_find_proc (gimp->plug_in_manager->save_procs,
-                                                    uri);
+              uri_proc = file_utils_find_proc (gimp->plug_in_manager->save_procs,
+                                               uri, NULL);
               basename_proc = file_utils_find_proc (gimp->plug_in_manager->save_procs,
-                                                    basename);
+                                                    basename, NULL);
 
               utf8 = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
               gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (save_dialog),
diff --git a/app/file/file-open.c b/app/file/file-open.c
index bf0c434fd6..f196a706ef 100644
--- a/app/file/file-open.c
+++ b/app/file/file-open.c
@@ -98,14 +98,11 @@ file_open_image (Gimp                *gimp,
   *status = GIMP_PDB_EXECUTION_ERROR;
 
   if (! file_proc)
-    file_proc = file_utils_find_proc (gimp->plug_in_manager->load_procs, uri);
+    file_proc = file_utils_find_proc (gimp->plug_in_manager->load_procs,
+                                      uri, error);
 
   if (! file_proc)
-    {
-      g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
-                   _("Unknown file type"));
-      return NULL;
-    }
+    return NULL;
 
   filename = file_utils_filename_from_uri (uri);
 
@@ -203,7 +200,8 @@ file_open_thumbnail (Gimp          *gimp,
   *image_width  = 0;
   *image_height = 0;
 
-  file_proc = file_utils_find_proc (gimp->plug_in_manager->load_procs, uri);
+  file_proc = file_utils_find_proc (gimp->plug_in_manager->load_procs,
+                                    uri, NULL);
 
   if (! file_proc || ! file_proc->thumb_loader)
     return NULL;
diff --git a/app/file/file-utils.c b/app/file/file-utils.c
index a6ee049c50..368858ab5e 100644
--- a/app/file/file-utils.c
+++ b/app/file/file-utils.c
@@ -21,6 +21,7 @@
 
 #include "config.h"
 
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -186,7 +187,8 @@ file_utils_filename_from_uri (const gchar *uri)
 
 GimpPlugInProcedure *
 file_utils_find_proc (GSList       *procs,
-                      const gchar  *uri)
+                      const gchar  *uri,
+                      GError      **error)
 {
   GimpPlugInProcedure *file_proc;
   GSList              *all_procs = procs;
@@ -194,6 +196,7 @@ file_utils_find_proc (GSList       *procs,
 
   g_return_val_if_fail (procs != NULL, NULL);
   g_return_val_if_fail (uri != NULL, NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
   /* First, check magicless prefixes/suffixes */
   file_proc = file_proc_find_by_name (all_procs, uri, TRUE);
@@ -223,8 +226,18 @@ file_utils_find_proc (GSList       *procs,
               if (head_size == -2)
                 {
                   head_size = 0;
+
                   if ((ifp = g_fopen (filename, "rb")) != NULL)
-                    head_size = fread ((gchar *) head, 1, sizeof (head), ifp);
+                    {
+                      head_size = fread ((gchar *) head, 1, sizeof (head), ifp);
+                    }
+                  else
+                    {
+                      g_set_error (error,
+                                   G_FILE_ERROR,
+                                   g_file_error_from_errno (errno),
+                                   g_strerror (errno));
+                    }
                 }
 
               if (head_size >= 4)
@@ -259,7 +272,13 @@ file_utils_find_proc (GSList       *procs,
     }
 
   /* As a last resort, try matching by name */
-  return file_proc_find_by_name (all_procs, uri, FALSE);
+  file_proc = file_proc_find_by_name (all_procs, uri, FALSE);
+
+  if (! file_proc && error && *error == NULL)
+    g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+                 _("Unknown file type"));
+
+  return file_proc;
 }
 
 GimpPlugInProcedure *
diff --git a/app/file/file-utils.h b/app/file/file-utils.h
index 9f2f07e1d7..1002ad56d9 100644
--- a/app/file/file-utils.h
+++ b/app/file/file-utils.h
@@ -36,7 +36,8 @@ gchar               * file_utils_uri_display_basename   (const gchar   *uri);
 gchar               * file_utils_uri_display_name       (const gchar   *uri);
 
 GimpPlugInProcedure * file_utils_find_proc              (GSList        *procs,
-                                                         const gchar   *filename);
+                                                         const gchar   *filename,
+                                                         GError       **error);
 GimpPlugInProcedure * file_utils_find_proc_by_extension (GSList        *procs,
                                                          const gchar   *uri);
 
diff --git a/app/pdb/fileops_cmds.c b/app/pdb/fileops_cmds.c
index 9f265af0a4..369023a9ad 100644
--- a/app/pdb/fileops_cmds.c
+++ b/app/pdb/fileops_cmds.c
@@ -63,7 +63,8 @@ file_load_invoker (GimpProcedure     *procedure,
   if (! uri)
     return gimp_procedure_get_return_values (procedure, FALSE);
 
-  file_proc = file_utils_find_proc (gimp->plug_in_manager->load_procs, uri);
+  file_proc =
+    file_utils_find_proc (gimp->plug_in_manager->load_procs, uri, NULL);
 
   g_free (uri);
 
@@ -157,7 +158,8 @@ file_save_invoker (GimpProcedure     *procedure,
   if (! uri)
     return gimp_procedure_get_return_values (procedure, FALSE);
 
-  file_proc = file_utils_find_proc (gimp->plug_in_manager->save_procs, uri);
+  file_proc =
+    file_utils_find_proc (gimp->plug_in_manager->save_procs, uri, NULL);
 
   g_free (uri);
 
diff --git a/app/widgets/gimpdnd-xds.c b/app/widgets/gimpdnd-xds.c
index 37bf208cef..ad9c931db1 100644
--- a/app/widgets/gimpdnd-xds.c
+++ b/app/widgets/gimpdnd-xds.c
@@ -141,7 +141,8 @@ gimp_dnd_xds_save_image (GdkDragContext   *context,
   uri = g_strndup ((const gchar *) data, length);
   g_free (data);
 
-  proc = file_utils_find_proc (image->gimp->plug_in_manager->save_procs, uri);
+  proc =
+    file_utils_find_proc (image->gimp->plug_in_manager->save_procs, uri, NULL);
 
   if (proc)
     {
diff --git a/tools/pdbgen/pdb/fileops.pdb b/tools/pdbgen/pdb/fileops.pdb
index 4fc106d2e1..b97737c9de 100644
--- a/tools/pdbgen/pdb/fileops.pdb
+++ b/tools/pdbgen/pdb/fileops.pdb
@@ -65,7 +65,8 @@ HELP
   if (! uri)
     return gimp_procedure_get_return_values (procedure, FALSE);
 
-  file_proc = file_utils_find_proc (gimp->plug_in_manager->load_procs, uri);
+  file_proc =
+    file_utils_find_proc (gimp->plug_in_manager->load_procs, uri, NULL);
 
   g_free (uri);
 
@@ -191,7 +192,8 @@ HELP
   if (! uri)
     return gimp_procedure_get_return_values (procedure, FALSE);
 
-  file_proc = file_utils_find_proc (gimp->plug_in_manager->save_procs, uri);
+  file_proc =
+    file_utils_find_proc (gimp->plug_in_manager->save_procs, uri, NULL);
 
   g_free (uri);