[gimp] app: change the image's various URIs to GFiles



commit ff6ea695694522655c442072d8bb7be5981176e4
Author: Michael Natterer <mitch gimp org>
Date:   Mon Jul 7 23:56:56 2014 +0200

    app: change the image's various URIs to GFiles
    
    which gets rid of a lot of temporarily added GFile code again because
    we don't need to convert between URI and GFile any longer.

 app/actions/debug-commands.c            |    2 +-
 app/actions/file-actions.c              |   15 +-
 app/actions/file-commands.c             |   64 ++------
 app/core/gimpimage-duplicate.c          |   80 +++++-----
 app/core/gimpimage.c                    |  282 +++++++++++++++++--------------
 app/core/gimpimage.h                    |   36 ++--
 app/dialogs/file-save-dialog.c          |    6 +-
 app/dialogs/quit-dialog.c               |   15 +-
 app/display/gimpdisplayshell-close.c    |   26 ++--
 app/display/gimpdisplayshell-handlers.c |   19 +--
 app/file/file-open.c                    |   18 +--
 app/file/file-save.c                    |   12 +-
 app/file/file-utils.c                   |   73 +++++---
 app/file/file-utils.h                   |    4 +-
 app/pdb/image-cmds.c                    |   22 ++-
 app/widgets/gimpfiledialog.c            |  252 ++++++++++------------------
 app/widgets/gimpimagepropview.c         |   30 +---
 tools/pdbgen/pdb/image.pdb              |   22 ++-
 18 files changed, 450 insertions(+), 528 deletions(-)
---
diff --git a/app/actions/debug-commands.c b/app/actions/debug-commands.c
index a7b1f6c..de26878 100644
--- a/app/actions/debug-commands.c
+++ b/app/actions/debug-commands.c
@@ -340,7 +340,7 @@ debug_show_image_graph (GimpImage *source_image)
                                  GIMP_RGB,
                                  GIMP_PRECISION_U8_GAMMA,
                                  FALSE);
-  gimp_image_set_uri (new_image, new_name);
+  gimp_image_set_file (new_image, g_file_new_for_uri (new_name));
   layer = gimp_layer_new_from_buffer (buffer,
                                       new_image,
                                       gimp_image_get_layer_format (new_image,
diff --git a/app/actions/file-actions.c b/app/actions/file-actions.c
index deef271..756ccb3 100644
--- a/app/actions/file-actions.c
+++ b/app/actions/file-actions.c
@@ -256,23 +256,18 @@ file_actions_update (GimpActionGroup *group,
   Gimp         *gimp           = action_data_get_gimp (data);
   GimpImage    *image          = action_data_get_image (data);
   GimpDrawable *drawable       = NULL;
+  GFile        *file           = NULL;
   GFile        *source         = NULL;
   GFile        *export         = NULL;
   gboolean      show_overwrite = FALSE;
 
   if (image)
     {
-      const gchar *uri;
-
       drawable = gimp_image_get_active_drawable (image);
 
-      uri = gimp_image_get_imported_uri (image);
-      if (uri)
-        source = g_file_new_for_uri (uri);
-
-      uri = gimp_image_get_exported_uri (image);
-      if (uri)
-        export = g_file_new_for_uri (uri);
+      file   = gimp_image_get_file (image);
+      source = gimp_image_get_imported_file (image);
+      export = gimp_image_get_exported_file (image);
     }
 
   show_overwrite =
@@ -289,7 +284,7 @@ file_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("file-save-as",         drawable);
   SET_SENSITIVE ("file-save-a-copy",     drawable);
   SET_SENSITIVE ("file-save-and-close",  drawable);
-  SET_SENSITIVE ("file-revert",          image && (gimp_image_get_uri (image) || source));
+  SET_SENSITIVE ("file-revert",          image && (file || source));
   SET_SENSITIVE ("file-export",          drawable);
   SET_VISIBLE   ("file-export",          ! show_overwrite);
   SET_SENSITIVE ("file-overwrite",       show_overwrite);
diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c
index c285070..ca3467e 100644
--- a/app/actions/file-commands.c
+++ b/app/actions/file-commands.c
@@ -226,7 +226,6 @@ file_save_cmd_callback (GtkAction *action,
   GimpImage    *image;
   GtkWidget    *widget;
   GimpSaveMode  save_mode;
-  const gchar  *uri;
   GFile        *file  = NULL;
   gboolean      saved = FALSE;
   return_if_no_gimp (gimp, data);
@@ -240,10 +239,7 @@ file_save_cmd_callback (GtkAction *action,
   if (! gimp_image_get_active_drawable (image))
     return;
 
-  uri = gimp_image_get_uri (image);
-
-  if (uri)
-    file = g_file_new_for_uri (uri);
+  file = gimp_image_get_file (image);
 
   switch (save_mode)
     {
@@ -303,17 +299,16 @@ file_save_cmd_callback (GtkAction *action,
     case GIMP_SAVE_MODE_EXPORT:
     case GIMP_SAVE_MODE_OVERWRITE:
       {
-        const gchar         *uri         = NULL;
         GFile               *file        = NULL;
         GimpPlugInProcedure *export_proc = NULL;
         gboolean             overwrite   = FALSE;
 
         if (save_mode == GIMP_SAVE_MODE_EXPORT)
           {
-            uri         = gimp_image_get_exported_uri (image);
+            file        = gimp_image_get_exported_file (image);
             export_proc = gimp_image_get_export_proc (image);
 
-            if (! uri)
+            if (! file)
               {
                 /* Behave as if Export As... was invoked */
                 file_export_dialog_show (gimp, image, widget);
@@ -324,14 +319,11 @@ file_save_cmd_callback (GtkAction *action,
           }
         else if (save_mode == GIMP_SAVE_MODE_OVERWRITE)
           {
-            uri = gimp_image_get_imported_uri (image);
+            file = gimp_image_get_imported_file (image);
 
             overwrite = TRUE;
           }
 
-        if (uri)
-          file = g_file_new_for_uri (uri);
-
         if (file && ! export_proc)
           {
             export_proc =
@@ -349,9 +341,6 @@ file_save_cmd_callback (GtkAction *action,
                                                  overwrite, ! overwrite,
                                                  TRUE);
           }
-
-        if (file)
-          g_object_unref (file);
       }
       break;
     }
@@ -393,19 +382,19 @@ file_revert_cmd_callback (GtkAction *action,
   GimpDisplay *display;
   GimpImage   *image;
   GtkWidget   *dialog;
-  const gchar *uri;
+  GFile       *file;
   return_if_no_display (display, data);
 
   image = gimp_display_get_image (display);
 
-  uri = gimp_image_get_uri (image);
+  file = gimp_image_get_file (image);
 
-  if (! uri)
-    uri = gimp_image_get_imported_uri (image);
+  if (! file)
+    file = gimp_image_get_imported_file (image);
 
   dialog = g_object_get_data (G_OBJECT (image), REVERT_DATA_KEY);
 
-  if (! uri)
+  if (! file)
     {
       gimp_message_literal (image->gimp,
                             G_OBJECT (display), GIMP_MESSAGE_ERROR,
@@ -418,8 +407,6 @@ file_revert_cmd_callback (GtkAction *action,
     }
   else
     {
-      gchar *filename;
-
       dialog =
         gimp_message_dialog_new (_("Revert Image"), "document-revert",
                                  GTK_WIDGET (gimp_display_get_shell (display)),
@@ -444,13 +431,10 @@ file_revert_cmd_callback (GtkAction *action,
                         G_CALLBACK (file_revert_confirm_response),
                         display);
 
-      filename = file_utils_uri_display_name (uri);
-
       gimp_message_box_set_primary_text (GIMP_MESSAGE_DIALOG (dialog)->box,
                                          _("Revert '%s' to '%s'?"),
                                          gimp_image_get_display_name (image),
-                                         filename);
-      g_free (filename);
+                                         gimp_file_get_utf8_name (file));
 
       gimp_message_box_set_text (GIMP_MESSAGE_DIALOG (dialog)->box,
                                  _("By reverting the image to the state saved "
@@ -531,19 +515,11 @@ file_open_dialog_show (Gimp        *gimp,
   if (dialog)
     {
       if (! file && image)
-        {
-          const gchar *uri = gimp_image_get_uri (image);
-          if (uri)
-            file = g_file_new_for_uri (uri);
-        }
+        file = gimp_image_get_file (image);
 
       if (! file)
-        {
-          file = g_object_get_data (G_OBJECT (gimp),
-                                    GIMP_FILE_OPEN_LAST_FILE_KEY);
-          if (file)
-            g_object_ref (file);
-        }
+        file = g_object_get_data (G_OBJECT (gimp),
+                                  GIMP_FILE_OPEN_LAST_FILE_KEY);
 
       if (file)
         gtk_file_chooser_set_file (GTK_FILE_CHOOSER (dialog), file, NULL);
@@ -559,9 +535,6 @@ file_open_dialog_show (Gimp        *gimp,
 
       gtk_window_present (GTK_WINDOW (dialog));
     }
-
-  if (file)
-    g_object_unref (file);
 }
 
 static GtkWidget *
@@ -780,17 +753,14 @@ file_revert_confirm_response (GtkWidget   *dialog,
     {
       Gimp              *gimp = old_image->gimp;
       GimpImage         *new_image;
-      const gchar       *uri;
       GFile             *file;
       GimpPDBStatusType  status;
       GError            *error = NULL;
 
-      uri = gimp_image_get_uri (old_image);
+      file = gimp_image_get_file (old_image);
 
-      if (! uri)
-        uri = gimp_image_get_imported_uri (old_image);
-
-      file = g_file_new_for_uri (uri);
+      if (! file)
+        file = gimp_image_get_imported_file (old_image);
 
       new_image = file_open_image (gimp, gimp_get_user_context (gimp),
                                    GIMP_PROGRESS (display),
@@ -813,7 +783,5 @@ file_revert_confirm_response (GtkWidget   *dialog,
                         gimp_file_get_utf8_name (file), error->message);
           g_clear_error (&error);
         }
-
-      g_object_unref (file);
     }
 }
diff --git a/app/core/gimpimage-duplicate.c b/app/core/gimpimage-duplicate.c
index 2219f44..da4469b 100644
--- a/app/core/gimpimage-duplicate.c
+++ b/app/core/gimpimage-duplicate.c
@@ -46,38 +46,38 @@
 #include "vectors/gimpvectors.h"
 
 
-static void          gimp_image_duplicate_resolution      (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_save_source_uri (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_colormap        (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static GimpItem    * gimp_image_duplicate_item            (GimpItem      *item,
-                                                           GimpImage     *new_image);
-static GimpLayer   * gimp_image_duplicate_layers          (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static GimpChannel * gimp_image_duplicate_channels        (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static GimpVectors * gimp_image_duplicate_vectors         (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_floating_sel    (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_mask            (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_components      (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_guides          (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_sample_points   (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_grid            (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_metadata        (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_quick_mask      (GimpImage     *image,
-                                                           GimpImage     *new_image);
-static void          gimp_image_duplicate_parasites       (GimpImage     *image,
-                                                           GimpImage     *new_image);
+static void          gimp_image_duplicate_resolution       (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_save_source_file (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_colormap         (GimpImage *image,
+                                                            GimpImage *new_image);
+static GimpItem    * gimp_image_duplicate_item             (GimpItem  *item,
+                                                            GimpImage *new_image);
+static GimpLayer   * gimp_image_duplicate_layers           (GimpImage *image,
+                                                            GimpImage *new_image);
+static GimpChannel * gimp_image_duplicate_channels         (GimpImage *image,
+                                                            GimpImage *new_image);
+static GimpVectors * gimp_image_duplicate_vectors          (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_floating_sel     (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_mask             (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_components       (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_guides           (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_sample_points    (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_grid             (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_metadata         (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_quick_mask       (GimpImage *image,
+                                                            GimpImage *new_image);
+static void          gimp_image_duplicate_parasites        (GimpImage *image,
+                                                            GimpImage *new_image);
 
 
 GimpImage *
@@ -102,8 +102,7 @@ gimp_image_duplicate (GimpImage *image)
   gimp_image_undo_disable (new_image);
 
   /*  Store the source uri to be used by the save dialog  */
-  gimp_image_duplicate_save_source_uri (image, new_image);
-
+  gimp_image_duplicate_save_source_file (image, new_image);
 
   /*  Copy the colormap if necessary  */
   gimp_image_duplicate_colormap (image, new_image);
@@ -175,12 +174,15 @@ gimp_image_duplicate_resolution (GimpImage *image,
 }
 
 static void
-gimp_image_duplicate_save_source_uri (GimpImage *image,
-                                      GimpImage *new_image)
+gimp_image_duplicate_save_source_file (GimpImage *image,
+                                       GimpImage *new_image)
 {
-  g_object_set_data_full (G_OBJECT (new_image), "gimp-image-source-uri",
-                          g_strdup (gimp_image_get_uri (image)),
-                          (GDestroyNotify) g_free);
+  GFile *file = gimp_image_get_file (image);
+
+  if (file)
+    g_object_set_data_full (G_OBJECT (new_image), "gimp-image-source-file",
+                            g_object_ref (file),
+                            (GDestroyNotify) g_object_unref);
 }
 
 static void
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index aa22707..c1a83d5 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -86,11 +86,6 @@
 #define TRC(x)
 #endif
 
-/* Data keys for GimpImage */
-#define GIMP_FILE_EXPORT_URI_KEY        "gimp-file-export-uri"
-#define GIMP_FILE_SAVE_A_COPY_URI_KEY   "gimp-file-save-a-copy-uri"
-#define GIMP_FILE_IMPORT_SOURCE_URI_KEY "gimp-file-import-source-uri"
-
 
 enum
 {
@@ -419,9 +414,9 @@ gimp_image_class_init (GimpImageClass *klass)
                   G_SIGNAL_RUN_FIRST,
                   G_STRUCT_OFFSET (GimpImageClass, saved),
                   NULL, NULL,
-                  gimp_marshal_VOID__STRING,
+                  gimp_marshal_VOID__OBJECT,
                   G_TYPE_NONE, 1,
-                  G_TYPE_STRING);
+                  G_TYPE_FILE);
 
   gimp_image_signals[EXPORTED] =
     g_signal_new ("exported",
@@ -429,9 +424,9 @@ gimp_image_class_init (GimpImageClass *klass)
                   G_SIGNAL_RUN_FIRST,
                   G_STRUCT_OFFSET (GimpImageClass, exported),
                   NULL, NULL,
-                  gimp_marshal_VOID__STRING,
+                  gimp_marshal_VOID__OBJECT,
                   G_TYPE_NONE, 1,
-                  G_TYPE_STRING);
+                  G_TYPE_FILE);
 
   gimp_image_signals[GUIDE_ADDED] =
     g_signal_new ("guide-added",
@@ -1086,7 +1081,19 @@ gimp_image_name_changed (GimpObject *object)
    */
   name = gimp_object_get_name (object);
   if (name && strlen (name) == 0)
-    gimp_object_name_free (object);
+    {
+      gimp_object_name_free (object);
+      name = NULL;
+    }
+
+  if (private->file)
+    {
+      g_object_unref (private->file);
+      private->file = NULL;
+    }
+
+  if (name)
+    private->file = g_file_new_for_uri (name);
 }
 
 static gint64
@@ -1809,12 +1816,22 @@ gimp_image_get_by_ID (Gimp *gimp,
 }
 
 void
-gimp_image_set_uri (GimpImage   *image,
-                    const gchar *uri)
+gimp_image_set_file (GimpImage *image,
+                     GFile     *file)
 {
   g_return_if_fail (GIMP_IS_IMAGE (image));
+  g_return_if_fail (file == NULL || G_IS_FILE (file));
 
-  gimp_object_set_name (GIMP_OBJECT (image), uri);
+  if (file)
+    {
+      gchar *uri = g_file_get_uri (file);
+      gimp_object_set_name (GIMP_OBJECT (image), uri);
+      g_free (uri);
+    }
+  else
+    {
+      gimp_object_set_name (GIMP_OBJECT (image), NULL);
+    }
 }
 
 static void
@@ -1851,25 +1868,25 @@ gimp_image_get_uri_or_untitled (const GimpImage *image)
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  uri = gimp_image_get_uri (image);
+  uri = gimp_object_get_name (image);
 
   return uri ? uri : gimp_image_get_string_untitled ();
 }
 
 /**
- * gimp_image_get_uri:
+ * gimp_image_get_file:
  * @image: A #GimpImage.
  *
- * Get the URI of the XCF image, or NULL if there is no URI.
+ * Get the file of the XCF image, or NULL if there is no file.
  *
- * Returns: The URI, or NULL.
+ * Returns: The file, or NULL.
  **/
-const gchar *
-gimp_image_get_uri (const GimpImage *image)
+GFile *
+gimp_image_get_file (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return gimp_object_get_name (image);
+  return GIMP_IMAGE_GET_PRIVATE (image)->file;
 }
 
 void
@@ -1887,132 +1904,148 @@ gimp_image_set_filename (GimpImage   *image,
     }
   else
     {
-      gimp_image_set_uri (image, NULL);
+      gimp_image_set_file (image, NULL);
     }
 }
 
 /**
- * gimp_image_get_imported_uri:
+ * gimp_image_get_imported_file:
  * @image: A #GimpImage.
  *
- * Returns: The URI of the imported image, or NULL if the image has
+ * Returns: The file of the imported image, or NULL if the image has
  * been saved as XCF after it was imported.
  **/
-const gchar *
-gimp_image_get_imported_uri (const GimpImage *image)
+GFile *
+gimp_image_get_imported_file (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return g_object_get_data (G_OBJECT (image),
-                            GIMP_FILE_IMPORT_SOURCE_URI_KEY);
+  return GIMP_IMAGE_GET_PRIVATE (image)->imported_file;
 }
 
 /**
- * gimp_image_get_exported_uri:
+ * gimp_image_get_exported_file:
  * @image: A #GimpImage.
  *
- * Returns: The URI of the image last exported from this XCF file, or
+ * Returns: The file of the image last exported from this XCF file, or
  * NULL if the image has never been exported.
  **/
-const gchar *
-gimp_image_get_exported_uri (const GimpImage *image)
+GFile *
+gimp_image_get_exported_file (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return g_object_get_data (G_OBJECT (image),
-                            GIMP_FILE_EXPORT_URI_KEY);
+  return GIMP_IMAGE_GET_PRIVATE (image)->exported_file;
 }
 
 /**
- * gimp_image_get_save_a_copy_uri:
+ * gimp_image_get_save_a_copy_file:
  * @image: A #GimpImage.
  *
  * Returns: The URI of the last copy that was saved of this XCF file.
  **/
-const gchar *
-gimp_image_get_save_a_copy_uri (const GimpImage *image)
+GFile *
+gimp_image_get_save_a_copy_file (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return g_object_get_data (G_OBJECT (image),
-                            GIMP_FILE_SAVE_A_COPY_URI_KEY);
+  return GIMP_IMAGE_GET_PRIVATE (image)->save_a_copy_file;
 }
 
 /**
- * gimp_image_get_any_uri:
+ * gimp_image_get_any_file:
  * @image: A #GimpImage.
  *
- * Returns: The XCF file URI, the imported file URI, or the exported
- * file URI, in that order of precedence.
+ * Returns: The XCF file, the imported file, or the exported file, in
+ * that order of precedence.
  **/
-const gchar *
-gimp_image_get_any_uri (const GimpImage *image)
+GFile *
+gimp_image_get_any_file (const GimpImage *image)
 {
-  const gchar *uri;
+  GFile *file;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  uri = gimp_image_get_uri (image);
-  if (! uri)
+  file = gimp_image_get_file (image);
+  if (! file)
     {
-      uri = gimp_image_get_imported_uri (image);
-      if (! uri)
+      file = gimp_image_get_imported_file (image);
+      if (! file)
         {
-          uri = gimp_image_get_exported_uri (image);
+          file = gimp_image_get_exported_file (image);
         }
     }
 
-  return uri;
+  return file;
 }
 
 /**
  * gimp_image_set_imported_uri:
  * @image: A #GimpImage.
- * @uri:
+ * @file:
  *
  * Sets the URI this file was imported from.
  **/
 void
-gimp_image_set_imported_uri (GimpImage   *image,
-                             const gchar *uri)
+gimp_image_set_imported_file (GimpImage *image,
+                              GFile     *file)
 {
+  GimpImagePrivate *private;
+
   g_return_if_fail (GIMP_IS_IMAGE (image));
+  g_return_if_fail (file == NULL || G_IS_FILE (file));
 
-  if (gimp_image_get_imported_uri (image) == uri)
-    return;
+  private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  g_object_set_data_full (G_OBJECT (image), GIMP_FILE_IMPORT_SOURCE_URI_KEY,
-                          g_strdup (uri), (GDestroyNotify) g_free);
+  if (private->imported_file != file)
+    {
+      if (private->imported_file)
+        g_object_unref (private->imported_file);
 
-  gimp_object_name_changed (GIMP_OBJECT (image));
+      private->imported_file = file;
+
+      if (private->imported_file)
+        g_object_ref (private->imported_file);
+
+      gimp_object_name_changed (GIMP_OBJECT (image));
+    }
 }
 
 /**
- * gimp_image_set_exported_uri:
+ * gimp_image_set_exported_file:
  * @image: A #GimpImage.
- * @uri:
+ * @file:
  *
- * Sets the URI this file was last exported to. Note that saving as
+ * Sets the file this image was last exported to. Note that saving as
  * XCF is not "exporting".
  **/
 void
-gimp_image_set_exported_uri (GimpImage   *image,
-                             const gchar *uri)
+gimp_image_set_exported_file (GimpImage *image,
+                              GFile     *file)
 {
+  GimpImagePrivate *private;
+
   g_return_if_fail (GIMP_IS_IMAGE (image));
+  g_return_if_fail (file == NULL || G_IS_FILE (file));
 
-  if (gimp_image_get_exported_uri (image) == uri)
-    return;
+  private = GIMP_IMAGE_GET_PRIVATE (image);
+
+  if (private->exported_file != file)
+    {
+      if (private->exported_file)
+        g_object_unref (private->exported_file);
+
+      private->exported_file = file;
 
-  g_object_set_data_full (G_OBJECT (image),
-                          GIMP_FILE_EXPORT_URI_KEY,
-                          g_strdup (uri), (GDestroyNotify) g_free);
+      if (private->exported_file)
+        g_object_ref (private->exported_file);
 
-  gimp_object_name_changed (GIMP_OBJECT (image));
+      gimp_object_name_changed (GIMP_OBJECT (image));
+    }
 }
 
 /**
- * gimp_image_set_save_a_copy_uri:
+ * gimp_image_set_save_a_copy_file:
  * @image: A #GimpImage.
  * @uri:
  *
@@ -2020,32 +2053,41 @@ gimp_image_set_exported_uri (GimpImage   *image,
  * "save a copy" action.
  **/
 void
-gimp_image_set_save_a_copy_uri (GimpImage   *image,
-                                const gchar *uri)
+gimp_image_set_save_a_copy_file (GimpImage *image,
+                                 GFile     *file)
 {
+  GimpImagePrivate *private;
+
   g_return_if_fail (GIMP_IS_IMAGE (image));
+  g_return_if_fail (file == NULL || G_IS_FILE (file));
 
-  if (gimp_image_get_save_a_copy_uri (image) == uri)
-    return;
+  private = GIMP_IMAGE_GET_PRIVATE (image);
+
+  if (private->save_a_copy_file != file)
+    {
+      if (private->save_a_copy_file)
+        g_object_unref (private->save_a_copy_file);
+
+      private->save_a_copy_file = file;
 
-  g_object_set_data_full (G_OBJECT (image),
-                          GIMP_FILE_SAVE_A_COPY_URI_KEY,
-                          g_strdup (uri), (GDestroyNotify) g_free);
+      if (private->save_a_copy_file)
+        g_object_ref (private->save_a_copy_file);
+    }
 }
 
 gchar *
 gimp_image_get_filename (const GimpImage *image)
 {
-  const gchar *uri;
+  GFile *file;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  uri = gimp_image_get_uri (image);
+  file = gimp_image_get_file (image);
 
-  if (! uri)
+  if (! file)
     return NULL;
 
-  return g_filename_from_uri (uri, NULL, NULL);
+  return g_file_get_path (file);
 }
 
 static gchar *
@@ -2054,9 +2096,10 @@ gimp_image_format_display_uri (GimpImage *image,
 {
   const gchar *uri_format    = NULL;
   const gchar *export_status = NULL;
-  const gchar *uri;
-  const gchar *source;
-  const gchar *dest;
+  GFile       *file          = NULL;
+  GFile       *source        = NULL;
+  GFile       *dest          = NULL;
+  GFile       *display_file  = NULL;
   gboolean     is_imported;
   gboolean     is_exported;
   gchar       *display_uri   = NULL;
@@ -2065,29 +2108,29 @@ gimp_image_format_display_uri (GimpImage *image,
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  uri    = gimp_image_get_uri (image);
-  source = gimp_image_get_imported_uri (image);
-  dest   = gimp_image_get_exported_uri (image);
+  file   = gimp_image_get_file (image);
+  source = gimp_image_get_imported_file (image);
+  dest   = gimp_image_get_exported_file (image);
 
   is_imported = (source != NULL);
   is_exported = (dest   != NULL);
 
-  if (uri)
+  if (file)
     {
-      display_uri = g_strdup (uri);
-      uri_format  = "%s";
+      display_file = g_object_ref (file);
+      uri_format   = "%s";
     }
   else
     {
       if (is_imported)
-        display_uri = g_strdup (source);
+        display_file = source;
 
       /* Calculate filename suffix */
       if (! gimp_image_is_export_dirty (image))
         {
           if (is_exported)
             {
-              display_uri   = g_strdup (dest);
+              display_file  = dest;
               export_status = _(" (exported)");
             }
           else if (is_imported)
@@ -2104,32 +2147,21 @@ gimp_image_format_display_uri (GimpImage *image,
           export_status = _(" (imported)");
         }
 
-      if (display_uri)
-        {
-          gchar *tmp = file_utils_uri_with_new_ext (display_uri, NULL);
-          g_free (display_uri);
-          display_uri = tmp;
-        }
+      if (display_file)
+        display_file = file_utils_file_with_new_ext (display_file, NULL);
 
       uri_format = "[%s]";
     }
 
-  if (! display_uri)
-    {
-      display_uri = g_strdup (gimp_image_get_string_untitled ());
-    }
-  else if (basename)
-    {
-      tmp = file_utils_uri_display_basename (display_uri);
-      g_free (display_uri);
-      display_uri = tmp;
-    }
+  if (! display_file)
+    display_file = g_file_new_for_uri (gimp_image_get_string_untitled ());
+
+  if (basename)
+    display_uri = g_path_get_basename (gimp_file_get_utf8_name (display_file));
   else
-    {
-      tmp = file_utils_uri_display_name (display_uri);
-      g_free (display_uri);
-      display_uri = tmp;
-    }
+    display_uri = g_strdup (gimp_file_get_utf8_name (display_file));
+
+  g_object_unref (display_file);
 
   format_string = g_strconcat (uri_format, export_status, NULL);
 
@@ -3015,37 +3047,37 @@ gimp_image_get_dirty_time (const GimpImage *image)
 /**
  * gimp_image_saved:
  * @image:
- * @uri:
+ * @file:
  *
  * Emits the "saved" signal, indicating that @image was saved to the
- * location specified by @uri.
+ * location specified by @file.
  */
 void
-gimp_image_saved (GimpImage   *image,
-                  const gchar *uri)
+gimp_image_saved (GimpImage *image,
+                  GFile     *file)
 {
   g_return_if_fail (GIMP_IS_IMAGE (image));
-  g_return_if_fail (uri != NULL);
+  g_return_if_fail (G_IS_FILE (file));
 
-  g_signal_emit (image, gimp_image_signals[SAVED], 0, uri);
+  g_signal_emit (image, gimp_image_signals[SAVED], 0, file);
 }
 
 /**
  * gimp_image_exported:
  * @image:
- * @uri:
+ * @file:
  *
  * Emits the "exported" signal, indicating that @image was exported to the
- * location specified by @uri.
+ * location specified by @file.
  */
 void
-gimp_image_exported (GimpImage   *image,
-                     const gchar *uri)
+gimp_image_exported (GimpImage *image,
+                     GFile     *file)
 {
   g_return_if_fail (GIMP_IS_IMAGE (image));
-  g_return_if_fail (uri != NULL);
+  g_return_if_fail (G_IS_FILE (file));
 
-  g_signal_emit (image, gimp_image_signals[EXPORTED], 0, uri);
+  g_signal_emit (image, gimp_image_signals[EXPORTED], 0, file);
 }
 
 
diff --git a/app/core/gimpimage.h b/app/core/gimpimage.h
index bc0900f..87c8532 100644
--- a/app/core/gimpimage.h
+++ b/app/core/gimpimage.h
@@ -74,9 +74,9 @@ struct _GimpImageClass
   void (* dirty)                        (GimpImage            *image,
                                          GimpDirtyMask         dirty_mask);
   void (* saved)                        (GimpImage            *image,
-                                         const gchar          *uri);
+                                         GFile                *file);
   void (* exported)                     (GimpImage            *image,
-                                         const gchar          *uri);
+                                         GFile                *file);
 
   void (* guide_added)                  (GimpImage            *image,
                                          GimpGuide            *guide);
@@ -132,21 +132,21 @@ gint            gimp_image_get_ID                (const GimpImage    *image);
 GimpImage     * gimp_image_get_by_ID             (Gimp               *gimp,
                                                   gint                id);
 
-const gchar   * gimp_image_get_uri               (const GimpImage    *image);
+GFile         * gimp_image_get_file              (const GimpImage    *image);
 const gchar   * gimp_image_get_uri_or_untitled   (const GimpImage    *image);
-const gchar   * gimp_image_get_imported_uri      (const GimpImage    *image);
-const gchar   * gimp_image_get_exported_uri      (const GimpImage    *image);
-const gchar   * gimp_image_get_save_a_copy_uri   (const GimpImage    *image);
-const gchar   * gimp_image_get_any_uri           (const GimpImage    *image);
-
-void            gimp_image_set_uri               (GimpImage          *image,
-                                                  const gchar        *uri);
-void            gimp_image_set_imported_uri      (GimpImage          *image,
-                                                  const gchar        *uri);
-void            gimp_image_set_exported_uri      (GimpImage          *image,
-                                                  const gchar        *uri);
-void            gimp_image_set_save_a_copy_uri   (GimpImage          *image,
-                                                  const gchar        *uri);
+GFile         * gimp_image_get_imported_file      (const GimpImage    *image);
+GFile         * gimp_image_get_exported_file     (const GimpImage    *image);
+GFile         * gimp_image_get_save_a_copy_file  (const GimpImage    *image);
+GFile         * gimp_image_get_any_file          (const GimpImage    *image);
+
+void            gimp_image_set_file              (GimpImage          *image,
+                                                  GFile              *file);
+void            gimp_image_set_imported_file     (GimpImage          *image,
+                                                  GFile              *file);
+void            gimp_image_set_exported_file     (GimpImage          *image,
+                                                  GFile              *file);
+void            gimp_image_set_save_a_copy_file  (GimpImage          *image,
+                                                  GFile              *file);
 
 void            gimp_image_set_filename          (GimpImage          *image,
                                                   const gchar        *filename);
@@ -162,12 +162,12 @@ void            gimp_image_set_save_proc         (GimpImage          *image,
                                                   GimpPlugInProcedure *proc);
 GimpPlugInProcedure * gimp_image_get_save_proc   (const GimpImage    *image);
 void            gimp_image_saved                 (GimpImage          *image,
-                                                  const gchar        *uri);
+                                                  GFile              *file);
 void            gimp_image_set_export_proc       (GimpImage          *image,
                                                   GimpPlugInProcedure *proc);
 GimpPlugInProcedure * gimp_image_get_export_proc (const GimpImage    *image);
 void            gimp_image_exported              (GimpImage          *image,
-                                                  const gchar        *uri);
+                                                  GFile              *file);
 
 void            gimp_image_set_resolution        (GimpImage          *image,
                                                   gdouble             xres,
diff --git a/app/dialogs/file-save-dialog.c b/app/dialogs/file-save-dialog.c
index 416aa44..fcb23bb 100644
--- a/app/dialogs/file-save-dialog.c
+++ b/app/dialogs/file-save-dialog.c
@@ -214,11 +214,7 @@ file_save_dialog_response (GtkWidget *save_dialog,
            * file_save()
            */
           if (dialog->save_a_copy)
-            {
-              gchar *uri = g_file_get_uri (file);
-              gimp_image_set_save_a_copy_uri (dialog->image, uri);
-              g_free (uri);
-            }
+            gimp_image_set_save_a_copy_file (dialog->image, file);
 
           if (! dialog->export)
             g_object_set_data_full (G_OBJECT (dialog->image->gimp),
diff --git a/app/dialogs/quit-dialog.c b/app/dialogs/quit-dialog.c
index 10fdde0..b861421 100644
--- a/app/dialogs/quit-dialog.c
+++ b/app/dialogs/quit-dialog.c
@@ -22,6 +22,7 @@
 #include <gegl.h>
 #include <gtk/gtk.h>
 
+#include "libgimpbase/gimpbase.h"
 #include "libgimpwidgets/gimpwidgets.h"
 
 #include "dialogs-types.h"
@@ -403,24 +404,22 @@ quit_close_all_dialog_name_cell_func (GtkTreeViewColumn *tree_column,
     }
   else
     {
-      const gchar *uri;
-      gchar       *filename;
+      GFile       *file;
+      const gchar *filename;
       gchar       *escaped_name;
       gchar       *escaped_filename;
       gchar       *exported;
       gchar       *markup;
 
-      uri = gimp_image_get_exported_uri (image);
-      if (! uri)
-        uri = gimp_image_get_imported_uri (image);
+      file = gimp_image_get_exported_file (image);
+      if (! file)
+        file = gimp_image_get_imported_file (image);
 
-      filename = file_utils_uri_to_utf8_filename (uri);
+      filename = gimp_file_get_utf8_name (file);
 
       escaped_name     = g_markup_escape_text (name, -1);
       escaped_filename = g_markup_escape_text (filename, -1);
 
-      g_free (filename);
-
       exported = g_strdup_printf (_("Exported to %s"), escaped_filename);
       markup = g_strdup_printf ("%s\n<i>%s</i>", escaped_name, exported);
       g_free (exported);
diff --git a/app/display/gimpdisplayshell-close.c b/app/display/gimpdisplayshell-close.c
index aa51239..effaf79 100644
--- a/app/display/gimpdisplayshell-close.c
+++ b/app/display/gimpdisplayshell-close.c
@@ -22,6 +22,7 @@
 #include <gegl.h>
 #include <gtk/gtk.h>
 
+#include "libgimpbase/gimpbase.h"
 #include "libgimpwidgets/gimpwidgets.h"
 
 #include "display-types.h"
@@ -56,7 +57,7 @@ static void      gimp_display_shell_close_dialog       (GimpDisplayShell *shell,
 static void      gimp_display_shell_close_name_changed (GimpImage        *image,
                                                         GimpMessageBox   *box);
 static void      gimp_display_shell_close_exported     (GimpImage        *image,
-                                                        const gchar      *uri,
+                                                        GFile            *file,
                                                         GimpMessageBox   *box);
 static gboolean  gimp_display_shell_close_time_changed (GimpMessageBox   *box);
 static void      gimp_display_shell_close_response     (GtkWidget        *widget,
@@ -156,7 +157,7 @@ gimp_display_shell_close_dialog (GimpDisplayShell *shell,
   gchar           *accel_string;
   gchar           *hint;
   gchar           *markup;
-  const gchar     *uri;
+  GFile           *file;
 
   if (shell->close_dialog)
     {
@@ -164,7 +165,7 @@ gimp_display_shell_close_dialog (GimpDisplayShell *shell,
       return;
     }
 
-  uri = gimp_image_get_uri (image);
+  file = gimp_image_get_file (image);
 
   title = g_strdup_printf (_("Close %s"), gimp_image_get_display_name (image));
 
@@ -179,7 +180,7 @@ gimp_display_shell_close_dialog (GimpDisplayShell *shell,
   gtk_dialog_add_buttons (GTK_DIALOG (dialog),
                           _("_Discard Changes"), GTK_RESPONSE_CLOSE,
                           GTK_STOCK_CANCEL,      GTK_RESPONSE_CANCEL,
-                          (uri ?
+                          (file ?
                            GTK_STOCK_SAVE :
                            GTK_STOCK_SAVE_AS),   RESPONSE_SAVE,
                           NULL);
@@ -281,7 +282,7 @@ gimp_display_shell_close_name_changed (GimpImage      *image,
 
 static void
 gimp_display_shell_close_exported (GimpImage      *image,
-                                   const gchar    *uri,
+                                   GFile          *file,
                                    GimpMessageBox *box)
 {
   gimp_display_shell_close_time_changed (box);
@@ -342,19 +343,14 @@ gimp_display_shell_close_time_changed (GimpMessageBox *box)
 
   if (! gimp_image_is_export_dirty (image))
     {
-      const gchar *uri;
-      gchar       *filename;
+      GFile *file;
 
-      uri = gimp_image_get_exported_uri (image);
-      if (! uri)
-        uri = gimp_image_get_imported_uri (image);
-
-      filename = file_utils_uri_to_utf8_filename (uri);
+      file = gimp_image_get_exported_file (image);
+      if (! file)
+        file = gimp_image_get_imported_file (image);
 
       export_text = g_strdup_printf (_("The image has been exported to '%s'."),
-                                     filename);
-
-      g_free (filename);
+                                     gimp_file_get_utf8_name (file));
     }
 
   if (time_text && export_text)
diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c
index 44cf989..6f11d3b 100644
--- a/app/display/gimpdisplayshell-handlers.c
+++ b/app/display/gimpdisplayshell-handlers.c
@@ -20,6 +20,7 @@
 #include <gegl.h>
 #include <gtk/gtk.h>
 
+#include "libgimpbase/gimpbase.h"
 #include "libgimpcolor/gimpcolor.h"
 #include "libgimpmath/gimpmath.h"
 #include "libgimpwidgets/gimpwidgets.h"
@@ -43,8 +44,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "file/file-utils.h"
-
 #include "widgets/gimpwidgets-utils.h"
 
 #include "gimpcanvasguide.h"
@@ -120,10 +119,10 @@ static void   gimp_display_shell_invalidate_preview_handler (GimpImage        *i
 static void   gimp_display_shell_profile_changed_handler    (GimpColorManaged *image,
                                                              GimpDisplayShell *shell);
 static void   gimp_display_shell_saved_handler              (GimpImage        *image,
-                                                             const gchar      *uri,
+                                                             GFile            *file,
                                                              GimpDisplayShell *shell);
 static void   gimp_display_shell_exported_handler           (GimpImage        *image,
-                                                             const gchar      *uri,
+                                                             GFile            *file,
                                                              GimpDisplayShell *shell);
 
 static void   gimp_display_shell_active_vectors_handler     (GimpImage        *image,
@@ -786,30 +785,26 @@ gimp_display_shell_profile_changed_handler (GimpColorManaged *image,
 
 static void
 gimp_display_shell_saved_handler (GimpImage        *image,
-                                  const gchar      *uri,
+                                  GFile            *file,
                                   GimpDisplayShell *shell)
 {
   GimpStatusbar *statusbar = gimp_display_shell_get_statusbar (shell);
-  gchar         *filename  = file_utils_uri_display_name (uri);
 
   gimp_statusbar_push_temp (statusbar, GIMP_MESSAGE_INFO,
                             "document-save", _("Image saved to '%s'"),
-                            filename);
-  g_free (filename);
+                            gimp_file_get_utf8_name (file));
 }
 
 static void
 gimp_display_shell_exported_handler (GimpImage        *image,
-                                     const gchar      *uri,
+                                     GFile            *file,
                                      GimpDisplayShell *shell)
 {
   GimpStatusbar *statusbar = gimp_display_shell_get_statusbar (shell);
-  gchar         *filename  = file_utils_uri_display_name (uri);
 
   gimp_statusbar_push_temp (statusbar, GIMP_MESSAGE_INFO,
                             "document-save", _("Image exported to '%s'"),
-                            filename);
-  g_free (filename);
+                            gimp_file_get_utf8_name (file));
 }
 
 static void
diff --git a/app/file/file-open.c b/app/file/file-open.c
index 09f875c..0a1150d 100644
--- a/app/file/file-open.c
+++ b/app/file/file-open.c
@@ -209,12 +209,10 @@ file_open_image (Gimp                *gimp,
       if (file_open_file_proc_is_import (file_proc))
         {
           /* Remember the import source */
-          gchar *uri = g_file_get_uri (file);
-          gimp_image_set_imported_uri (image, uri);
-          g_free (uri);
+          gimp_image_set_imported_file (image, file);
 
           /* We shall treat this file as an Untitled file */
-          gimp_image_set_uri (image, NULL);
+          gimp_image_set_file (image, NULL);
         }
     }
 
@@ -493,8 +491,7 @@ file_open_with_proc_and_display (Gimp                *gimp,
         {
           GimpDocumentList *documents = GIMP_DOCUMENT_LIST (gimp->documents);
           GimpImagefile    *imagefile;
-          const gchar      *any_uri;
-          gchar            *uri;
+          GFile            *any_file;
 
           imagefile = gimp_document_list_add_file (documents, file, mime_type);
 
@@ -502,10 +499,9 @@ file_open_with_proc_and_display (Gimp                *gimp,
            *  resulting image's uri match. Use any_uri() here so we
            *  create thumbnails for both XCF and imported images.
            */
-          any_uri = gimp_image_get_any_uri (image);
-          uri     = g_file_get_uri (file);
+          any_file = gimp_image_get_any_file (image);
 
-          if (any_uri && ! strcmp (uri, any_uri))
+          if (any_file && g_file_equal (file, any_file))
             {
               /*  no need to save a thumbnail if there's a good one already  */
               if (! gimp_imagefile_check_thumbnail (imagefile))
@@ -514,8 +510,6 @@ file_open_with_proc_and_display (Gimp                *gimp,
                                                  NULL);
                 }
             }
-
-          g_free (uri);
         }
 
       /*  announce that we opened this image  */
@@ -668,7 +662,7 @@ file_open_sanitize_image (GimpImage *image,
                           gboolean   as_new)
 {
   if (as_new)
-    gimp_image_set_uri (image, NULL);
+    gimp_image_set_file (image, NULL);
 
   /* clear all undo steps */
   gimp_image_undo_free (image);
diff --git a/app/file/file-save.c b/app/file/file-save.c
index bfc52c6..f578805 100644
--- a/app/file/file-save.c
+++ b/app/file/file-save.c
@@ -158,14 +158,14 @@ file_save (Gimp                *gimp,
 
       if (change_saved_state)
         {
-          gimp_image_set_uri (image, uri);
+          gimp_image_set_file (image, file);
           gimp_image_set_save_proc (image, file_proc);
 
           /* Forget the import source when we save. We interpret a
            * save as that the user is not interested in being able
            * to quickly export back to the original any longer
            */
-          gimp_image_set_imported_uri (image, NULL);
+          gimp_image_set_imported_file (image, NULL);
 
           gimp_image_clean_all (image);
         }
@@ -186,22 +186,22 @@ file_save (Gimp                *gimp,
            * happens implicitly when saving since the GimpObject name
            * of a GimpImage is the last-save URI
            */
-          gimp_image_set_exported_uri (image, uri);
+          gimp_image_set_exported_file (image, file);
           gimp_image_set_export_proc (image, file_proc);
 
           /* An image can not be considered both exported and imported
            * at the same time, so stop consider it as imported now
            * that we consider it exported.
            */
-          gimp_image_set_imported_uri (image, NULL);
+          gimp_image_set_imported_file (image, NULL);
 
           gimp_image_export_clean_all (image);
         }
 
       if (export_backward || export_forward)
-        gimp_image_exported (image, uri);
+        gimp_image_exported (image, file);
       else
-        gimp_image_saved (image, uri);
+        gimp_image_saved (image, file);
 
       documents = GIMP_DOCUMENT_LIST (image->gimp->documents);
 
diff --git a/app/file/file-utils.c b/app/file/file-utils.c
index 3095a43..25b2c4d 100644
--- a/app/file/file-utils.c
+++ b/app/file/file-utils.c
@@ -214,15 +214,39 @@ file_utils_filename_from_uri (const gchar *uri)
   return filename;
 }
 
-gchar *
-file_utils_uri_with_new_ext (const gchar *uri,
-                             const gchar *ext_uri)
+GFile *
+file_utils_file_with_new_ext (GFile *file,
+                              GFile *ext_file)
 {
-  const gchar *uri_ext      = file_utils_uri_get_ext (uri);
-  const gchar *ext_uri_ext  = ext_uri ? file_utils_uri_get_ext (ext_uri) : NULL;
-  gchar *uri_without_ext    = g_strndup (uri, uri_ext - uri);
-  gchar *ret                = g_strconcat (uri_without_ext, ext_uri_ext, NULL);
+  gchar       *uri;
+  const gchar *uri_ext;
+  gchar       *ext_uri     = NULL;
+  const gchar *ext_uri_ext = NULL;
+  gchar       *uri_without_ext;
+  gchar       *new_uri;
+  GFile       *ret;
+
+  g_return_val_if_fail (G_IS_FILE (file), NULL);
+  g_return_val_if_fail (ext_file == NULL || G_IS_FILE (ext_file), NULL);
+
+  uri     = g_file_get_uri (file);
+  uri_ext = file_utils_uri_get_ext (uri);
+
+  if (ext_uri)
+    {
+      ext_uri     = g_file_get_uri (ext_file);
+      ext_uri_ext = file_utils_uri_get_ext (ext_uri);
+    }
+
+  uri_without_ext = g_strndup (uri, uri_ext - uri);
+
+  new_uri = g_strconcat (uri_without_ext, ext_uri_ext, NULL);
+
+  ret = g_file_new_for_uri (new_uri);
+
   g_free (uri_without_ext);
+  g_free (new_uri);
+
   return ret;
 }
 
@@ -428,36 +452,31 @@ gboolean
 file_utils_save_thumbnail (GimpImage   *image,
                            const gchar *filename)
 {
-  const gchar *image_uri;
-  gboolean     success = FALSE;
+  GFile    *file;
+  gboolean  success = FALSE;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
   g_return_val_if_fail (filename != NULL, FALSE);
 
-  image_uri = gimp_image_get_uri (image);
+  file = gimp_image_get_file (image);
 
-  if (image_uri)
+  if (file)
     {
-      gchar *uri = g_filename_to_uri (filename, NULL, NULL);
+      gchar *image_uri = g_file_get_uri (file);
+      gchar *uri       = g_filename_to_uri (filename, NULL, NULL);
 
-      if (uri)
+      if (uri && image_uri && ! strcmp (uri, image_uri))
         {
-          if ( ! strcmp (uri, image_uri))
-            {
-              GimpImagefile *imagefile;
-              GFile         *file;
+          GimpImagefile *imagefile;
 
-              file = g_file_new_for_uri (uri);
-              imagefile = gimp_imagefile_new (image->gimp, file);
-              g_object_unref (file);
-
-              success = gimp_imagefile_save_thumbnail (imagefile, NULL, image,
-                                                       NULL);
-              g_object_unref (imagefile);
-            }
-
-          g_free (uri);
+          imagefile = gimp_imagefile_new (image->gimp, file);
+          success = gimp_imagefile_save_thumbnail (imagefile, NULL, image,
+                                                   NULL);
+          g_object_unref (imagefile);
         }
+
+      g_free (image_uri);
+      g_free (uri);
     }
 
   return success;
diff --git a/app/file/file-utils.h b/app/file/file-utils.h
index 0d9ac42..b501c09 100644
--- a/app/file/file-utils.h
+++ b/app/file/file-utils.h
@@ -28,8 +28,8 @@ gchar       * file_utils_filename_to_uri      (Gimp          *gimp,
                                                GError       **error);
 gchar       * file_utils_filename_from_uri    (const gchar   *uri);
 gchar       * file_utils_filename_from_file   (GFile         *file);
-gchar       * file_utils_uri_with_new_ext     (const gchar   *uri,
-                                               const gchar   *uri_with_ext);
+GFile       * file_utils_file_with_new_ext    (GFile         *file,
+                                               GFile         *ext_file);
 const gchar * file_utils_uri_get_ext          (const gchar   *uri);
 
 gchar       * file_utils_uri_to_utf8_filename (const gchar   *uri);
diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c
index f30a256..4f0df9d 100644
--- a/app/pdb/image-cmds.c
+++ b/app/pdb/image-cmds.c
@@ -2250,9 +2250,9 @@ image_get_filename_invoker (GimpProcedure         *procedure,
 
   if (success)
     {
-      const gchar *uri = gimp_image_get_any_uri (image);
-      if (uri)
-        filename = g_filename_from_uri (uri, NULL, NULL);
+      GFile *file = gimp_image_get_any_file (image);
+      if (file)
+        filename = g_file_get_path (file);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -2323,7 +2323,9 @@ image_get_uri_invoker (GimpProcedure         *procedure,
 
   if (success)
     {
-      uri = g_strdup (gimp_image_get_any_uri (image));
+      GFile *file = gimp_image_get_any_file (image);
+      if (file)
+        uri = g_file_get_uri (file);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -2352,7 +2354,9 @@ image_get_xcf_uri_invoker (GimpProcedure         *procedure,
 
   if (success)
     {
-      uri = g_strdup (gimp_image_get_uri (image));
+      GFile *file = gimp_image_get_file (image);
+      if (file)
+        uri = g_file_get_uri (file);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -2381,7 +2385,9 @@ image_get_imported_uri_invoker (GimpProcedure         *procedure,
 
   if (success)
     {
-      uri = g_strdup (gimp_image_get_imported_uri (image));
+      GFile *file = gimp_image_get_imported_file (image);
+      if (file)
+        uri = g_file_get_uri (file);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -2410,7 +2416,9 @@ image_get_exported_uri_invoker (GimpProcedure         *procedure,
 
   if (success)
     {
-      uri = g_strdup (gimp_image_get_exported_uri (image));
+      GFile *file = gimp_image_get_exported_file (image);
+      if (file)
+        uri = g_file_get_uri (file);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
diff --git a/app/widgets/gimpfiledialog.c b/app/widgets/gimpfiledialog.c
index 3d92540..9c355ec 100644
--- a/app/widgets/gimpfiledialog.c
+++ b/app/widgets/gimpfiledialog.c
@@ -123,9 +123,7 @@ static void     gimp_file_dialog_help_clicked           (GtkWidget        *widge
                                                          gpointer          dialog);
 
 static gchar  * gimp_file_dialog_pattern_from_extension (const gchar   *extension);
-static gchar  * gimp_file_dialog_get_default_uri        (Gimp          *gimp);
-static gchar  * gimp_file_dialog_get_dirname_from_uri   (const gchar   *uri);
-
+static GFile  * gimp_file_dialog_get_default_file       (Gimp          *gimp);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpFileDialog, gimp_file_dialog,
@@ -489,17 +487,17 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
                                  gboolean        close_after_saving,
                                  GimpObject     *display)
 {
-  const gchar *dir_uri     = NULL;
-  const gchar *name_uri    = NULL;
-  const gchar *ext_uri     = NULL;
-  gchar       *default_uri = NULL;
-  gchar       *dirname     = NULL;
-  gchar       *basename    = NULL;
+  GFile *dir_file  = NULL;
+  GFile *name_file = NULL;
+  GFile *ext_file  = NULL;
+  GFile *default_file;
+  GFile *parent_file;
+  gchar *basename;
 
   g_return_if_fail (GIMP_IS_FILE_DIALOG (dialog));
   g_return_if_fail (GIMP_IS_IMAGE (image));
 
-  default_uri = gimp_file_dialog_get_default_uri (gimp);
+  default_file = gimp_file_dialog_get_default_file (gimp);
 
   dialog->image              = image;
   dialog->save_a_copy        = save_a_copy;
@@ -523,28 +521,24 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
        */
 
       if (save_a_copy)
-        dir_uri = gimp_image_get_save_a_copy_uri (image);
+        dir_file = gimp_image_get_save_a_copy_file (image);
 
-      if (! dir_uri)
-        dir_uri = gimp_image_get_uri (image);
+      if (! dir_file)
+        dir_file = gimp_image_get_file (image);
 
-      if (! dir_uri)
-        dir_uri = g_object_get_data (G_OBJECT (image),
-                                     "gimp-image-source-uri");
+      if (! dir_file)
+        dir_file = g_object_get_data (G_OBJECT (image),
+                                      "gimp-image-source-file");
 
-      if (! dir_uri)
-        dir_uri = gimp_image_get_imported_uri (image);
+      if (! dir_file)
+        dir_file = gimp_image_get_imported_file (image);
 
-      if (! dir_uri)
-        {
-          GFile *file = g_object_get_data (G_OBJECT (gimp),
-                                           GIMP_FILE_SAVE_LAST_FILE_KEY);
-          if (file)
-            dir_uri = g_file_get_uri (file); /* FIXME leak */
-        }
+      if (! dir_file)
+        dir_file = g_object_get_data (G_OBJECT (gimp),
+                                      GIMP_FILE_SAVE_LAST_FILE_KEY);
 
-      if (! dir_uri)
-        dir_uri = default_uri;
+      if (! dir_file)
+        dir_file = default_file;
 
 
       /* Priority of default basenames for Save:
@@ -557,19 +551,20 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
        */
 
       if (save_a_copy)
-        name_uri = gimp_image_get_save_a_copy_uri (image);
+        name_file = gimp_image_get_save_a_copy_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_uri (image);
+      if (! name_file)
+        name_file = gimp_image_get_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_exported_uri (image);
+      if (! name_file)
+        name_file = gimp_image_get_exported_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_imported_uri (image);
+      if (! name_file)
+        name_file = gimp_image_get_imported_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_string_untitled ();
+      if (! name_file)
+        /* XXX leak */
+        name_file = g_file_new_for_uri (gimp_image_get_string_untitled ());
 
 
       /* Priority of default type/extension for Save:
@@ -577,10 +572,10 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
        *   1. Type of last Save
        *   2. .xcf (which we don't explicitly append)
        */
-      ext_uri = gimp_image_get_uri (image);
+      ext_file = gimp_image_get_file (image);
 
-      if (! ext_uri)
-        ext_uri = "file:///we/only/care/about/extension.xcf";
+      if (! ext_file)
+        ext_file = g_file_new_for_uri ("file:///we/only/care/about/extension.xcf");
     }
   else /* if (export) */
     {
@@ -595,36 +590,28 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
        *   6. The default path (usually the OS 'Documents' path)
        */
 
-      dir_uri = gimp_image_get_exported_uri (image);
+      dir_file = gimp_image_get_exported_file (image);
 
-      if (! dir_uri)
-        dir_uri = g_object_get_data (G_OBJECT (image),
-                                     "gimp-image-source-uri");
+      if (! dir_file)
+        dir_file = g_object_get_data (G_OBJECT (image),
+                                      "gimp-image-source-file");
 
-      if (! dir_uri)
-        dir_uri = gimp_image_get_imported_uri (image);
+      if (! dir_file)
+        dir_file = gimp_image_get_imported_file (image);
 
-      if (! dir_uri)
-        dir_uri = gimp_image_get_uri (image);
+      if (! dir_file)
+        dir_file = gimp_image_get_file (image);
 
-      if (! dir_uri)
-        {
-          GFile *file = g_object_get_data (G_OBJECT (gimp),
-                                           GIMP_FILE_SAVE_LAST_FILE_KEY);
-          if (file)
-            dir_uri = g_file_get_uri (file); /* XXX fixme leak */
-        }
+      if (! dir_file)
+        dir_file = g_object_get_data (G_OBJECT (gimp),
+                                      GIMP_FILE_SAVE_LAST_FILE_KEY);
 
-      if (! dir_uri)
-        {
-          GFile *file = g_object_get_data (G_OBJECT (gimp),
-                                           GIMP_FILE_EXPORT_LAST_FILE_KEY);
-          if (file)
-            dir_uri = g_file_get_uri (file); /* XXX fixme leak */
-        }
+      if (! dir_file)
+        dir_file = g_object_get_data (G_OBJECT (gimp),
+                                      GIMP_FILE_EXPORT_LAST_FILE_KEY);
 
-      if (! dir_uri)
-        dir_uri = default_uri;
+      if (! dir_file)
+        dir_file = default_file;
 
 
       /* Priority of default basenames for Export:
@@ -635,16 +622,17 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
        *   3. 'Untitled'
        */
 
-      name_uri = gimp_image_get_exported_uri (image);
+      name_file = gimp_image_get_exported_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_uri (image);
+      if (! name_file)
+        name_file = gimp_image_get_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_imported_uri (image);
+      if (! name_file)
+        name_file = gimp_image_get_imported_file (image);
 
-      if (! name_uri)
-        name_uri = gimp_image_get_string_untitled ();
+      if (! name_file)
+        /* XXX leak */
+        name_file = g_file_new_for_uri (gimp_image_get_string_untitled ());
 
 
       /* Priority of default type/extension for Export:
@@ -654,43 +642,36 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
        *   3. Type of latest Export of any document
        *   4. .png
        */
-      ext_uri = gimp_image_get_exported_uri (image);
+      ext_file = gimp_image_get_exported_file (image);
 
-      if (! ext_uri)
-        ext_uri = gimp_image_get_imported_uri (image);
+      if (! ext_file)
+        ext_file = gimp_image_get_imported_file (image);
 
-      if (! ext_uri)
-        {
-          GFile *file = g_object_get_data (G_OBJECT (gimp),
-                                           GIMP_FILE_EXPORT_LAST_FILE_KEY);
-          if (file)
-            ext_uri = g_file_get_uri (file); /* XXX fixme leak */
-        }
+      if (! ext_file)
+        ext_file = g_object_get_data (G_OBJECT (gimp),
+                                      GIMP_FILE_EXPORT_LAST_FILE_KEY);
 
-      if (! ext_uri)
-        ext_uri = "file:///we/only/care/about/extension.png";
+      if (! ext_file)
+        ext_file = g_file_new_for_uri ("file:///we/only/care/about/extension.png");
     }
 
-  dirname = gimp_file_dialog_get_dirname_from_uri (dir_uri);
-
-  if (ext_uri)
+  if (ext_file)
     {
-      gchar *uri_new_ext = file_utils_uri_with_new_ext (name_uri,
-                                                        ext_uri);
-      basename = file_utils_uri_display_basename (uri_new_ext);
-      g_free (uri_new_ext);
+      GFile *tmp_file = file_utils_file_with_new_ext (name_file, ext_file);
+      basename = g_path_get_basename (gimp_file_get_utf8_name (tmp_file));
+      g_object_unref (tmp_file);
     }
   else
     {
-      basename = file_utils_uri_display_basename (name_uri);
+      basename = g_path_get_basename (gimp_file_get_utf8_name (name_file));
     }
 
-  gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog), dirname);
-  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), basename);
+  parent_file = g_file_get_parent (dir_file);
+  gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (dialog),
+                                            parent_file, NULL);
+  g_object_unref (parent_file);
 
-  g_free (default_uri);
-  g_free (basename);
-  g_free (dirname);
+  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), basename);
 }
 
 GimpFileDialogState *
@@ -1158,91 +1139,34 @@ gimp_file_dialog_pattern_from_extension (const gchar *extension)
   return pattern;
 }
 
-static gchar *
-gimp_file_dialog_get_default_uri (Gimp *gimp)
+static GFile *
+gimp_file_dialog_get_default_file (Gimp *gimp)
 {
   if (gimp->default_folder)
     {
-      return g_strdup (gimp->default_folder);
+      return g_file_new_for_path (gimp->default_folder);
     }
   else
     {
+      GFile *file;
       gchar *path;
-      gchar *uri;
 
       /* Make sure it ends in '/' */
       path = g_build_path (G_DIR_SEPARATOR_S,
                            g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS),
                            G_DIR_SEPARATOR_S,
                            NULL);
-      uri = g_filename_to_uri (path, NULL, NULL);
-      g_free (path);
 
       /* Paranoia fallback, see bug #722400 */
-      if (! uri)
-        {
-          path = g_build_path (G_DIR_SEPARATOR_S,
-                               g_get_home_dir (),
-                               G_DIR_SEPARATOR_S,
-                               NULL);
-          uri = g_filename_to_uri (path, NULL, NULL);
-          g_free (path);
-        }
-
-      return uri;
-    }
-}
+      if (! path)
+        path = g_build_path (G_DIR_SEPARATOR_S,
+                             g_get_home_dir (),
+                             G_DIR_SEPARATOR_S,
+                             NULL);
 
-static gchar *
-gimp_file_dialog_get_dirname_from_uri (const gchar *uri)
-{
-  gchar *dirname = NULL;
-
-#ifndef G_OS_WIN32
-  dirname  = g_path_get_dirname (uri);
-#else
-  /* g_path_get_dirname() is supposed to work on pathnames, not URIs.
-   *
-   * If uri points to a file on the root of a drive
-   * "file:///d:/foo.png", g_path_get_dirname() would return
-   * "file:///d:". (What we really would want is "file:///d:/".) When
-   * this then is passed inside gtk+ to g_filename_from_uri() we get
-   * "d:" which is not an absolute pathname. This currently causes an
-   * assertion failure in gtk+. This scenario occurs if we have opened
-   * an image from the root of a drive and then do Save As.
-   *
-   * Of course, gtk+ shouldn't assert even if we feed it slightly bogus
-   * data, and that problem should be fixed, too. But to get the
-   * correct default current folder in the filechooser combo box, we
-   * need to pass it the proper URI for an absolute path anyway. So
-   * don't use g_path_get_dirname() on file: URIs.
-   */
-  if (g_str_has_prefix (uri, "file:///"))
-    {
-      gchar *filepath = g_filename_from_uri (uri, NULL, NULL);
-      gchar *dirpath  = NULL;
-
-      if (filepath != NULL)
-        {
-          dirpath = g_path_get_dirname (filepath);
-          g_free (filepath);
-        }
+      file = g_file_new_for_path (path);
+      g_free (path);
 
-      if (dirpath != NULL)
-        {
-          dirname = g_filename_to_uri (dirpath, NULL, NULL);
-          g_free (dirpath);
-        }
-      else
-        {
-          dirname = NULL;
-        }
+      return file;
     }
-  else
-    {
-      dirname = g_path_get_dirname (uri);
-    }
-#endif
-
-  return dirname;
 }
diff --git a/app/widgets/gimpimagepropview.c b/app/widgets/gimpimagepropview.c
index 711a208..974a14d 100644
--- a/app/widgets/gimpimagepropview.c
+++ b/app/widgets/gimpimagepropview.c
@@ -305,14 +305,12 @@ static void
 gimp_image_prop_view_label_set_filename (GtkWidget *label,
                                          GimpImage *image)
 {
-  const gchar *uri = gimp_image_get_any_uri (image);
+  GFile *file = gimp_image_get_any_file (image);
 
-  if (uri)
+  if (file)
     {
-      gchar *name = file_utils_uri_display_name (uri);
-
-      gtk_label_set_text (GTK_LABEL (label), name);
-      g_free (name);
+      gtk_label_set_text (GTK_LABEL (label),
+                          gimp_file_get_utf8_name (file));
     }
   else
     {
@@ -325,11 +323,7 @@ static void
 gimp_image_prop_view_label_set_filesize (GtkWidget *label,
                                          GimpImage *image)
 {
-  const gchar *uri  = gimp_image_get_any_uri (image);
-  GFile       *file = NULL;
-
-  if (uri)
-    file = g_file_new_for_uri (uri);
+  GFile *file = gimp_image_get_any_file (image);
 
   if (file)
     {
@@ -352,8 +346,6 @@ gimp_image_prop_view_label_set_filesize (GtkWidget *label,
         {
           gtk_label_set_text (GTK_LABEL (label), NULL);
         }
-
-      g_object_unref (file);
     }
   else
     {
@@ -375,16 +367,10 @@ gimp_image_prop_view_label_set_filetype (GtkWidget *label,
 
   if (! proc)
     {
-      const gchar *uri = gimp_image_get_uri (image);
+      GFile *file = gimp_image_get_file (image);
 
-      if (uri)
-        {
-          GFile *file;
-
-          file = g_file_new_for_uri (uri);
-          proc = file_procedure_find (manager->load_procs, file, NULL);
-          g_object_unref (file);
-        }
+      if (file)
+        proc = file_procedure_find (manager->load_procs, file, NULL);
     }
 
   gtk_label_set_text (GTK_LABEL (label),
diff --git a/tools/pdbgen/pdb/image.pdb b/tools/pdbgen/pdb/image.pdb
index a3f2b0a..f79c175 100644
--- a/tools/pdbgen/pdb/image.pdb
+++ b/tools/pdbgen/pdb/image.pdb
@@ -2245,9 +2245,9 @@ HELP
     %invoke = (
         code => <<'CODE'
 {
-  const gchar *uri = gimp_image_get_any_uri (image);
-  if (uri)
-    filename = g_filename_from_uri (uri, NULL, NULL);
+  GFile *file = gimp_image_get_any_file (image);
+  if (file)
+    filename = g_file_get_path (file);
 }
 CODE
     );
@@ -2325,7 +2325,9 @@ HELP
     %invoke = (
         code => <<'CODE'
 {
-  uri = g_strdup (gimp_image_get_any_uri (image));
+  GFile *file = gimp_image_get_any_file (image);
+  if (file)
+    uri = g_file_get_uri (file);
 }
 CODE
     );
@@ -2357,7 +2359,9 @@ HELP
     %invoke = (
         code => <<'CODE'
 {
-  uri = g_strdup (gimp_image_get_uri (image));
+  GFile *file = gimp_image_get_file (image);
+  if (file)
+    uri = g_file_get_uri (file);
 }
 CODE
     );
@@ -2391,7 +2395,9 @@ HELP
     %invoke = (
         code => <<'CODE'
 {
-  uri = g_strdup (gimp_image_get_imported_uri (image));
+  GFile *file = gimp_image_get_imported_file (image);
+  if (file)
+    uri = g_file_get_uri (file);
 }
 CODE
     );
@@ -2424,7 +2430,9 @@ HELP
     %invoke = (
         code => <<'CODE'
 {
-  uri = g_strdup (gimp_image_get_exported_uri (image));
+  GFile *file = gimp_image_get_exported_file (image);
+  if (file)
+    uri = g_file_get_uri (file);
 }
 CODE
     );


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