[evolution] Bug #674381 - Show contact photo from address book doesn't work



commit 7981771ea6a6ab2729010fc814d427e25f792b31
Author: Dan VrÃtil <dvratil redhat com>
Date:   Fri Apr 27 18:26:49 2012 +0200

    Bug #674381 - Show contact photo from address book doesn't work

 libemail-engine/e-mail-utils.c |   43 ++++++++++++++++++++-------------------
 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 5390ae7..d9eee72 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 d85d202..5886142 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]