summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2005-01-14 10:40:12 +0000
committerAlexander Larsson <alexl@src.gnome.org>2005-01-14 10:40:12 +0000
commit4553e1c81e759416c72e7f2b48af5eece4eb907f (patch)
tree7233c812f1db4c6fe2be57a8f306aca2e2b52546
parentea2138d46b2bf8d90a167218ca4e113535f1a21a (diff)
downloadnautilus-4553e1c81e759416c72e7f2b48af5eece4eb907f.tar.gz
New function nautilus_ensure_unique_file_name
2005-01-14 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-file-utilities.[ch]: New function nautilus_ensure_unique_file_name * libnautilus-private/nautilus-link.[ch]: * libnautilus-private/nautilus-link-desktop-file.[ch]: Uniquify name for nautilus_link_local_create if requested. * src/file-manager/fm-directory-view.c: (fm_directory_view_handle_url_drop): Uniquify desktop link name Patch from Jorn Baayen <jbaayen@gnome.org>
-rw-r--r--ChangeLog15
-rw-r--r--libnautilus-private/nautilus-file-utilities.c49
-rw-r--r--libnautilus-private/nautilus-file-utilities.h8
-rw-r--r--libnautilus-private/nautilus-link-desktop-file.c18
-rw-r--r--libnautilus-private/nautilus-link-desktop-file.h5
-rw-r--r--libnautilus-private/nautilus-link.c6
-rw-r--r--libnautilus-private/nautilus-link.h3
-rw-r--r--src/file-manager/fm-directory-view.c12
8 files changed, 97 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index be2851be7..6d7615af0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2005-01-14 Alexander Larsson <alexl@redhat.com>
+
+ * libnautilus-private/nautilus-file-utilities.[ch]:
+ New function nautilus_ensure_unique_file_name
+
+ * libnautilus-private/nautilus-link.[ch]:
+ * libnautilus-private/nautilus-link-desktop-file.[ch]:
+ Uniquify name for nautilus_link_local_create if requested.
+
+ * src/file-manager/fm-directory-view.c:
+ (fm_directory_view_handle_url_drop):
+ Uniquify desktop link name
+
+ Patch from Jorn Baayen <jbaayen@gnome.org>
+
2005-01-13 Alexander Larsson <alexl@redhat.com>
* libnautilus-private/nautilus-icon-container.[ch]:
diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c
index ae21d95e4..4fbd2a440 100644
--- a/libnautilus-private/nautilus-file-utilities.c
+++ b/libnautilus-private/nautilus-file-utilities.c
@@ -366,6 +366,55 @@ nautilus_get_data_file_path (const char *partial_path)
return NULL;
}
+static gboolean
+test_uri_exists (const char *path)
+{
+ GnomeVFSURI *uri;
+ gboolean exists;
+
+ uri = gnome_vfs_uri_new (path);
+ exists = gnome_vfs_uri_exists (uri);
+ gnome_vfs_uri_unref (uri);
+
+ return exists;
+}
+
+char *
+nautilus_ensure_unique_file_name (const char *directory_uri,
+ const char *base_name,
+ const char *extension)
+{
+ char *path, *escaped_name;
+ gboolean exists;
+ int copy;
+
+ escaped_name = gnome_vfs_escape_string (base_name);
+
+ path = g_strdup_printf ("%s/%s%s",
+ directory_uri,
+ escaped_name,
+ extension);
+ exists = test_uri_exists (path);
+
+ copy = 1;
+ while (exists) {
+ g_free (path);
+ path = g_strdup_printf ("%s/%s-%d%s",
+ directory_uri,
+ escaped_name,
+ copy,
+ extension);
+
+ exists = test_uri_exists (path);
+
+ copy++;
+ }
+
+ g_free (escaped_name);
+
+ return path;
+}
+
char *
nautilus_unique_temporary_file_name (void)
{
diff --git a/libnautilus-private/nautilus-file-utilities.h b/libnautilus-private/nautilus-file-utilities.h
index 5b71e461d..7e3a6ed82 100644
--- a/libnautilus-private/nautilus-file-utilities.h
+++ b/libnautilus-private/nautilus-file-utilities.h
@@ -66,7 +66,13 @@ char * nautilus_pixmap_file (const char *partial_path);
/* Locate a file in either the uers directory or the datadir. */
char * nautilus_get_data_file_path (const char *partial_path);
-/* Return an allocated file name that is guranteed to be unique. */
+/* Return an allocated file name that is guranteed to be unique, but
+ * tries to make the 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);
char * nautilus_unique_temporary_file_name (void);
char * nautilus_find_file_in_gnome_path (char *file);
GList * nautilus_find_all_files_in_gnome_path (char *file);
diff --git a/libnautilus-private/nautilus-link-desktop-file.c b/libnautilus-private/nautilus-link-desktop-file.c
index aa2bec0ff..a5d49e9f2 100644
--- a/libnautilus-private/nautilus-link-desktop-file.c
+++ b/libnautilus-private/nautilus-link-desktop-file.c
@@ -79,12 +79,13 @@ slurp_key_string (const char *uri,
gboolean
nautilus_link_desktop_file_local_create (const char *directory_uri,
- const char *file_name,
+ const char *base_name,
const char *display_name,
const char *image,
const char *target_uri,
const GdkPoint *point,
- int screen)
+ int screen,
+ gboolean unique_filename)
{
char *uri, *contents, *escaped_name;
GnomeDesktopItem *desktop_item;
@@ -92,13 +93,18 @@ nautilus_link_desktop_file_local_create (const char *directory_uri,
NautilusFileChangesQueuePosition item;
g_return_val_if_fail (directory_uri != NULL, FALSE);
- g_return_val_if_fail (file_name != NULL, FALSE);
+ g_return_val_if_fail (base_name != NULL, FALSE);
g_return_val_if_fail (display_name != NULL, FALSE);
g_return_val_if_fail (target_uri != NULL, FALSE);
- escaped_name = gnome_vfs_escape_string (file_name);
- uri = g_strdup_printf ("%s/%s", directory_uri, escaped_name);
- g_free (escaped_name);
+ if (unique_filename) {
+ uri = nautilus_ensure_unique_file_name (directory_uri,
+ base_name, ".desktop");
+ } else {
+ escaped_name = gnome_vfs_escape_string (base_name);
+ uri = g_strdup_printf ("%s/%s.desktop", directory_uri, escaped_name);
+ g_free (escaped_name);
+ }
contents = g_strdup_printf ("[Desktop Entry]\n"
"Encoding=UTF-8\n"
diff --git a/libnautilus-private/nautilus-link-desktop-file.h b/libnautilus-private/nautilus-link-desktop-file.h
index 9e189414a..a0ab05700 100644
--- a/libnautilus-private/nautilus-link-desktop-file.h
+++ b/libnautilus-private/nautilus-link-desktop-file.h
@@ -28,12 +28,13 @@
#include <libnautilus-private/nautilus-link.h>
gboolean nautilus_link_desktop_file_local_create (const char *directory_uri,
- const char *file_name,
+ const char *base_name,
const char *display_name,
const char *image,
const char *target_uri,
const GdkPoint *point,
- int screen);
+ int screen,
+ gboolean unique_filename);
gboolean nautilus_link_desktop_file_local_set_text (const char *uri,
const char *text);
char * nautilus_link_desktop_file_local_get_text (const char *uri);
diff --git a/libnautilus-private/nautilus-link.c b/libnautilus-private/nautilus-link.c
index 199536b4e..521c40499 100644
--- a/libnautilus-private/nautilus-link.c
+++ b/libnautilus-private/nautilus-link.c
@@ -110,13 +110,15 @@ nautilus_link_local_create (const char *directory_uri,
const char *image,
const char *target_uri,
const GdkPoint *point,
- int screen)
+ int screen,
+ gboolean unique_filename)
{
return nautilus_link_desktop_file_local_create (directory_uri,
file_name,
display_name, image,
target_uri,
- point, screen);
+ point, screen,
+ unique_filename);
}
/* returns additional text to display under the name, NULL if none */
diff --git a/libnautilus-private/nautilus-link.h b/libnautilus-private/nautilus-link.h
index 71741e1bb..c825ce3b9 100644
--- a/libnautilus-private/nautilus-link.h
+++ b/libnautilus-private/nautilus-link.h
@@ -39,7 +39,8 @@ gboolean nautilus_link_local_create (const char
const char *image,
const char *target_uri,
const GdkPoint *point,
- int screen);
+ int screen,
+ gboolean unique_filename);
/* Returns additional text to display under the name, NULL if
* none. Despite the fact that it takes a URI parameter, works only if
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index 761686485..d80fbc89b 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -7818,7 +7818,7 @@ fm_directory_view_handle_url_drop (FMDirectoryView *view,
GdkScreen *screen;
int screen_num;
char *url, *title;
- char *link_name, *link_file_name, *link_display_name;
+ char *link_name, *link_display_name;
char *container_uri;
GArray *points;
char **bits;
@@ -7889,11 +7889,9 @@ fm_directory_view_handle_url_drop (FMDirectoryView *view,
if (!eel_str_is_empty (link_name)) {
link_display_name = g_strdup_printf (_("link to %s"), link_name);
- /* FIXME: Handle name conflicts? */
- link_file_name = g_strconcat (link_name, ".desktop", NULL);
/* The filename can't contain slashes, strip em.
(the basename of http://foo/ is http://foo/) */
- revert_slashes (link_file_name);
+ revert_slashes (link_name);
point.x = x;
point.y = y;
@@ -7902,14 +7900,14 @@ fm_directory_view_handle_url_drop (FMDirectoryView *view,
screen_num = gdk_screen_get_number (screen);
nautilus_link_local_create (container_uri,
- link_file_name,
+ link_name,
link_display_name,
"gnome-fs-bookmark",
url,
&point,
- screen_num);
+ screen_num,
+ TRUE);
- g_free (link_file_name);
g_free (link_display_name);
}
g_free (link_name);