All pastes #36983 Raw Edit

Mine

public text v1 · immutable
#36983 ·published 2006-01-16 17:34 UTC
rendered paste body
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);