X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=libdocument%2Fev-document-factory.c;h=a920be60bcfe06e2a051866700212b29160a7639;hb=5e55b6b5e74175b5638337616b84527fb8286908;hp=1bc67ef6f667a0441c4dcda3b7f95ad71493d3e6;hpb=e912e532fd67211aa87ac79414efb30f30a00fab;p=evince.git diff --git a/libdocument/ev-document-factory.c b/libdocument/ev-document-factory.c index 1bc67ef6..a920be60 100644 --- a/libdocument/ev-document-factory.c +++ b/libdocument/ev-document-factory.c @@ -23,6 +23,7 @@ #endif #include + #include #include #include @@ -103,64 +104,111 @@ 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, GError **error) { - EvDocument *document = NULL; - GFile *file; + GFile *file; GFileInfo *file_info; - const gchar *mime_type; - - *compression = EV_COMPRESSION_NONE; + 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, NULL); + 0, NULL, error); 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_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; } - mime_type = g_file_info_get_content_type (file_info); + + 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, error); + + 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, error) : + get_mime_type_from_uri (uri, error); if (mime_type == NULL) { - g_set_error (error, - EV_DOCUMENT_ERROR, - 0, - _("Unknown MIME Type")); - g_object_unref (file_info); + g_free (mime_type); + + if (*error == NULL) { + g_set_error (error, + EV_DOCUMENT_ERROR, + 0, + _("Unknown MIME Type")); + } + return NULL; } + document = ev_backends_manager_get_document (mime_type); + #ifdef ENABLE_PIXBUF - if (mime_type_supported_by_gdk_pixbuf (mime_type)) + if (!document && mime_type_supported_by_gdk_pixbuf (mime_type)) document = ev_backends_manager_get_document ("image/*"); - else - document = ev_backends_manager_get_document (mime_type); -#else - document = ev_backends_manager_get_document (mime_type); #endif /* ENABLE_PIXBUF */ if (document == NULL) { + gchar *mime_desc; + + mime_desc = g_content_type_get_description (mime_type); g_set_error (error, EV_DOCUMENT_ERROR, 0, - _("Unhandled MIME type: “%s”"), mime_type); - g_object_unref (file_info); + _("File type %s (%s) is not supported"), + mime_desc, mime_type); + g_free (mime_desc); + 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; }