]> www.fi.muni.cz Git - evince.git/commitdiff
Use g_content_type_guess () to get mimetype for files. Bug #510401.
authorCosimo Cecchi <cosimoc@svn.gnome.org>
Wed, 30 Jan 2008 20:40:34 +0000 (20:40 +0000)
committerCosimo Cecchi <cosimoc@src.gnome.org>
Wed, 30 Jan 2008 20:40:34 +0000 (20:40 +0000)
2008-01-30  Cosimo Cecchi  <cosimoc@svn.gnome.org>

* libdocument/ev-document-factory.c:
(throw_unknown_mime_type_error), (throw_failed_to_get_info_error),
(get_document_from_uri):

Use g_content_type_guess () to get mimetype for files.
Bug #510401.

svn path=/trunk/; revision=2881

ChangeLog
libdocument/ev-document-factory.c

index 803b7d29bd4251dce4e32ef7e7905182ac0366fd..b915296f974ff4bc70f9a46fb2b1033405bd9f15 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-01-30  Cosimo Cecchi  <cosimoc@svn.gnome.org>
+
+       * libdocument/ev-document-factory.c:
+       (throw_unknown_mime_type_error), (throw_failed_to_get_info_error),
+       (get_document_from_uri):
+
+       Use g_content_type_guess () to get mimetype for files.
+       Bug #510401.
+
 2008-01-30  Carlos Garcia Campos  <carlosgc@gnome.org>
 
        * thumbnailer/Makefile.am:
index 1bc67ef6f667a0441c4dcda3b7f95ad71493d3e6..76ced10848d42f8113308516b1b22a5e356d9e1d 100644 (file)
@@ -103,6 +103,24 @@ get_compression_from_mime_type (const gchar *mime_type)
        return EV_COMPRESSION_NONE;
 }
 
+static void
+throw_unknown_mime_type_error (GError **error)
+{
+       g_set_error (error,
+                    EV_DOCUMENT_ERROR, 
+                    0,
+                    _("Unknown MIME Type"));
+}
+
+static void
+throw_failed_to_get_info_error (GError **error)
+{
+       g_set_error (error,
+                    EV_DOCUMENT_ERROR,
+                    0,
+                    _("Failed to get info for document"));
+}
+
 static EvDocument *
 get_document_from_uri (const char        *uri,
                       gboolean           slow,
@@ -112,7 +130,8 @@ get_document_from_uri (const char        *uri,
        EvDocument *document = NULL;
        GFile *file;
        GFileInfo *file_info;
-       const gchar *mime_type;
+       const char *mime_type;
+       char *content_type = NULL;
 
        *compression = EV_COMPRESSION_NONE;
 
@@ -120,22 +139,16 @@ get_document_from_uri (const char        *uri,
        file_info = g_file_query_info (file,
                                       G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
                                       0, NULL, NULL);
-       g_object_unref (file);
 
        if (file_info == NULL) {
-               g_set_error (error,
-                            EV_DOCUMENT_ERROR,
-                            0,
-                            _("Failed to get info for document"));                     
+               throw_failed_to_get_info_error (error); 
                return NULL;
        }
+
        mime_type = g_file_info_get_content_type (file_info);
 
        if (mime_type == NULL) {
-               g_set_error (error,
-                            EV_DOCUMENT_ERROR, 
-                            0,
-                            _("Unknown MIME Type"));
+               throw_unknown_mime_type_error (error);
                g_object_unref (file_info);
                return NULL;
        }
@@ -150,17 +163,55 @@ get_document_from_uri (const char        *uri,
 #endif /* ENABLE_PIXBUF */
 
        if (document == NULL) {
-               g_set_error (error,
-                            EV_DOCUMENT_ERROR, 
-                            0,
-                            _("Unhandled MIME type: ā€œ%sā€"), mime_type);
-               g_object_unref (file_info);
-               return NULL;
+               /* try to sniff mime type from the content */
+               guchar *buffer;
+               gssize size_read;
+               GFileInputStream *input_stream;
+               
+               input_stream = g_file_read (file, NULL, NULL);
+               buffer = g_malloc (1024);
+               size_read = g_input_stream_read (G_INPUT_STREAM (input_stream),
+                                                buffer,
+                                                1024,
+                                                NULL, NULL);
+               g_input_stream_close (G_INPUT_STREAM (input_stream),
+                                     NULL, NULL);
+               g_object_unref (file);
+               if (size_read == -1) {
+                       throw_failed_to_get_info_error (error);
+                       g_object_unref (file_info);
+                       return NULL;
+               } else  {
+                       content_type = g_content_type_guess (NULL, /* no filename */
+                                                            buffer, 1024,
+                                                            NULL);
+                       g_free (buffer);
+                       if (content_type == NULL) {
+                               throw_unknown_mime_type_error (error);
+                               g_object_unref (file_info);
+                               return NULL;
+                       } else {
+                               document = ev_backends_manager_get_document (content_type);
+                               if (document == NULL) {
+                                       g_set_error (error,
+                                                    EV_DOCUMENT_ERROR, 
+                                                    0,
+                                                    _("Unhandled MIME type: ā€œ%sā€"), content_type);
+                                       g_object_unref (file_info);
+                                       g_free (content_type);
+                                       return NULL;
+                               }
+                               mime_type = content_type;
+                       }
+               }
+       } else {
+               g_object_unref (file);
        }
 
        *compression = get_compression_from_mime_type (mime_type);
 
         g_object_unref (file_info);
+       g_free (content_type);
        
         return document;
 }