Index: gedit/gedit-document-loader.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-document-loader.c,v retrieving revision 1.3 diff -u -p -r1.3 gedit-document-loader.c --- gedit/gedit-document-loader.c 15 Jan 2006 08:54:26 -0000 1.3 +++ gedit/gedit-document-loader.c 16 Jan 2006 17:33:28 -0000 @@ -465,32 +467,6 @@ stat_to_file_info (GnomeVFSFileInfo *fil GNOME_VFS_FILE_INFO_FIELDS_CTIME; } -/* FIXME: this is ugly for multiple reasons: it refetches all the info, - * it doesn't use fd etc... we need something better, possibly in gnome-vfs - * public api. - */ -static gchar * -get_slow_mime_type (const char *text_uri) -{ - GnomeVFSFileInfo *info; - char *mime_type; - GnomeVFSResult result; - - info = gnome_vfs_file_info_new (); - result = gnome_vfs_get_file_info (text_uri, info, - GNOME_VFS_FILE_INFO_GET_MIME_TYPE | - GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE | - GNOME_VFS_FILE_INFO_FOLLOW_LINKS); - if (info->mime_type == NULL || result != GNOME_VFS_OK) { - mime_type = NULL; - } else { - mime_type = g_strdup (info->mime_type); - } - gnome_vfs_file_info_unref (info); - - return mime_type; -} - static void load_completed_or_failed (GeditDocumentLoader *loader) { @@ -514,6 +490,8 @@ load_completed_or_failed (GeditDocumentL /* ----------- local files ----------- */ +#define MAX_MIME_SNIFF_SIZE 4096 + static gboolean load_local_file_real (GeditDocumentLoader *loader) { @@ -548,7 +526,9 @@ load_local_file_real (GeditDocumentLoade else { gchar *mapped_file; - + gchar *basename; + const gchar *mime_type; + /* CHECK: should we lock the file */ mapped_file = mmap (0, /* start */ loader->priv->info->size, @@ -585,6 +565,18 @@ load_local_file_real (GeditDocumentLoade goto done; } + basename = g_path_get_basename (loader->priv->local_file_name); + mime_type = gnome_vfs_get_mime_type_for_name_and_data (basename, + mapped_file, + MIN (loader->priv->bytes_read, MAX_MIME_SNIFF_SIZE)); + g_free (basename); + + if (mime_type && strcmp (mime_type, GNOME_VFS_MIME_TYPE_UNKNOWN)) + { + loader->priv->info->mime_type = g_strdup (mime_type); + loader->priv->info->valid_fields |= GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE; + } + ret = munmap (mapped_file, loader->priv->info->size); if (ret != 0) @@ -592,10 +584,6 @@ load_local_file_real (GeditDocumentLoade loader->priv->uri, strerror (errno)); } - - /* mime type hack. Do it before closing the fd to avoid race conditions */ - loader->priv->info->mime_type = get_slow_mime_type (loader->priv->uri); - loader->priv->info->valid_fields |= GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE; ret = close (loader->priv->fd);