diff options
-rw-r--r-- | libemail-engine/e-mail-utils.c | 43 | ||||
-rw-r--r-- | mail/em-format-html.c | 37 |
2 files changed, 56 insertions, 24 deletions
diff --git a/libemail-engine/e-mail-utils.c b/libemail-engine/e-mail-utils.c index 5390ae771a..d9eee7216c 100644 --- a/libemail-engine/e-mail-utils.c +++ b/libemail-engine/e-mail-utils.c @@ -693,8 +693,8 @@ em_utils_contact_photo (CamelInternetAddress *cia, const gchar *addr = NULL; CamelMimePart *part = NULL; EContactPhoto *photo = NULL; - GSList *p, *first_not_null = NULL; - gint count_not_null = 0; + GSList *p, *last = NULL; + gint cache_len; if (cia == NULL || !camel_internet_address_get (cia, 0, NULL, &addr) || !addr) { return NULL; @@ -703,22 +703,21 @@ em_utils_contact_photo (CamelInternetAddress *cia, G_LOCK (photos_cache); /* search a cache first */ + cache_len = 0; + last = NULL; for (p = photos_cache; p; p = p->next) { PhotoInfo *pi = p->data; if (!pi) continue; - if (pi->photo) { - if (!first_not_null) - first_not_null = p; - count_not_null++; - } - if (g_ascii_strcasecmp (addr, pi->address) == 0) { photo = pi->photo; break; } + + cache_len++; + last = p; } /* !p means the address had not been found in the cache */ @@ -726,34 +725,36 @@ em_utils_contact_photo (CamelInternetAddress *cia, addr, local_only, extract_photo_data, &photo)) { PhotoInfo *pi; - if (photo && photo->type != E_CONTACT_PHOTO_TYPE_INLINED) { - e_contact_photo_free (photo); - photo = NULL; - } - /* keep only up to 10 photos in memory */ - if (photo && count_not_null >= 10 && first_not_null) { - pi = first_not_null->data; - + if (last && (cache_len >= 10)) { + pi = last->data; photos_cache = g_slist_remove (photos_cache, pi); - emu_free_photo_info (pi); + if (pi) + emu_free_photo_info (pi); } pi = g_new0 (PhotoInfo, 1); pi->address = g_strdup (addr); pi->photo = photo; - photos_cache = g_slist_append (photos_cache, pi); + photos_cache = g_slist_prepend (photos_cache, pi); } /* some photo found, use it */ if (photo) { /* Form a mime part out of the photo */ part = camel_mime_part_new (); - camel_mime_part_set_content (part, - (const gchar *) photo->data.inlined.data, - photo->data.inlined.length, "image/jpeg"); + + if (photo->type == E_CONTACT_PHOTO_TYPE_INLINED) { + camel_mime_part_set_content (part, + (const gchar *) photo->data.inlined.data, + photo->data.inlined.length, "image/jpeg"); + } else { + gchar *s = g_filename_from_uri (photo->data.uri, NULL, NULL); + camel_mime_part_set_filename (part, s); + g_free (s); + } } G_UNLOCK (photos_cache); diff --git a/mail/em-format-html.c b/mail/em-format-html.c index d85d202e69..5886142d6e 100644 --- a/mail/em-format-html.c +++ b/mail/em-format-html.c @@ -1488,6 +1488,15 @@ efh_finalize (GObject *object) } static void +efh_constructed (GObject *object) +{ + /* Chain up to parent's constructed() method. */ + G_OBJECT_CLASS (parent_class)->constructed (object); + + e_extensible_load_extensions (E_EXTENSIBLE (object)); +} + +static void efh_write_attachment (EMFormat *emf, EMFormatPURI *puri, CamelStream *stream, @@ -1671,6 +1680,7 @@ efh_class_init (EMFormatHTMLClass *klass) emf_class->write = efh_write; object_class = G_OBJECT_CLASS (klass); + object_class->constructed = efh_constructed; object_class->set_property = efh_set_property; object_class->get_property = efh_get_property; object_class->finalize = efh_finalize; @@ -1831,8 +1841,6 @@ efh_init (EMFormatHTML *efh, CAMEL_MIME_FILTER_TOHTML_CONVERT_SPACES | CAMEL_MIME_FILTER_TOHTML_MARK_CITATION; efh->show_icon = TRUE; - - e_extensible_load_extensions (E_EXTENSIBLE (efh)); } GType @@ -2608,8 +2616,31 @@ write_contact_picture (CamelMimePart *part, gint size, GString *buffer) CamelContentType *ct; GByteArray *ba; + ba = NULL; dw = camel_medium_get_content (CAMEL_MEDIUM (part)); - ba = camel_data_wrapper_get_byte_array (dw); + if (dw) { + ba = camel_data_wrapper_get_byte_array (dw); + } + + if (!ba || ba->len == 0) { + + if (camel_mime_part_get_filename (part)) { + + if (size >= 0) { + g_string_append_printf ( + buffer, + "<img width=\"%d\" src=\"evo-file://%s\" />", + size, camel_mime_part_get_filename (part)); + } else { + g_string_append_printf ( + buffer, + "<img src=\"evo-file://%s\" />", + camel_mime_part_get_filename (part)); + } + } + + return; + } b64 = g_base64_encode (ba->data, ba->len); ct = camel_mime_part_get_content_type (part); |