aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Vrátil <dvratil@redhat.com>2012-04-28 02:29:02 +0800
committerDan Vrátil <dvratil@redhat.com>2012-04-28 02:35:12 +0800
commitc219cb1dec286cea39c0a7d8455319c3677d3600 (patch)
tree727f8d30360bd49891756db7838285e1f8500bda
parent09faa1a41d7187f3280ed616b141558f46107354 (diff)
downloadgsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.tar
gsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.tar.gz
gsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.tar.bz2
gsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.tar.lz
gsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.tar.xz
gsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.tar.zst
gsoc2013-evolution-c219cb1dec286cea39c0a7d8455319c3677d3600.zip
Bug #674381 - Show contact photo from address book doesn't work
-rw-r--r--libemail-engine/e-mail-utils.c53
-rw-r--r--mail/em-format-html.c13
2 files changed, 43 insertions, 23 deletions
diff --git a/libemail-engine/e-mail-utils.c b/libemail-engine/e-mail-utils.c
index 58fdcc3c3e..b79d6a1a4f 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,46 @@ 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 *filename = g_filename_from_uri (photo->data.uri, NULL, NULL);
+ gchar *data;
+ gsize len;
+
+ if (g_file_get_contents (filename, &data, &len, NULL)) {
+ camel_mime_part_set_content (part, data, len, "image/jpeg");
+ g_free (data);
+ } else {
+ g_object_unref (part);
+ part = NULL;
+ }
+
+ g_free (filename);
+ }
}
G_UNLOCK (photos_cache);
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 6c4c2d7387..6bf6769538 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -861,6 +861,7 @@ efh_busy (EMFormat *emf)
return (priv->format_id != -1);
}
+
static void
efh_base_init (EMFormatHTMLClass *class)
{
@@ -868,6 +869,15 @@ efh_base_init (EMFormatHTMLClass *class)
}
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_class_init (EMFormatHTMLClass *class)
{
GObjectClass *object_class;
@@ -878,6 +888,7 @@ efh_class_init (EMFormatHTMLClass *class)
g_type_class_add_private (class, sizeof (EMFormatHTMLPrivate));
object_class = G_OBJECT_CLASS (class);
+ object_class->constructed = efh_constructed;
object_class->set_property = efh_set_property;
object_class->get_property = efh_get_property;
object_class->finalize = efh_finalize;
@@ -1104,8 +1115,6 @@ efh_init (EMFormatHTML *efh,
CAMEL_MIME_FILTER_TOHTML_MARK_CITATION;
efh->show_icon = TRUE;
efh->state = EM_FORMAT_HTML_STATE_NONE;
-
- e_extensible_load_extensions (E_EXTENSIBLE (efh));
}
GType