summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog22
-rw-r--r--libnautilus-extensions/nautilus-directory-async.c181
-rw-r--r--libnautilus-extensions/nautilus-directory-private.h5
-rw-r--r--libnautilus-extensions/nautilus-file-attributes.h2
-rw-r--r--libnautilus-extensions/nautilus-file-private.h6
-rw-r--r--libnautilus-extensions/nautilus-file.c30
-rw-r--r--libnautilus-extensions/nautilus-file.h2
-rw-r--r--libnautilus-private/nautilus-directory-async.c181
-rw-r--r--libnautilus-private/nautilus-directory-private.h5
-rw-r--r--libnautilus-private/nautilus-file-attributes.h2
-rw-r--r--libnautilus-private/nautilus-file-private.h6
-rw-r--r--libnautilus-private/nautilus-file.c30
-rw-r--r--libnautilus-private/nautilus-file.h2
13 files changed, 472 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 4952b3c46..b0c24f0c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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. */