diff options
author | Maciej Stachowiak <mstachow@src.gnome.org> | 2000-08-24 14:30:55 +0000 |
---|---|---|
committer | Maciej Stachowiak <mstachow@src.gnome.org> | 2000-08-24 14:30:55 +0000 |
commit | 1ce511f9c254d9c99426c3bb494da7683c78ca60 (patch) | |
tree | b53daec8377540a55f3927732e033deea75ab899 /libnautilus-private/nautilus-file-utilities.c | |
parent | 3820e600c8ab4ac5812585f65cd4f3fa2cc20a5e (diff) | |
download | nautilus-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.c | 74 |
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 */ |