summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorDarin Adler <darin@src.gnome.org>2000-08-03 20:46:02 +0000
committerDarin Adler <darin@src.gnome.org>2000-08-03 20:46:02 +0000
commit5a9f0e31155f50d2cf3c453a0c3e0d880241b5de (patch)
treecf95dc4daa2dfcdfc810081c62ea404021a564ef /libnautilus-private
parent34c73d07a131bc19d59ca7e51309a88668727411 (diff)
downloadnautilus-5a9f0e31155f50d2cf3c453a0c3e0d880241b5de.tar.gz
Added code to check if a URI is a directory before reading the public
* libnautilus-extensions/nautilus-directory-async.c: (cancel_metafile_read), (metafile_read_try_public_metafile), (metafile_read_check_for_directory_callback), (metafile_read_check_for_directory), (metafile_read_failed): Added code to check if a URI is a directory before reading the public metafile from it. Completes task 223. * src/nautilus-sidebar-title.c: (nautilus_sidebar_title_initialize_class), (update_font), (update_title), (nautilus_sidebar_title_size_allocate): Added code to update the font when the sidebar's size changes since the font is based on the available space. Fixes bugs 1922 and 1901, I think. (nautilus_sidebar_title_hit_test_icon): Added a return_if_fail. * src/nautilus-window-menus.c: (append_bookmark_to_menu): Fixed a problem I ran into where the signal was still connected after the window was destroyed.
Diffstat (limited to 'libnautilus-private')
-rw-r--r--libnautilus-private/nautilus-directory-async.c95
1 files changed, 80 insertions, 15 deletions
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c
index 66188ba57..ed64f132e 100644
--- a/libnautilus-private/nautilus-directory-async.c
+++ b/libnautilus-private/nautilus-directory-async.c
@@ -46,6 +46,7 @@
struct MetafileReadState {
gboolean use_public_metafile;
NautilusReadFileHandle *handle;
+ GnomeVFSAsyncHandle *get_file_info_handle;
};
struct MetafileWriteState {
@@ -181,6 +182,9 @@ cancel_metafile_read (NautilusDirectory *directory)
if (directory->details->metafile_read_state->handle != NULL) {
nautilus_read_file_cancel (directory->details->metafile_read_state->handle);
}
+ if (directory->details->metafile_read_state->get_file_info_handle != NULL) {
+ gnome_vfs_async_cancel (directory->details->metafile_read_state->get_file_info_handle);
+ }
g_free (directory->details->metafile_read_state);
directory->details->metafile_read_state = NULL;
}
@@ -239,10 +243,62 @@ metafile_read_done (NautilusDirectory *directory)
}
static void
+metafile_read_try_public_metafile (NautilusDirectory *directory)
+{
+ directory->details->metafile_read_state->use_public_metafile = TRUE;
+ metafile_read_start (directory);
+}
+
+static void
+metafile_read_check_for_directory_callback (GnomeVFSAsyncHandle *handle,
+ GList *results,
+ gpointer callback_data)
+{
+ NautilusDirectory *directory;
+ GnomeVFSGetFileInfoResult *result;
+
+ directory = NAUTILUS_DIRECTORY (callback_data);
+
+ g_assert (directory->details->metafile_read_state->get_file_info_handle == handle);
+ g_assert (nautilus_g_list_exactly_one_item (results));
+
+ directory->details->metafile_read_state->get_file_info_handle = NULL;
+
+ result = results->data;
+
+ if (result->result == GNOME_VFS_OK
+ && ((result->file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) != 0)
+ && result->file_info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) {
+ /* Is a directory. */
+ metafile_read_try_public_metafile (directory);
+ } else {
+ /* Not a directory. */
+ metafile_read_done (directory);
+ }
+}
+
+static void
+metafile_read_check_for_directory (NautilusDirectory *directory)
+{
+ GList fake_list;
+
+ /* We have to do a get_info call to check if this a directory. */
+ fake_list.data = directory->details->uri;
+ fake_list.next = NULL;
+ fake_list.prev = NULL;
+ gnome_vfs_async_get_file_info
+ (&directory->details->metafile_read_state->get_file_info_handle,
+ &fake_list,
+ GNOME_VFS_FILE_INFO_DEFAULT,
+ metafile_read_check_for_directory_callback,
+ directory);
+}
+
+static void
metafile_read_failed (NautilusDirectory *directory)
{
- NautilusFile *as_file;
- gboolean try_public_metafile;
+ NautilusFile *file;
+ gboolean need_directory_check, is_directory;
g_assert (NAUTILUS_IS_DIRECTORY (directory));
g_assert (directory->details->metafile == NULL);
@@ -254,21 +310,30 @@ metafile_read_failed (NautilusDirectory *directory)
/* The goal here is to read the real metafile, but
* only if the directory is actually a directory.
*/
- /* FIXME bugzilla.eazel.com 223: This code tries to
- * do the right thing, but it only works if there is
- * a NautilusFile with info already. Otherwise it
- * just returns FALSE.
- */
- as_file = nautilus_file_get (directory->details->uri_text);
- if (as_file == NULL) {
- try_public_metafile = FALSE;
+
+ /* First, check if we already know if it a directory. */
+ file = nautilus_file_get (directory->details->uri_text);
+ if (file == NULL || file->details->is_gone) {
+ need_directory_check = FALSE;
+ is_directory = FALSE;
+ } else if (file->details->info == NULL) {
+ need_directory_check = TRUE;
+ is_directory = TRUE;
} else {
- try_public_metafile = nautilus_file_is_directory (as_file);
- nautilus_file_unref (as_file);
+ need_directory_check = FALSE;
+ is_directory = nautilus_file_is_directory (file);
}
- if (try_public_metafile) {
- directory->details->metafile_read_state->use_public_metafile = TRUE;
- metafile_read_start (directory);
+ nautilus_file_unref (file);
+
+ /* Do the directory check if we don't know. */
+ if (need_directory_check) {
+ metafile_read_check_for_directory (directory);
+ return;
+ }
+
+ /* Try for the public metafile if it is a directory. */
+ if (is_directory) {
+ metafile_read_try_public_metafile (directory);
return;
}
}