aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog15
-rw-r--r--mail/em-format-html.c30
-rw-r--r--mail/em-format.c52
-rw-r--r--mail/em-inline-filter.c19
-rw-r--r--mail/em-utils.c59
-rw-r--r--mail/em-utils.h2
6 files changed, 97 insertions, 80 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 5dfddcb7ce..c4b8061547 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,5 +1,20 @@
2004-05-19 Not Zed <NotZed@Ximian.com>
+ * em-inline-filter.c (emif_add_part): if we end up with an
+ application/octet-stream part, pre-snoop it so we set the right
+ mime type to start with. Fixes #58554.
+
+ * em-format.c (emf_snoop_part): removed, now in em-utils.
+
+ * em-utils.c (em_utils_snoop_type): rah rah, snoop a mime part's
+ type.
+
+ * em-format-html.c (efh_text_plain): Revert jeff's fix for #56290.
+ Ugh, we already have all the citation info in local data. Removed
+ the need for gconf too.
+
+2004-05-19 Not Zed <NotZed@Ximian.com>
+
* em-format-html.c (efh_format_secure): make this match the efhd
stuff.
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index f2d346378a..684d60aed6 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -31,8 +31,6 @@
#include <fcntl.h>
#include <ctype.h>
-#include <gconf/gconf-client.h>
-
#include <gal/util/e-iconv.h>
#include <gal/util/e-util.h> /* for e_utf8_strftime, what about e_time_format_time? */
#include "e-util/e-time-utils.h"
@@ -635,9 +633,8 @@ efh_text_plain(EMFormatHTML *efh, CamelStream *stream, CamelMimePart *part, EMFo
CamelDataWrapper *dw;
CamelContentType *type;
const char *format;
- guint32 rgb, flags;
+ guint32 flags;
int i, count, len;
- GConfClient *gconf;
camel_stream_printf (stream,
"<table bgcolor=\"#%06x\" cellspacing=0 cellpadding=1 width=100%%><tr><td>\n"
@@ -693,30 +690,9 @@ efh_text_plain(EMFormatHTML *efh, CamelStream *stream, CamelMimePart *part, EMFo
camel_object_unref(inline_filter);
camel_content_type_unref(ct);
}
-
- gconf = gconf_client_get_default ();
- if (gconf_client_get_bool (gconf, "/apps/evolution/mail/display/mark_citations", NULL)) {
- GError *err = NULL;
- GdkColor colour;
- char *str;
-
- str = gconf_client_get_string (gconf, "/apps/evolution/mail/display/citation_colour", &err);
- if (err == NULL) {
- gdk_color_parse (str, &colour);
- rgb = ((colour.red & 0xff00) << 8) | (colour.green & 0xff00) | ((colour.blue & 0xff00) >> 8);
- } else {
- /* default colour */
- g_error_free (err);
- rgb = 0x737373;
- }
- g_free (str);
- } else {
- rgb = 0;
- }
- g_object_unref (gconf);
-
+
filtered_stream = camel_stream_filter_new_with_stream(stream);
- html_filter = camel_mime_filter_tohtml_new(flags, rgb);
+ html_filter = camel_mime_filter_tohtml_new(flags, efh->citation_colour);
camel_stream_filter_add(filtered_stream, html_filter);
camel_object_unref(html_filter);
diff --git a/mail/em-format.c b/mail/em-format.c
index e585897d94..35fed724ca 100644
--- a/mail/em-format.c
+++ b/mail/em-format.c
@@ -50,11 +50,11 @@
#include <camel/camel-mime-filter-windows.h>
#include "em-format.h"
+#include "em-utils.h"
#define d(x)
static void emf_builtin_init(EMFormatClass *);
-static const char *emf_snoop_part(CamelMimePart *part);
static const EMFormatHandler *emf_find_handler(EMFormat *emf, const char *mime_type);
static void emf_format_clone(EMFormat *emf, CamelFolder *folder, const char *uid, CamelMimeMessage *msg, EMFormat *emfsource);
@@ -485,7 +485,7 @@ em_format_part_as(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const
if (mime_type != NULL) {
if (g_ascii_strcasecmp(mime_type, "application/octet-stream") == 0)
- emf->snoop_mime_type = mime_type = emf_snoop_part(part);
+ emf->snoop_mime_type = mime_type = em_utils_snoop_type(part);
handle = em_format_find_handler(emf, mime_type);
if (handle == NULL)
@@ -1004,54 +1004,6 @@ em_format_describe_part(CamelMimePart *part, const char *mime_type)
/* ********************************************************************** */
-/* originally from mail-identify.c */
-static const char *
-emf_snoop_part(CamelMimePart *part)
-{
- const char *filename, *name_type = NULL, *magic_type = NULL;
- CamelDataWrapper *dw;
-
- filename = camel_mime_part_get_filename (part);
- if (filename) {
- /* GNOME-VFS will misidentify TNEF attachments as MPEG */
- if (!strcmp (filename, "winmail.dat"))
- return "application/vnd.ms-tnef";
-
- name_type = gnome_vfs_mime_type_from_name(filename);
- }
-
- dw = camel_medium_get_content_object((CamelMedium *)part);
- if (!camel_data_wrapper_is_offline(dw)) {
- CamelStreamMem *mem = (CamelStreamMem *)camel_stream_mem_new();
-
- if (camel_data_wrapper_decode_to_stream(dw, (CamelStream *)mem) > 0)
- magic_type = gnome_vfs_get_mime_type_for_data(mem->buffer->data, mem->buffer->len);
- camel_object_unref(mem);
- }
-
- d(printf("snooped part, magic_type '%s' name_type '%s'\n", magic_type, name_type));
-
- /* If GNOME-VFS doesn't recognize the data by magic, but it
- * contains English words, it will call it text/plain. If the
- * filename-based check came up with something different, use
- * that instead and if it returns "application/octet-stream"
- * try to do better with the filename check.
- */
-
- if (magic_type) {
- if (name_type
- && (!strcmp(magic_type, "text/plain")
- || !strcmp(magic_type, "application/octet-stream")))
- return name_type;
- else
- return magic_type;
- } else
- return name_type;
-
- /* We used to load parts to check their type, we dont anymore,
- see bug #11778 for some discussion */
-}
-
#ifdef ENABLE_SMIME
static void
emf_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info)
diff --git a/mail/em-inline-filter.c b/mail/em-inline-filter.c
index 9fc4294139..4b21cee46d 100644
--- a/mail/em-inline-filter.c
+++ b/mail/em-inline-filter.c
@@ -31,6 +31,8 @@
#include <camel/camel-multipart.h>
#include <camel/camel-stream-mem.h>
+#include "em-utils.h"
+
#define d(x)
static void em_inline_filter_class_init (EMInlineFilterClass *klass);
@@ -120,6 +122,7 @@ emif_add_part(EMInlineFilter *emif, const char *data, int len)
CamelStream *mem;
CamelDataWrapper *dw;
CamelMimePart *part;
+ const char *mimetype;
if (emif->state == EMIF_PLAIN)
type = emif->base_encoding;
@@ -144,12 +147,22 @@ emif_add_part(EMInlineFilter *emif, const char *data, int len)
camel_mime_part_set_encoding(part, type);
camel_object_unref(dw);
- if (emif->filename) {
+ if (emif->filename)
camel_mime_part_set_filename(part, emif->filename);
- g_free(emif->filename);
- emif->filename = NULL;
+
+ /* pre-snoop the mime type of unknown objects, and poke and hack it into place */
+ if (camel_content_type_is(dw->mime_type, "application", "octet-stream")
+ && (mimetype = em_utils_snoop_type(part))
+ && strcmp(mimetype, "application/octet-stream") != 0) {
+ camel_data_wrapper_set_mime_type(dw, mimetype);
+ camel_mime_part_set_content_type(part, mimetype);
+ if (emif->filename)
+ camel_mime_part_set_filename(part, emif->filename);
}
+ g_free(emif->filename);
+ emif->filename = NULL;
+
emif->parts = g_slist_append(emif->parts, part);
}
diff --git a/mail/em-utils.c b/mail/em-utils.c
index e655b456c1..9cf3ff66b4 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -41,6 +41,10 @@
#include <bonobo/bonobo-widget.h>
#include <bonobo/bonobo-event-source.h>
+#include <libgnomevfs/gnome-vfs-mime.h>
+#include <libgnomevfs/gnome-vfs-mime-utils.h>
+#include <libgnomevfs/gnome-vfs-mime-handlers.h>
+
#include "mail-component.h"
#include "mail-mt.h"
#include "mail-ops.h"
@@ -1765,3 +1769,58 @@ em_utils_in_addressbook(CamelInternetAddress *iaddr)
return found;
}
+
+/**
+ * em_utils_snoop_type:
+ * @part:
+ *
+ * Rries to snoop the mime type of a part.
+ *
+ * Return value: NULL if unknown (more likely application/octet-stream).
+ **/
+const char *
+em_utils_snoop_type(CamelMimePart *part)
+{
+ const char *filename, *name_type = NULL, *magic_type = NULL;
+ CamelDataWrapper *dw;
+
+ filename = camel_mime_part_get_filename (part);
+ if (filename) {
+ /* GNOME-VFS will misidentify TNEF attachments as MPEG */
+ if (!strcmp (filename, "winmail.dat"))
+ return "application/vnd.ms-tnef";
+
+ name_type = gnome_vfs_mime_type_from_name(filename);
+ }
+
+ dw = camel_medium_get_content_object((CamelMedium *)part);
+ if (!camel_data_wrapper_is_offline(dw)) {
+ CamelStreamMem *mem = (CamelStreamMem *)camel_stream_mem_new();
+
+ if (camel_data_wrapper_decode_to_stream(dw, (CamelStream *)mem) > 0)
+ magic_type = gnome_vfs_get_mime_type_for_data(mem->buffer->data, mem->buffer->len);
+ camel_object_unref(mem);
+ }
+
+ d(printf("snooped part, magic_type '%s' name_type '%s'\n", magic_type, name_type));
+
+ /* If GNOME-VFS doesn't recognize the data by magic, but it
+ * contains English words, it will call it text/plain. If the
+ * filename-based check came up with something different, use
+ * that instead and if it returns "application/octet-stream"
+ * try to do better with the filename check.
+ */
+
+ if (magic_type) {
+ if (name_type
+ && (!strcmp(magic_type, "text/plain")
+ || !strcmp(magic_type, "application/octet-stream")))
+ return name_type;
+ else
+ return magic_type;
+ } else
+ return name_type;
+
+ /* We used to load parts to check their type, we dont anymore,
+ see bug #11778 for some discussion */
+}
diff --git a/mail/em-utils.h b/mail/em-utils.h
index 4e433ab12d..3fa6be2b1d 100644
--- a/mail/em-utils.h
+++ b/mail/em-utils.h
@@ -100,6 +100,8 @@ char *em_uri_to_camel (const char *euri);
/* is this address in the addressbook? caches results */
gboolean em_utils_in_addressbook(struct _CamelInternetAddress *addr);
+const char *em_utils_snoop_type(struct _CamelMimePart *part);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */