rendered paste bodyIndex: 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);