X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libdocument%2Fev-document-factory.c;h=5b2473f5e1b2e5e55e66ff3b381b2e9e0eeb7a3d;hb=dd729a4b395b2a0efe75c2364f59a8eab1967da6;hp=1bc67ef6f667a0441c4dcda3b7f95ad71493d3e6;hpb=e912e532fd67211aa87ac79414efb30f30a00fab;p=evince.git diff --git a/libdocument/ev-document-factory.c b/libdocument/ev-document-factory.c index 1bc67ef6..5b2473f5 100644 --- a/libdocument/ev-document-factory.c +++ b/libdocument/ev-document-factory.c @@ -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; }