From 6181a8992c45c0f124bbc7e9fb83d1ac963d6435 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 24 May 2001 21:44:40 +0000 Subject: If the message data is online, sniff the data for a MIME type first, and * mail-identify.c (mail_identify_mime_part): If the message data is online, sniff the data for a MIME type first, and use the filename second. Makes it more reliable, and deals with the specific case of "application/octet-stream; name=foo.vcf" which gnome-vfs will identify as vcalendar, but which can also be a vcard. svn path=/trunk/; revision=9968 --- mail/ChangeLog | 9 +++++++ mail/mail-identify.c | 68 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index df563ece1f..73f21a0fbb 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,12 @@ +2001-05-24 Dan Winship + + * mail-identify.c (mail_identify_mime_part): If the message data + is online, sniff the data for a MIME type first, and use the + filename second. Makes it more reliable, and deals with the + specific case of "application/octet-stream; name=foo.vcf" which + gnome-vfs will identify as vcalendar, but which can also be a + vcard. + 2001-05-24 Jeffrey Stedfast * mail-format.c (try_inline_pgp_sig): Only write the message up to diff --git a/mail/mail-identify.c b/mail/mail-identify.c index 731c3d9fcc..d99c42894c 100644 --- a/mail/mail-identify.c +++ b/mail/mail-identify.c @@ -34,6 +34,8 @@ #include #include "mail.h" +static const char *identify_by_magic (CamelDataWrapper *data, MailDisplay *md); + /** * mail_identify_mime_part: * @part: a CamelMimePart @@ -46,10 +48,17 @@ char * mail_identify_mime_part (CamelMimePart *part, MailDisplay *md) { const char *filename, *type; - GnomeVFSMimeSniffBuffer *sniffer; - CamelStream *memstream; CamelDataWrapper *data; - GByteArray *ba; + + /* If the MIME part data is online, try file magic first, + * since it's more reliable. + */ + data = camel_medium_get_content_object (CAMEL_MEDIUM (part)); + if (!camel_data_wrapper_is_offline (data)) { + type = identify_by_magic (data, md); + if (type) + return g_strdup (type); + } /* Try identifying based on name in Content-Type or * filename in Content-Disposition. @@ -62,35 +71,40 @@ mail_identify_mime_part (CamelMimePart *part, MailDisplay *md) return g_strdup (type); } - - /* Try file magic. */ - data = camel_medium_get_content_object (CAMEL_MEDIUM (part)); - /* FIXME: In a perfect world, we would not load the content just - * to identify the MIME type. - */ - if (mail_content_loaded (data, md)) { - ba = g_byte_array_new (); - memstream = camel_stream_mem_new_with_byte_array (ba); - camel_data_wrapper_write_to_stream (data, memstream); - if (ba->len) { - sniffer = gnome_vfs_mime_sniff_buffer_new_from_memory ( - ba->data, ba->len); - type = gnome_vfs_get_mime_type_for_buffer (sniffer); - gnome_vfs_mime_sniff_buffer_free (sniffer); - } else - type = NULL; - camel_object_unref (CAMEL_OBJECT (memstream)); - - if (type) - return g_strdup (type); - } - /* Another possibility to try is the x-mac-type / x-mac-creator * parameter to Content-Type used by some Mac email clients. That * would require a Mac type to mime type conversion table. */ + /* If the data part is offline, then we didn't try magic + * before, so force it to be loaded so we can try again later. + * FIXME: In a perfect world, we would not load the content + * just to identify the MIME type. + */ + if (camel_data_wrapper_is_offline (data)) + mail_content_loaded (data, md); - /* We give up. */ return NULL; } + +static const char * +identify_by_magic (CamelDataWrapper *data, MailDisplay *md) +{ + GnomeVFSMimeSniffBuffer *sniffer; + CamelStream *memstream; + const char *type; + GByteArray *ba; + + ba = g_byte_array_new (); + memstream = camel_stream_mem_new_with_byte_array (ba); + camel_data_wrapper_write_to_stream (data, memstream); + if (ba->len) { + sniffer = gnome_vfs_mime_sniff_buffer_new_from_memory (ba->data, ba->len); + type = gnome_vfs_get_mime_type_for_buffer (sniffer); + gnome_vfs_mime_sniff_buffer_free (sniffer); + } else + type = NULL; + camel_object_unref (CAMEL_OBJECT (memstream)); + + return type; +} -- cgit