summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRazvan Chitu <razvan.ch95@gmail.com>2016-08-21 00:49:22 +0300
committerRazvan Chitu <razvan.ch95@gmail.com>2016-08-22 12:29:03 +0300
commit783aeae6874832dc3988382045e9ddd7a66c0ead (patch)
treef910760d7189c47bc462b6fe952eec7427bb737b
parent2e48f931343c9322937990cd519082fd53ed1a5e (diff)
downloadnautilus-783aeae6874832dc3988382045e9ddd7a66c0ead.tar.gz
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
-rw-r--r--src/nautilus-file-utilities.c70
-rw-r--r--src/nautilus-file-utilities.h9
-rw-r--r--src/nautilus-link.c28
3 files changed, 42 insertions, 65 deletions
diff --git a/src/nautilus-file-utilities.c b/src/nautilus-file-utilities.c
index 14929aae9..262f48516 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 6d46df56b..4b26a8caa 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 b02aa9237..ddd989649 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);