[f-spot] Support loading files with no extensions



commit a41352f10074d4acc7b1e7eafe5a1484ee70bed4
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Mon Aug 10 16:55:04 2009 -0700

    Support loading files with no extensions

 src/Imaging/ImageFile.cs   |   35 ++++++++++++++++++++++++++++++-----
 src/Loaders/ImageLoader.cs |   33 +++++++++------------------------
 2 files changed, 39 insertions(+), 29 deletions(-)
---
diff --git a/src/Imaging/ImageFile.cs b/src/Imaging/ImageFile.cs
index e1bb72e..2d729f1 100644
--- a/src/Imaging/ImageFile.cs
+++ b/src/Imaging/ImageFile.cs
@@ -15,6 +15,7 @@ namespace FSpot {
 		protected Uri uri;
 
 		static System.Collections.Hashtable name_table;
+		internal static System.Collections.Hashtable NameTable { get { return name_table; } }
 
 		public ImageFile (string path) 
 		{
@@ -65,6 +66,22 @@ namespace FSpot {
 			name_table [".raf"] = typeof (FSpot.Raf.RafFile);
 			name_table [".x3f"] = typeof (FSpot.X3f.X3fFile);
 
+			// add mimetypes for fallback
+			name_table ["image/bmp"]     = name_table ["image/x-bmp"] = name_table [".bmp"];
+			name_table ["image/gif"]     = name_table [".gif"];
+			name_table ["image/pjpeg"]   = name_table ["image/jpeg"] = name_table ["image/jpg"] = name_table [".jpg"];
+			name_table ["image/x-png"]   = name_table ["image/png"]  = name_table [".png"];
+			name_table ["image/svg+xml"] = name_table [".svg"];
+			name_table ["image/tiff"]    = name_table [".tiff"];
+			name_table ["image/x-dcraw"] = name_table [".raw"];
+			name_table ["image/x-ciff"]  = name_table [".crw"];
+			name_table ["image/x-mrw"]   = name_table [".mrw"];
+			name_table ["image/x-x3f"]   = name_table [".x3f"];
+			name_table ["image/x-orf"]   = name_table [".orf"];
+			name_table ["image/x-nef"]   = name_table [".nef"];
+			name_table ["image/x-cr2"]   = name_table [".cr2"];
+			name_table ["image/x-raf"]   = name_table [".raf"];
+
 			//as xcf pixbufloader is not part of gdk-pixbuf, check if it's there,
 			//and enable it if needed.
 			foreach (Gdk.PixbufFormat format in Gdk.Pixbuf.Formats)
@@ -167,11 +184,21 @@ namespace FSpot {
 		
 		public static bool HasLoader (Uri uri)
 		{
+			return GetLoaderType (uri) != null;
+		}
+
+		private static System.Type GetLoaderType (Uri uri)
+		{
 			string path = uri.AbsolutePath;
 			string extension = System.IO.Path.GetExtension (path).ToLower ();
 			System.Type t = (System.Type) name_table [extension];
-			
-			return (t != null);
+
+			if (t == null) {
+				GLib.FileInfo info = GLib.FileFactory.NewForUri (uri).QueryInfo ("standard::type,standard::content-type", GLib.FileQueryInfoFlags.None, null);
+				t = (System.Type) name_table [info.ContentType];
+			}
+
+			return t;
 		}
 
 		[Obsolete ("use Create (System.Uri) instead")]
@@ -182,9 +209,7 @@ namespace FSpot {
 
 		public static ImageFile Create (Uri uri)
 		{
-			string path = uri.AbsolutePath;
-			string extension = System.IO.Path.GetExtension (path).ToLower ();
-			System.Type t = (System.Type) name_table [extension];
+			System.Type t = GetLoaderType (uri);
 			ImageFile img;
 
 			if (t != null)
diff --git a/src/Loaders/ImageLoader.cs b/src/Loaders/ImageLoader.cs
index 762e66c..94b20fb 100644
--- a/src/Loaders/ImageLoader.cs
+++ b/src/Loaders/ImageLoader.cs
@@ -22,28 +22,10 @@ namespace FSpot.Loaders {
 		static ImageLoader ()
 		{
 			name_table = new Dictionary<string, System.Type> ();
-			name_table [".svg"] = typeof (GdkImageLoader);
-			name_table [".gif"] = typeof (GdkImageLoader);
-			name_table [".bmp"] = typeof (GdkImageLoader);
-			name_table [".jpeg"] = typeof (GdkImageLoader);
-			name_table [".jpg"] = typeof (GdkImageLoader);
-			name_table [".png"] = typeof (GdkImageLoader);
-			name_table [".cr2"] = typeof (GdkImageLoader);
-			name_table [".nef"] = typeof (GdkImageLoader);
-			name_table [".pef"] = typeof (GdkImageLoader);
-			name_table [".raw"] = typeof (GdkImageLoader);
-			name_table [".kdc"] = typeof (GdkImageLoader);
-			name_table [".arw"] = typeof (GdkImageLoader);
-			name_table [".tiff"] = typeof (GdkImageLoader);
-			name_table [".tif"] = typeof (GdkImageLoader);
-			name_table [".orf"] =  typeof (GdkImageLoader);
-			name_table [".srf"] = typeof (GdkImageLoader);
-			name_table [".dng"] = typeof (GdkImageLoader);
-			name_table [".crw"] = typeof (GdkImageLoader);
-			name_table [".ppm"] = typeof (GdkImageLoader);
-			name_table [".mrw"] = typeof (GdkImageLoader);
-			name_table [".raf"] = typeof (GdkImageLoader);
-			name_table [".x3f"] = typeof (GdkImageLoader);
+			System.Type gdk_loader = typeof (GdkImageLoader);
+			foreach (string key in ImageFile.NameTable.Keys) {
+				name_table [key] = gdk_loader;
+			}
 
 			//as xcf pixbufloader is not part of gdk-pixbuf, check if it's there,
 			//and enable it if needed.
@@ -62,8 +44,11 @@ namespace FSpot.Loaders {
 			System.Type t;
 			IImageLoader loader;
 
-			if (!name_table.TryGetValue (extension, out t))
-				throw new Exception ("Loader requested for unknown file type: "+extension);
+			if (!name_table.TryGetValue (extension, out t)) {
+				GLib.FileInfo info = GLib.FileFactory.NewForUri (uri).QueryInfo ("standard::type,standard::content-type", GLib.FileQueryInfoFlags.None, null);
+				if (!name_table.TryGetValue (info.ContentType, out t))
+					throw new Exception ("Loader requested for unknown file type: "+extension);
+			}
 
 			loader = (IImageLoader) System.Activator.CreateInstance (t);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]