diff options
-rw-r--r-- | ChangeLog | 22 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-async.c | 181 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-private.h | 5 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-file-attributes.h | 2 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-file-private.h | 6 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-file.c | 30 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-file.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 181 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-private.h | 5 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-attributes.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-private.h | 6 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.c | 30 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.h | 2 |
13 files changed, 472 insertions, 2 deletions
@@ -1,3 +1,25 @@ +2000-10-13 Robey Pointer <robey@eazel.com> + + * libnautilus-extensions/nautilus-directory-async.c: + (cancel_mime_list), (nautilus_directory_cancel), + (set_up_request_by_file_attributes), + (nautilus_directory_monitor_add_internal), + (nautilus_async_destroying_file), (lacks_mime_list), + (wants_mime_list), (request_is_satisfied), + (nautilus_directory_invalidate_counts), (mime_list_one), + (mime_list_callback), (mime_list_load), (mime_list_start), + (start_or_stop_io): + * libnautilus-extensions/nautilus-directory-private.h: + * libnautilus-extensions/nautilus-file-attributes.h: + * libnautilus-extensions/nautilus-file-private.h: + * libnautilus-extensions/nautilus-file.c: (destroy), + (nautilus_file_recompute_deep_counts), + (nautilus_file_get_mime_list): + * libnautilus-extensions/nautilus-file.h: + + Added mime-list support (can fetch the list of mime-types in the + subdirs of a directory) for bug 3364. + 2000-10-13 Eskil Heyn Olsen <eskil@eazel.com> * components/services/install/lib/eazel-install-rpm-glue.c: diff --git a/libnautilus-extensions/nautilus-directory-async.c b/libnautilus-extensions/nautilus-directory-async.c index ad04c4e12..2c1f81243 100644 --- a/libnautilus-extensions/nautilus-directory-async.c +++ b/libnautilus-extensions/nautilus-directory-async.c @@ -82,6 +82,7 @@ typedef struct { gboolean get_slow_mime_type; /* only relevant if file_info is "true" */ gboolean directory_count; gboolean deep_count; + gboolean mime_list; gboolean top_left_text; gboolean activation_uri; } Request; @@ -143,6 +144,23 @@ cancel_deep_count (NautilusDirectory *directory) } static void +cancel_mime_list (NautilusDirectory *directory) +{ + if (directory->details->mime_list_in_progress != NULL) { + g_assert (NAUTILUS_IS_FILE (directory->details->mime_list_file)); + + gnome_vfs_async_cancel (directory->details->mime_list_in_progress); + + directory->details->mime_list_file->details->mime_list_status = NAUTILUS_REQUEST_NOT_STARTED; + + directory->details->mime_list_file = NULL; + directory->details->mime_list_in_progress = NULL; + g_free (directory->details->mime_list_uri); + directory->details->mime_list_uri = NULL; + } +} + +static void cancel_top_left_read (NautilusDirectory *directory) { if (directory->details->top_left_read_state != NULL) { @@ -192,6 +210,7 @@ nautilus_directory_cancel (NautilusDirectory *directory) { cancel_deep_count (directory); cancel_directory_counts (directory); + cancel_mime_list (directory); cancel_get_info (directory); cancel_metafile_read (directory); cancel_top_left_read (directory); @@ -733,6 +752,10 @@ set_up_request_by_file_attributes (Request *request, (file_attributes, NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS, nautilus_str_compare) != NULL; + request->mime_list = g_list_find_custom + (file_attributes, + NAUTILUS_FILE_ATTRIBUTE_MIME_LIST, + nautilus_str_compare) != NULL; request->top_left_text = g_list_find_custom (file_attributes, NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT, @@ -1414,6 +1437,10 @@ nautilus_async_destroying_file (NautilusFile *file) directory->details->deep_count_file = NULL; changed = TRUE; } + if (directory->details->mime_list_file == file) { + directory->details->mime_list_file = NULL; + changed = TRUE; + } if (directory->details->get_info_file == file) { directory->details->get_info_file = NULL; changed = TRUE; @@ -1507,6 +1534,19 @@ wants_deep_count (const Request *request) } static gboolean +lacks_mime_list (NautilusFile *file) +{ + return nautilus_file_is_directory (file) + && file->details->mime_list_status != NAUTILUS_REQUEST_DONE; +} + +static gboolean +wants_mime_list (const Request *request) +{ + return request->mime_list; +} + +static gboolean lacks_activation_uri (NautilusFile *file) { return file->details->info != NULL @@ -1577,6 +1617,12 @@ request_is_satisfied (NautilusDirectory *directory, } } + if (request->mime_list) { + if (has_problem (directory, file, lacks_mime_list)) { + return FALSE; + } + } + if (request->activation_uri) { if (has_problem (directory, file, lacks_activation_uri)) { return FALSE; @@ -1759,10 +1805,16 @@ nautilus_directory_invalidate_counts (NautilusDirectory *directory) if (parent_directory->details->deep_count_file == file) { cancel_deep_count (parent_directory); } + if (parent_directory->details->mime_list_file == file) { + cancel_mime_list (parent_directory); + } file->details->got_directory_count = FALSE; file->details->directory_count_failed = FALSE; file->details->deep_counts_status = NAUTILUS_REQUEST_NOT_STARTED; + file->details->got_mime_list = FALSE; + file->details->mime_list_failed = FALSE; + file->details->mime_list_status = NAUTILUS_REQUEST_NOT_STARTED; if (parent_directory != directory) { nautilus_directory_async_state_changed (parent_directory); @@ -2159,6 +2211,132 @@ deep_count_start (NautilusDirectory *directory) g_free (uri); } +static void +mime_list_one (NautilusDirectory *directory, + GnomeVFSFileInfo *info) +{ + NautilusFile *file; + + file = directory->details->mime_list_file; + + if (g_list_find_custom (file->details->mime_list, info->mime_type, (GCompareFunc)g_strcasecmp) == NULL) { + file->details->mime_list = g_list_prepend (file->details->mime_list, g_strdup (info->mime_type)); + } +} + +static void +mime_list_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + GnomeVFSDirectoryList *list, + guint entries_read, + gpointer callback_data) +{ + NautilusDirectory *directory; + NautilusFile *file; + GnomeVFSDirectoryListPosition last_handled, p; + gboolean done; + + directory = NAUTILUS_DIRECTORY (callback_data); + g_assert (directory->details->mime_list_in_progress == handle); + file = directory->details->mime_list_file; + g_assert (NAUTILUS_IS_FILE (file)); + + /* We can't do this in the most straightforward way, becuse the position + * for a gnome_vfs_directory_list does not have a way of representing one + * past the end. So we must keep a position to the last item we handled + * rather than keeping a position past the last item we handled. + */ + last_handled = directory->details->mime_list_last_handled; + p = last_handled; + while ((p = directory_list_get_next_position (list, p)) + != GNOME_VFS_DIRECTORY_LIST_POSITION_NONE) { + mime_list_one (directory, gnome_vfs_directory_list_get (list, p)); + last_handled = p; + } + directory->details->mime_list_last_handled = last_handled; + + done = FALSE; + if (result != GNOME_VFS_OK) { + directory->details->mime_list_in_progress = NULL; + g_free (directory->details->mime_list_uri); + directory->details->mime_list_uri = NULL; + + file->details->mime_list_status = NAUTILUS_REQUEST_DONE; + directory->details->mime_list_file = NULL; + done = TRUE; + } + + nautilus_file_changed (file); + + if (done) { + nautilus_directory_async_state_changed (directory); + } +} + +static void +mime_list_load (NautilusDirectory *directory, const char *uri) +{ + g_assert (directory->details->mime_list_uri == NULL); + directory->details->mime_list_uri = g_strdup (uri); + directory->details->mime_list_last_handled + = GNOME_VFS_DIRECTORY_LIST_POSITION_NONE; + gnome_vfs_async_load_directory + (&directory->details->mime_list_in_progress, + uri, + GNOME_VFS_FILE_INFO_GET_MIME_TYPE, + NULL, + FALSE, + GNOME_VFS_DIRECTORY_FILTER_NONE, + (GNOME_VFS_DIRECTORY_FILTER_NOSELFDIR + | GNOME_VFS_DIRECTORY_FILTER_NOPARENTDIR), + NULL, + G_MAXINT, + mime_list_callback, + directory); +} + +static void +mime_list_start (NautilusDirectory *directory) +{ + NautilusFile *file; + char *uri; + + /* If there's already a count in progress, check to be sure + * it's still wanted. + */ + if (directory->details->mime_list_in_progress != NULL) { + file = directory->details->mime_list_file; + if (file != NULL) { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_mime_list, + wants_mime_list)) { + return; + } + } + + /* The count is not wanted, so stop it. */ + cancel_mime_list (directory); + } + + /* Figure out which file to get a mime list for. */ + file = select_needy_file (directory, + lacks_mime_list, + wants_mime_list); + if (file == NULL) { + return; + } + + /* Start counting. */ + file->details->mime_list_status = NAUTILUS_REQUEST_IN_PROGRESS; + /* FIXME: clear out mime_list_whatever */ + directory->details->mime_list_file = file; + uri = nautilus_file_get_uri (file); + mime_list_load (directory, uri); + g_free (uri); +} + static int count_lines (const char *text, int length) { @@ -2558,6 +2736,9 @@ start_or_stop_io (NautilusDirectory *directory) start_getting_directory_counts (directory); deep_count_start (directory); + /* Start or stop getting mime lists. */ + mime_list_start (directory); + /* Start or stop getting top left pieces of files. */ start_getting_top_lefts (directory); diff --git a/libnautilus-extensions/nautilus-directory-private.h b/libnautilus-extensions/nautilus-directory-private.h index c321afafc..0961956cc 100644 --- a/libnautilus-extensions/nautilus-directory-private.h +++ b/libnautilus-extensions/nautilus-directory-private.h @@ -87,6 +87,11 @@ struct NautilusDirectoryDetails GnomeVFSDirectoryListPosition deep_count_last_handled; GList *deep_count_subdirectories; + NautilusFile *mime_list_file; + GnomeVFSAsyncHandle *mime_list_in_progress; + char *mime_list_uri; + GnomeVFSDirectoryListPosition mime_list_last_handled; + GnomeVFSAsyncHandle *get_info_in_progress; NautilusFile *get_info_file; gboolean get_slow_mime_type_for_file; diff --git a/libnautilus-extensions/nautilus-file-attributes.h b/libnautilus-extensions/nautilus-file-attributes.h index ee6e32d5b..5c52960be 100644 --- a/libnautilus-extensions/nautilus-file-attributes.h +++ b/libnautilus-extensions/nautilus-file-attributes.h @@ -38,7 +38,7 @@ #define NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT "top left text" #define NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY "is directory" #define NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE "file type" -#define NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_CHILD_MIME_TYPES "directory child mime types" +#define NAUTILUS_FILE_ATTRIBUTE_MIME_LIST "MIME list" #define NAUTILUS_FILE_ATTRIBUTE_METADATA "metadata" #endif /* NAUTILUS_FILE_ATTRIBUTES_H */ diff --git a/libnautilus-extensions/nautilus-file-private.h b/libnautilus-extensions/nautilus-file-private.h index acd6fde80..b65dd03ac 100644 --- a/libnautilus-extensions/nautilus-file-private.h +++ b/libnautilus-extensions/nautilus-file-private.h @@ -55,6 +55,12 @@ struct NautilusFileDetails guint deep_unreadable_count; GnomeVFSFileSize deep_size; + /* if this is a directory, the list of mime-types in it */ + NautilusRequestStatus mime_list_status; + GList *mime_list; + gboolean got_mime_list; + gboolean mime_list_failed; + gboolean got_top_left_text; char *top_left_text; diff --git a/libnautilus-extensions/nautilus-file.c b/libnautilus-extensions/nautilus-file.c index f81c5b264..bf15ada0f 100644 --- a/libnautilus-extensions/nautilus-file.c +++ b/libnautilus-extensions/nautilus-file.c @@ -407,6 +407,9 @@ destroy (GtkObject *object) g_free (file->details->top_left_text); g_free (file->details->activation_uri); + g_list_foreach (file->details->mime_list, (GFunc) g_free, NULL); + g_list_free (file->details->mime_list); + g_free (file->details); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); @@ -2053,6 +2056,33 @@ nautilus_file_recompute_deep_counts (NautilusFile *file) } /** + * nautilus_file_get_mime_list + * + * Get the list of mime-types present in a directory. + * @file: NautilusFile representing a directory. It is an error to + * call this function on a file that is not a directory. + * @mime_list: Place to put the list of mime-types. + * + * Returns: TRUE if mime-type list is available. + * + **/ +gboolean +nautilus_file_get_mime_list (NautilusFile *file, + GList **mime_list) +{ + g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE); + g_return_val_if_fail (nautilus_file_is_directory (file), FALSE); + g_return_val_if_fail (mime_list != NULL, FALSE); + + if (! file->details->got_mime_list) { + return FALSE; + } + + *mime_list = file->details->mime_list; + return TRUE; +} + +/** * nautilus_file_get_size * * Get the file size. diff --git a/libnautilus-extensions/nautilus-file.h b/libnautilus-extensions/nautilus-file.h index b8bf1c191..6cb380a52 100644 --- a/libnautilus-extensions/nautilus-file.h +++ b/libnautilus-extensions/nautilus-file.h @@ -147,6 +147,8 @@ void nautilus_file_set_keywords (NautilusFile GList *keywords); GList * nautilus_file_get_emblem_names (NautilusFile *file); char * nautilus_file_get_top_left_text (NautilusFile *file); +gboolean nautilus_file_get_mime_list (NautilusFile *file, + GList **mime_list); /* Permissions. */ diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index ad04c4e12..2c1f81243 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -82,6 +82,7 @@ typedef struct { gboolean get_slow_mime_type; /* only relevant if file_info is "true" */ gboolean directory_count; gboolean deep_count; + gboolean mime_list; gboolean top_left_text; gboolean activation_uri; } Request; @@ -143,6 +144,23 @@ cancel_deep_count (NautilusDirectory *directory) } static void +cancel_mime_list (NautilusDirectory *directory) +{ + if (directory->details->mime_list_in_progress != NULL) { + g_assert (NAUTILUS_IS_FILE (directory->details->mime_list_file)); + + gnome_vfs_async_cancel (directory->details->mime_list_in_progress); + + directory->details->mime_list_file->details->mime_list_status = NAUTILUS_REQUEST_NOT_STARTED; + + directory->details->mime_list_file = NULL; + directory->details->mime_list_in_progress = NULL; + g_free (directory->details->mime_list_uri); + directory->details->mime_list_uri = NULL; + } +} + +static void cancel_top_left_read (NautilusDirectory *directory) { if (directory->details->top_left_read_state != NULL) { @@ -192,6 +210,7 @@ nautilus_directory_cancel (NautilusDirectory *directory) { cancel_deep_count (directory); cancel_directory_counts (directory); + cancel_mime_list (directory); cancel_get_info (directory); cancel_metafile_read (directory); cancel_top_left_read (directory); @@ -733,6 +752,10 @@ set_up_request_by_file_attributes (Request *request, (file_attributes, NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS, nautilus_str_compare) != NULL; + request->mime_list = g_list_find_custom + (file_attributes, + NAUTILUS_FILE_ATTRIBUTE_MIME_LIST, + nautilus_str_compare) != NULL; request->top_left_text = g_list_find_custom (file_attributes, NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT, @@ -1414,6 +1437,10 @@ nautilus_async_destroying_file (NautilusFile *file) directory->details->deep_count_file = NULL; changed = TRUE; } + if (directory->details->mime_list_file == file) { + directory->details->mime_list_file = NULL; + changed = TRUE; + } if (directory->details->get_info_file == file) { directory->details->get_info_file = NULL; changed = TRUE; @@ -1507,6 +1534,19 @@ wants_deep_count (const Request *request) } static gboolean +lacks_mime_list (NautilusFile *file) +{ + return nautilus_file_is_directory (file) + && file->details->mime_list_status != NAUTILUS_REQUEST_DONE; +} + +static gboolean +wants_mime_list (const Request *request) +{ + return request->mime_list; +} + +static gboolean lacks_activation_uri (NautilusFile *file) { return file->details->info != NULL @@ -1577,6 +1617,12 @@ request_is_satisfied (NautilusDirectory *directory, } } + if (request->mime_list) { + if (has_problem (directory, file, lacks_mime_list)) { + return FALSE; + } + } + if (request->activation_uri) { if (has_problem (directory, file, lacks_activation_uri)) { return FALSE; @@ -1759,10 +1805,16 @@ nautilus_directory_invalidate_counts (NautilusDirectory *directory) if (parent_directory->details->deep_count_file == file) { cancel_deep_count (parent_directory); } + if (parent_directory->details->mime_list_file == file) { + cancel_mime_list (parent_directory); + } file->details->got_directory_count = FALSE; file->details->directory_count_failed = FALSE; file->details->deep_counts_status = NAUTILUS_REQUEST_NOT_STARTED; + file->details->got_mime_list = FALSE; + file->details->mime_list_failed = FALSE; + file->details->mime_list_status = NAUTILUS_REQUEST_NOT_STARTED; if (parent_directory != directory) { nautilus_directory_async_state_changed (parent_directory); @@ -2159,6 +2211,132 @@ deep_count_start (NautilusDirectory *directory) g_free (uri); } +static void +mime_list_one (NautilusDirectory *directory, + GnomeVFSFileInfo *info) +{ + NautilusFile *file; + + file = directory->details->mime_list_file; + + if (g_list_find_custom (file->details->mime_list, info->mime_type, (GCompareFunc)g_strcasecmp) == NULL) { + file->details->mime_list = g_list_prepend (file->details->mime_list, g_strdup (info->mime_type)); + } +} + +static void +mime_list_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + GnomeVFSDirectoryList *list, + guint entries_read, + gpointer callback_data) +{ + NautilusDirectory *directory; + NautilusFile *file; + GnomeVFSDirectoryListPosition last_handled, p; + gboolean done; + + directory = NAUTILUS_DIRECTORY (callback_data); + g_assert (directory->details->mime_list_in_progress == handle); + file = directory->details->mime_list_file; + g_assert (NAUTILUS_IS_FILE (file)); + + /* We can't do this in the most straightforward way, becuse the position + * for a gnome_vfs_directory_list does not have a way of representing one + * past the end. So we must keep a position to the last item we handled + * rather than keeping a position past the last item we handled. + */ + last_handled = directory->details->mime_list_last_handled; + p = last_handled; + while ((p = directory_list_get_next_position (list, p)) + != GNOME_VFS_DIRECTORY_LIST_POSITION_NONE) { + mime_list_one (directory, gnome_vfs_directory_list_get (list, p)); + last_handled = p; + } + directory->details->mime_list_last_handled = last_handled; + + done = FALSE; + if (result != GNOME_VFS_OK) { + directory->details->mime_list_in_progress = NULL; + g_free (directory->details->mime_list_uri); + directory->details->mime_list_uri = NULL; + + file->details->mime_list_status = NAUTILUS_REQUEST_DONE; + directory->details->mime_list_file = NULL; + done = TRUE; + } + + nautilus_file_changed (file); + + if (done) { + nautilus_directory_async_state_changed (directory); + } +} + +static void +mime_list_load (NautilusDirectory *directory, const char *uri) +{ + g_assert (directory->details->mime_list_uri == NULL); + directory->details->mime_list_uri = g_strdup (uri); + directory->details->mime_list_last_handled + = GNOME_VFS_DIRECTORY_LIST_POSITION_NONE; + gnome_vfs_async_load_directory + (&directory->details->mime_list_in_progress, + uri, + GNOME_VFS_FILE_INFO_GET_MIME_TYPE, + NULL, + FALSE, + GNOME_VFS_DIRECTORY_FILTER_NONE, + (GNOME_VFS_DIRECTORY_FILTER_NOSELFDIR + | GNOME_VFS_DIRECTORY_FILTER_NOPARENTDIR), + NULL, + G_MAXINT, + mime_list_callback, + directory); +} + +static void +mime_list_start (NautilusDirectory *directory) +{ + NautilusFile *file; + char *uri; + + /* If there's already a count in progress, check to be sure + * it's still wanted. + */ + if (directory->details->mime_list_in_progress != NULL) { + file = directory->details->mime_list_file; + if (file != NULL) { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_mime_list, + wants_mime_list)) { + return; + } + } + + /* The count is not wanted, so stop it. */ + cancel_mime_list (directory); + } + + /* Figure out which file to get a mime list for. */ + file = select_needy_file (directory, + lacks_mime_list, + wants_mime_list); + if (file == NULL) { + return; + } + + /* Start counting. */ + file->details->mime_list_status = NAUTILUS_REQUEST_IN_PROGRESS; + /* FIXME: clear out mime_list_whatever */ + directory->details->mime_list_file = file; + uri = nautilus_file_get_uri (file); + mime_list_load (directory, uri); + g_free (uri); +} + static int count_lines (const char *text, int length) { @@ -2558,6 +2736,9 @@ start_or_stop_io (NautilusDirectory *directory) start_getting_directory_counts (directory); deep_count_start (directory); + /* Start or stop getting mime lists. */ + mime_list_start (directory); + /* Start or stop getting top left pieces of files. */ start_getting_top_lefts (directory); diff --git a/libnautilus-private/nautilus-directory-private.h b/libnautilus-private/nautilus-directory-private.h index c321afafc..0961956cc 100644 --- a/libnautilus-private/nautilus-directory-private.h +++ b/libnautilus-private/nautilus-directory-private.h @@ -87,6 +87,11 @@ struct NautilusDirectoryDetails GnomeVFSDirectoryListPosition deep_count_last_handled; GList *deep_count_subdirectories; + NautilusFile *mime_list_file; + GnomeVFSAsyncHandle *mime_list_in_progress; + char *mime_list_uri; + GnomeVFSDirectoryListPosition mime_list_last_handled; + GnomeVFSAsyncHandle *get_info_in_progress; NautilusFile *get_info_file; gboolean get_slow_mime_type_for_file; diff --git a/libnautilus-private/nautilus-file-attributes.h b/libnautilus-private/nautilus-file-attributes.h index ee6e32d5b..5c52960be 100644 --- a/libnautilus-private/nautilus-file-attributes.h +++ b/libnautilus-private/nautilus-file-attributes.h @@ -38,7 +38,7 @@ #define NAUTILUS_FILE_ATTRIBUTE_TOP_LEFT_TEXT "top left text" #define NAUTILUS_FILE_ATTRIBUTE_IS_DIRECTORY "is directory" #define NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE "file type" -#define NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_CHILD_MIME_TYPES "directory child mime types" +#define NAUTILUS_FILE_ATTRIBUTE_MIME_LIST "MIME list" #define NAUTILUS_FILE_ATTRIBUTE_METADATA "metadata" #endif /* NAUTILUS_FILE_ATTRIBUTES_H */ diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h index acd6fde80..b65dd03ac 100644 --- a/libnautilus-private/nautilus-file-private.h +++ b/libnautilus-private/nautilus-file-private.h @@ -55,6 +55,12 @@ struct NautilusFileDetails guint deep_unreadable_count; GnomeVFSFileSize deep_size; + /* if this is a directory, the list of mime-types in it */ + NautilusRequestStatus mime_list_status; + GList *mime_list; + gboolean got_mime_list; + gboolean mime_list_failed; + gboolean got_top_left_text; char *top_left_text; diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index f81c5b264..bf15ada0f 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -407,6 +407,9 @@ destroy (GtkObject *object) g_free (file->details->top_left_text); g_free (file->details->activation_uri); + g_list_foreach (file->details->mime_list, (GFunc) g_free, NULL); + g_list_free (file->details->mime_list); + g_free (file->details); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); @@ -2053,6 +2056,33 @@ nautilus_file_recompute_deep_counts (NautilusFile *file) } /** + * nautilus_file_get_mime_list + * + * Get the list of mime-types present in a directory. + * @file: NautilusFile representing a directory. It is an error to + * call this function on a file that is not a directory. + * @mime_list: Place to put the list of mime-types. + * + * Returns: TRUE if mime-type list is available. + * + **/ +gboolean +nautilus_file_get_mime_list (NautilusFile *file, + GList **mime_list) +{ + g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE); + g_return_val_if_fail (nautilus_file_is_directory (file), FALSE); + g_return_val_if_fail (mime_list != NULL, FALSE); + + if (! file->details->got_mime_list) { + return FALSE; + } + + *mime_list = file->details->mime_list; + return TRUE; +} + +/** * nautilus_file_get_size * * Get the file size. diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h index b8bf1c191..6cb380a52 100644 --- a/libnautilus-private/nautilus-file.h +++ b/libnautilus-private/nautilus-file.h @@ -147,6 +147,8 @@ void nautilus_file_set_keywords (NautilusFile GList *keywords); GList * nautilus_file_get_emblem_names (NautilusFile *file); char * nautilus_file_get_top_left_text (NautilusFile *file); +gboolean nautilus_file_get_mime_list (NautilusFile *file, + GList **mime_list); /* Permissions. */ |