]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-document-factory.c
Use the content type to get the description, not the MIME type.
[evince.git] / libdocument / ev-document-factory.c
index 64eaabaa25d52ac37487db5cf3367ab05c6dbca9..f0172ff8f4a4db86edd9ec32af2de5cab8e89a91 100644 (file)
 #endif
 
 #include <string.h>
+
 #include <gio/gio.h>
 #include <glib/gstdio.h>
-#include <glib/gi18n.h>
-#include <gtk/gtkfilechooserdialog.h>
+#include <glib/gi18n-lib.h>
+#include <gtk/gtk.h>
 
 #include "ev-backends-manager.h"
 #include "ev-document-factory.h"
@@ -103,61 +104,9 @@ get_compression_from_mime_type (const gchar *mime_type)
        return EV_COMPRESSION_NONE;
 }
 
-static gchar *
-get_mime_type_from_uri (const gchar *uri, GError **error)
-{
-       GFile     *file;
-       GFileInfo *file_info;
-       gchar     *mime_type;
-
-       file = g_file_new_for_uri (uri);
-       file_info = g_file_query_info (file,
-                                      G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
-                                      0, NULL, error);
-       g_object_unref (file);
-
-       if (file_info == NULL)
-               return NULL;
-
-       mime_type = g_strdup (g_file_info_get_content_type (file_info));
-       g_object_unref (file_info);
-
-       return mime_type;
-}
-
-static gchar *
-get_mime_type_from_data (const gchar *uri, GError **error)
-{
-       GFile            *file;
-       GFileInputStream *input_stream;
-       gssize            size_read;
-       guchar            buffer[1024];
-
-       file = g_file_new_for_uri (uri);
-       
-       input_stream = g_file_read (file, NULL, error);
-       if (!input_stream) {
-               g_object_unref (file);
-               return NULL;
-       }
-
-       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)
-               return NULL;
-
-       return g_content_type_guess (NULL, /* no filename */
-                                    buffer, 1024,
-                                    NULL);
-}
-
 static EvDocument *
 get_document_from_uri (const char        *uri,
-                      gboolean           slow,
+                      gboolean           fast,
                       EvCompressionType *compression,
                       GError           **error)
 {
@@ -166,12 +115,17 @@ get_document_from_uri (const char        *uri,
 
        *compression = EV_COMPRESSION_NONE;
 
-       mime_type = slow ?
-               get_mime_type_from_data (uri, error) :
-               get_mime_type_from_uri (uri, error);
+       mime_type = ev_file_get_mime_type (uri, fast, error);
 
        if (mime_type == NULL) {
                g_free (mime_type);
+
+               if (*error == NULL) {
+                       g_set_error_literal (error,
+                                             EV_DOCUMENT_ERROR,
+                                             EV_DOCUMENT_ERROR_INVALID,
+                                             _("Unknown MIME Type"));
+               }
                
                return NULL;
        }
@@ -184,15 +138,19 @@ get_document_from_uri (const char        *uri,
 #endif /* ENABLE_PIXBUF */
 
        if (document == NULL) {
-               gchar *mime_desc;
+               gchar *content_type, *mime_desc = NULL;
+
+               content_type = g_content_type_from_mime_type (mime_type);
+               if (content_type)
+                       mime_desc = g_content_type_get_description (content_type);
 
-               mime_desc = g_content_type_get_description (mime_type);
                g_set_error (error,
                             EV_DOCUMENT_ERROR, 
-                            0,
+                            EV_DOCUMENT_ERROR_INVALID,
                             _("File type %s (%s) is not supported"),
-                            mime_desc, mime_type);
+                            mime_desc ? mime_desc : "-", mime_type);
                g_free (mime_desc);
+               g_free (content_type);
                g_free (mime_type);
 
                return NULL;
@@ -223,7 +181,7 @@ ev_document_factory_get_document (const char *uri, GError **error)
        EvCompressionType compression;
        gchar *uri_unc = NULL;
 
-       document = get_document_from_uri (uri, FALSE, &compression, error);
+       document = get_document_from_uri (uri, TRUE, &compression, error);
        if (*error == NULL) {
                uri_unc = ev_file_uncompress (uri, compression, error);
                if (uri_unc) {
@@ -263,7 +221,7 @@ ev_document_factory_get_document (const char *uri, GError **error)
 
        uri_unc = NULL;
 
-       document = get_document_from_uri (uri, TRUE, &compression, error);
+       document = get_document_from_uri (uri, FALSE, &compression, error);
 
        if (*error != NULL) {
                return NULL;
@@ -288,10 +246,10 @@ ev_document_factory_get_document (const char *uri, GError **error)
 
        if (result == FALSE) {
                if (*error == NULL) {
-                       g_set_error (error,
-                                    EV_DOCUMENT_ERROR,
-                                    0,
-                                    _("Unknown MIME Type"));
+                       g_set_error_literal (error,
+                                             EV_DOCUMENT_ERROR,
+                                             EV_DOCUMENT_ERROR_INVALID,
+                                             _("Unknown MIME Type"));
                } else if ((*error)->domain == EV_DOCUMENT_ERROR &&
                           (*error)->code == EV_DOCUMENT_ERROR_ENCRYPTED) {
                        return document;