]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-document-factory.c
Updated Portuguese translation.
[evince.git] / libdocument / ev-document-factory.c
index 1bc67ef6f667a0441c4dcda3b7f95ad71493d3e6..5b2473f5e1b2e5e55e66ff3b381b2e9e0eeb7a3d 100644 (file)
@@ -103,40 +103,80 @@ get_compression_from_mime_type (const gchar *mime_type)
        return EV_COMPRESSION_NONE;
 }
 
-static EvDocument *
-get_document_from_uri (const char        *uri,
-                      gboolean           slow,
-                      EvCompressionType *compression,
-                      GError           **error)
+static gchar *
+get_mime_type_from_uri (const gchar *uri)
 {
-       EvDocument *document = NULL;
-       GFile *file;
-       GFileInfo *file_info;
+       GFile       *file;
+       GFileInfo   *file_info;
        const gchar *mime_type;
 
-       *compression = EV_COMPRESSION_NONE;
-
        file = g_file_new_for_uri (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"));                     
+       if (file_info == NULL)
                return NULL;
-       }
+
        mime_type = g_file_info_get_content_type (file_info);
+       g_object_unref (file_info);
+
+       return g_strdup (mime_type);
+}
+
+static gchar *
+get_mime_type_from_data (const gchar *uri)
+{
+       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, NULL);
+       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,
+                      EvCompressionType *compression,
+                      GError           **error)
+{
+       EvDocument *document = NULL;
+       gchar      *mime_type = NULL;
+
+       *compression = EV_COMPRESSION_NONE;
+
+       mime_type = slow ?
+               get_mime_type_from_data (uri) :
+               get_mime_type_from_uri (uri);
+       
        if (mime_type == NULL) {
                g_set_error (error,
                             EV_DOCUMENT_ERROR, 
                             0,
                             _("Unknown MIME Type"));
-               g_object_unref (file_info);
+               g_free (mime_type);
+               
                return NULL;
        }
 
@@ -154,13 +194,14 @@ get_document_from_uri (const char        *uri,
                             EV_DOCUMENT_ERROR, 
                             0,
                             _("Unhandled MIME type: ā€œ%sā€"), mime_type);
-               g_object_unref (file_info);
+               g_free (mime_type);
+               
                return NULL;
        }
 
        *compression = get_compression_from_mime_type (mime_type);
 
-        g_object_unref (file_info);
+       g_free (mime_type);
        
         return document;
 }