summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-file-utilities.c
diff options
context:
space:
mode:
authorMaciej Stachowiak <mstachow@src.gnome.org>2000-08-24 14:30:55 +0000
committerMaciej Stachowiak <mstachow@src.gnome.org>2000-08-24 14:30:55 +0000
commit1ce511f9c254d9c99426c3bb494da7683c78ca60 (patch)
treeb53daec8377540a55f3927732e033deea75ab899 /libnautilus-private/nautilus-file-utilities.c
parent3820e600c8ab4ac5812585f65cd4f3fa2cc20a5e (diff)
downloadnautilus-1ce511f9c254d9c99426c3bb494da7683c78ca60.tar.gz
Fix for 1528. "Where's the money, Lebowski?"
* components/tree/nautilus-tree-model.c (nautilus_tree_model_monitor_node): A few changes to avoid crashing when re-monitoring a node. * components/tree/nautilus-tree-view.c (uri_to_view_node, model_node_to_view_node): New convenience functions. (insert_hack_node, nautilus_tree_view_insert_model_node, nautilus_tree_view_remove_model_node, nautilus_tree_view_update_model_node, nautilus_tree_view_find_parent_node): Use the new functions (notify_done_loading, notify_node_seen, nautilus_tree_view_model_node_added_callback, nautilus_tree_view_model_done_loading_callback, get_uri_sequence_to_root, call_when_root_seen, call_when_uri_loaded_or_parent_done_loading, cancel_selection_in_progress, expand_uri_sequence_and_select_end, nautilus_tree_view_load_uri, tree_load_location_callback, tree_select_row_callback): New mess^Wcode to select on content view navigation, handling all the asynchronicity. * libnautilus-extensions/nautilus-file-utilities.h, libnautilus-extensions/nautilus-file-utilities.c: (nautilus_make_uri_canonical): Export the function formerly known as `make_uri_canonical' in natuilus-directory.c. (nautilus_self_check_file_utilities): Move tests here. * libnautilus-extensions/nautilus-directory.c: (make_uri_canonical): remove (nautilus_directory_get_internal): s/make_uri_canonical/nautilus_make_uri_canonical/ (nautilus_self_check_directory): Remove tests for make_uri_canonical
Diffstat (limited to 'libnautilus-private/nautilus-file-utilities.c')
-rw-r--r--libnautilus-private/nautilus-file-utilities.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c
index 31c374010..a56666bfa 100644
--- a/libnautilus-private/nautilus-file-utilities.c
+++ b/libnautilus-private/nautilus-file-utilities.c
@@ -40,6 +40,7 @@
#include <libgnomevfs/gnome-vfs-async-ops.h>
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomevfs/gnome-vfs-xfer.h>
+#include <ctype.h>
#define NAUTILUS_USER_DIRECTORY_NAME ".nautilus"
#define DEFAULT_NAUTILUS_DIRECTORY_MODE (0755)
@@ -141,6 +142,70 @@ nautilus_make_uri_from_input (const char *location)
return toreturn;
}
+
+char *
+nautilus_make_uri_canonical (const char *uri)
+{
+ size_t length;
+ char *canonical_uri, *old_uri, *with_slashes, *p;
+
+ /* Convert "gnome-trash:<anything>" and "trash:<anything>" to
+ * "trash:".
+ */
+ if (nautilus_istr_has_prefix (uri, "trash:")
+ || nautilus_istr_has_prefix (uri, "gnome-trash:")) {
+ return g_strdup ("trash:");
+ }
+
+ /* FIXME bugzilla.eazel.com 648:
+ * This currently ignores the issue of two uris that are not identical but point
+ * to the same data except for the specific cases of trailing '/' characters,
+ * file:/ and file:///, and "lack of file:".
+ */
+
+ /* Strip the trailing "/" characters. */
+ canonical_uri = nautilus_str_strip_trailing_chr (uri, '/');
+ if (strcmp (canonical_uri, uri) != 0) {
+ /* If some trailing '/' were stripped, there's the possibility,
+ * that we stripped away all the '/' from a uri that has only
+ * '/' characters. If you change this code, check to make sure
+ * that "file:///" still works as a URI.
+ */
+ length = strlen (canonical_uri);
+ if (length == 0 || canonical_uri[length - 1] == ':') {
+ with_slashes = g_strconcat (canonical_uri, "///", NULL);
+ g_free (canonical_uri);
+ canonical_uri = with_slashes;
+ }
+ }
+
+ /* Add file: if there is no scheme. */
+ if (strchr (canonical_uri, ':') == NULL) {
+ old_uri = canonical_uri;
+ canonical_uri = g_strconcat ("file:", old_uri, NULL);
+ g_free (old_uri);
+ }
+
+ /* Lower-case the scheme. */
+ for (p = canonical_uri; *p != ':'; p++) {
+ g_assert (*p != '\0');
+ if (isupper (*p)) {
+ *p = tolower (*p);
+ }
+ }
+
+ /* Convert file:/ to file:/// */
+ if (nautilus_str_has_prefix (canonical_uri, "file:/")
+ && !nautilus_str_has_prefix (canonical_uri, "file:///")) {
+ old_uri = canonical_uri;
+ canonical_uri = g_strconcat ("file://", old_uri + 5, NULL);
+ g_free (old_uri);
+ }
+
+ return canonical_uri;
+}
+
+
/**
* nautilus_make_path:
*
@@ -703,6 +768,15 @@ nautilus_self_check_file_utilities (void)
g_free (tmp);
tmp = nautilus_make_uri_from_input ("::");
g_free (tmp);
+
+ /* nautilus_make_uri_canonical */
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical (""), "file:");
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical ("file:/"), "file:///");
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical ("file:///"), "file:///");
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical ("TRASH:XXX"), "trash:");
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical ("trash:xxx"), "trash:");
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical ("GNOME-TRASH:XXX"), "trash:");
+ NAUTILUS_CHECK_STRING_RESULT (nautilus_make_uri_canonical ("gnome-trash:xxx"), "trash:");
}
#endif /* !NAUTILUS_OMIT_SELF_CHECK */