diff options
author | Razvan Chitu <razvan.ch95@gmail.com> | 2016-08-21 00:49:22 +0300 |
---|---|---|
committer | Razvan Chitu <razvan.ch95@gmail.com> | 2016-08-23 00:36:56 +0300 |
commit | 8d9a036aa17e55561c75aee1edcbb7f76efaed14 (patch) | |
tree | f144a8c2c20570ee80287fee97733315fd733261 /src | |
parent | fd01842f996b7d07baf2aafb0f68308fc5ed2055 (diff) | |
download | nautilus-8d9a036aa17e55561c75aee1edcbb7f76efaed14.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
Diffstat (limited to 'src')
-rw-r--r-- | src/nautilus-file-utilities.c | 70 | ||||
-rw-r--r-- | src/nautilus-file-utilities.h | 9 | ||||
-rw-r--r-- | src/nautilus-link.c | 28 |
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); |