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=962f42a604250c39857e9df399ed0a29ab4cba36;hb=1d26c7c94ab8b6102c8e426b5174dd001fff53fb;hp=1bc67ef6f667a0441c4dcda3b7f95ad71493d3e6;hpb=e912e532fd67211aa87ac79414efb30f30a00fab;p=evince.git diff --git a/libdocument/ev-document-factory.c b/libdocument/ev-document-factory.c index 1bc67ef6..962f42a6 100644 --- a/libdocument/ev-document-factory.c +++ b/libdocument/ev-document-factory.c @@ -103,18 +103,12 @@ 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; + 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, @@ -122,21 +116,67 @@ get_document_from_uri (const char *uri, 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_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) +{ + 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; } - 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, 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; }