[nautilus] file-utilities: refactor ensure_unique_file_name



commit 8d9a036aa17e55561c75aee1edcbb7f76efaed14
Author: Razvan Chitu <razvan ch95 gmail com>
Date:   Sun Aug 21 00:49:22 2016 +0300

    file-utilities: refactor ensure_unique_file_name
    
    The function works with strings instead of GFiles. Replace it with a function
    that generates unique files in a directory using GFiles.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=768646

 src/nautilus-file-utilities.c |   74 +++++++++++++++++------------------------
 src/nautilus-file-utilities.h |    9 ++---
 src/nautilus-link.c           |   28 +++++----------
 3 files changed, 44 insertions(+), 67 deletions(-)
---
diff --git a/src/nautilus-file-utilities.c b/src/nautilus-file-utilities.c
index 14929aa..262f485 100644
--- a/src/nautilus-file-utilities.c
+++ b/src/nautilus-file-utilities.c
@@ -583,52 +583,40 @@ nautilus_get_mounted_mount_for_root (GFile *location)
        return result;
 }
 
-char *
-nautilus_ensure_unique_file_name (const char *directory_uri,
-                                 const char *base_name,
-                                 const char *extension)
+GFile *
+nautilus_generate_unique_file_in_directory (GFile      *directory,
+                                            const char *basename)
 {
-       GFileInfo *info;
-       char *filename;
-       GFile *dir, *child;
-       int copy;
-       char *res;
+        g_autofree char *basename_without_extension = NULL;
+        const char *extension;
+        GFile *child;
+        int copy;
 
-       dir = g_file_new_for_uri (directory_uri);
+        g_return_val_if_fail (directory != NULL, NULL);
+        g_return_val_if_fail (basename != NULL, NULL);
+        g_return_val_if_fail (g_file_query_exists (directory, NULL), NULL);
 
-       info = g_file_query_info (dir, G_FILE_ATTRIBUTE_STANDARD_TYPE, 0, NULL, NULL);
-       if (info == NULL) {
-               g_object_unref (dir);
-               return NULL;
-       }
-       g_object_unref (info);
+        basename_without_extension = eel_filename_strip_extension (basename);
+        extension = eel_filename_get_extension_offset (basename);
 
-       filename = g_strdup_printf ("%s%s",
-                                   base_name,
-                                   extension);
-       child = g_file_get_child (dir, filename);
-       g_free (filename);
-       
-       copy = 1;
-       while ((info = g_file_query_info (child, G_FILE_ATTRIBUTE_STANDARD_TYPE, 0, NULL, NULL)) != NULL) {
-               g_object_unref (info);
-               g_object_unref (child);
-               
-               filename = g_strdup_printf ("%s-%d%s",
-                                           base_name,
-                                           copy,
-                                           extension);
-               child = g_file_get_child (dir, filename);
-               g_free (filename);
-               
-               copy++;
-       }
+        child = g_file_get_child (directory, basename);
 
-       res = g_file_get_uri (child);
-       g_object_unref (child);
-       g_object_unref (dir);
-       
-       return res;
+        copy = 1;
+        while (g_file_query_exists (child, NULL)) {
+                g_autofree char *filename;
+
+                g_object_unref (child);
+
+                filename = g_strdup_printf ("%s (%d)%s",
+                                            basename_without_extension,
+                                            copy,
+                                            extension ? extension : "");
+                child = g_file_get_child (directory, filename);
+
+                copy++;
+        }
+
+        return child;
 }
 
 GFile *
diff --git a/src/nautilus-file-utilities.h b/src/nautilus-file-utilities.h
index 6d46df5..4b26a8c 100644
--- a/src/nautilus-file-utilities.h
+++ b/src/nautilus-file-utilities.h
@@ -64,13 +64,12 @@ gboolean nautilus_uri_parse                          (const char  *uri,
                                                      guint16     *port,
                                                      char       **userinfo);
 
-/* Return an allocated file name that is guranteed to be unique, but
- * tries to make the name readable to users.
+/* Return an allocated file location that is guranteed to be unique, but
+ * tries to make the location name readable to users.
  * This isn't race-free, so don't use for security-related things
  */
-char *   nautilus_ensure_unique_file_name            (const char *directory_uri,
-                                                     const char *base_name,
-                                                     const char *extension);
+GFile * nautilus_generate_unique_file_in_directory (GFile      *directory,
+                                                    const char *basename);
 
 GFile *  nautilus_find_existing_uri_in_hierarchy     (GFile *location);
 
diff --git a/src/nautilus-link.c b/src/nautilus-link.c
index b02aa92..ddd9896 100644
--- a/src/nautilus-link.c
+++ b/src/nautilus-link.c
@@ -183,10 +183,12 @@ nautilus_link_local_create (const char     *directory_uri,
                            gboolean        unique_filename)
 {
        char *real_directory_uri;
-       char *uri, *contents;
+        char *contents;
        GFile *file;
        GList dummy_list;
        NautilusFileChangesQueuePosition item;
+        g_autofree char *link_name = NULL;
+        g_autoptr (GFile) directory = NULL;
 
        g_return_val_if_fail (directory_uri != NULL, FALSE);
        g_return_val_if_fail (base_name != NULL, FALSE);
@@ -204,29 +206,17 @@ nautilus_link_local_create (const char     *directory_uri,
                real_directory_uri = g_strdup (directory_uri);
        }
 
+        link_name = g_strdup_printf ("%s.desktop", base_name);
+        directory = g_file_new_for_uri (real_directory_uri);
+
        if (unique_filename) {
-               uri = nautilus_ensure_unique_file_name (real_directory_uri,
-                                                       base_name, ".desktop");
-               if (uri == NULL) {
-                       g_free (real_directory_uri);
-                       return FALSE;
-               }
-               file = g_file_new_for_uri (uri);
-               g_free (uri);
+                file = nautilus_generate_unique_file_in_directory (directory,
+                                                                   link_name);
        } else {
-               char *link_name;
-               GFile *dir;
-
-               link_name = g_strdup_printf ("%s.desktop", base_name);
-
                /* replace '/' with '-', just in case */
                g_strdelimit (link_name, "/", '-');
 
-               dir = g_file_new_for_uri (directory_uri);
-               file = g_file_get_child (dir, link_name);
-
-               g_free (link_name);
-               g_object_unref (dir);
+               file = g_file_get_child (directory, link_name);
        }
 
        g_free (real_directory_uri);


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