aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-utils.c')
-rw-r--r--mail/em-utils.c94
1 files changed, 93 insertions, 1 deletions
diff --git a/mail/em-utils.c b/mail/em-utils.c
index e4d53ba12b..cfd12c6d0c 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -1927,7 +1927,7 @@ em_utils_in_addressbook(CamelInternetAddress *iaddr)
stop = err->domain == E_BOOK_ERROR && err->code == E_BOOK_ERROR_CANCELLED;
mail_cancel_hook_remove(hook);
g_object_unref(book);
- g_warning("Can't get contacts: %s", err->message);
+ d(g_warning("Can't get contacts: %s", err->message));
g_clear_error(&err);
continue;
}
@@ -1959,6 +1959,98 @@ em_utils_in_addressbook(CamelInternetAddress *iaddr)
return found;
}
+struct _CamelMimePart *
+em_utils_contact_photo (struct _CamelInternetAddress *cia, gboolean local)
+{
+ const char *addr;
+ int stop = FALSE, found = FALSE;
+ GSList *s, *g, *addr_sources = NULL;
+ GError *err = NULL;
+ EBookQuery *query = NULL;
+ ESource *source = NULL;
+ GList *contacts = NULL;
+ EContact *contact = NULL;
+ EContactPhoto *photo = NULL;
+ EBook *book = NULL;
+ CamelMimePart *part;
+
+ if (cia == NULL || !camel_internet_address_get(cia, 0, NULL, &addr)){
+ return NULL;
+ }
+
+ if (!emu_addr_list){
+ if (!e_book_get_addressbooks(&emu_addr_list, &err)){
+ g_error_free(err);
+ return NULL;
+ }
+ }
+
+ query = e_book_query_field_test(E_CONTACT_EMAIL, E_BOOK_QUERY_IS, addr);
+ for (g = e_source_list_peek_groups(emu_addr_list); g; g = g_slist_next(g)) {
+ if (local && strcmp (e_source_group_peek_name ((ESourceGroup *)g->data), "On This Computer"))
+ continue;
+ printf("%d %s\n", local, e_source_group_peek_name ((ESourceGroup *)g->data));
+ for (s = e_source_group_peek_sources((ESourceGroup *)g->data); s; s=g_slist_next(s)) {
+ ESource *src = s->data;
+ const char *completion = e_source_get_property (src, "completion");
+
+ if (completion && !g_ascii_strcasecmp (completion, "true")) {
+ addr_sources = g_slist_prepend(addr_sources, src);
+ g_object_ref(src);
+ }
+ }
+ }
+
+ for (s = addr_sources;!stop && !found && s;s=g_slist_next(s)) {
+ source = s->data;
+
+ book = e_book_new(source, &err);
+ if (!e_book_open(book, TRUE, &err)
+ || !e_book_get_contacts(book, query, &contacts, &err)) {
+ stop = err->domain == E_BOOK_ERROR && err->code == E_BOOK_ERROR_CANCELLED;
+ g_object_unref(book);
+ d(g_warning("Can't get contacts: %s", err->message));
+ g_clear_error(&err);
+ continue;
+ }
+
+ if (contacts != NULL) {
+ found = TRUE;
+
+ /* Doesn't matter, we consider the first contact only*/
+ contact = contacts->data;
+ photo = e_contact_get (contact, E_CONTACT_PHOTO);
+ if (!photo)
+ photo = e_contact_get (contact, E_CONTACT_LOGO);
+ g_list_foreach (contacts, (GFunc)g_object_unref, NULL);
+ g_list_free (contacts);
+ }
+ g_object_unref (source); /* Is it? */
+ g_object_unref(book);
+ }
+
+ g_slist_free(addr_sources);
+ e_book_query_unref(query);
+
+ if (!photo)
+ return NULL;
+
+ if (photo->type != E_CONTACT_PHOTO_TYPE_INLINED) {
+ e_contact_photo_free (photo);
+ return NULL;
+ }
+
+ /* Form a mime part out of the photo */
+ part = camel_mime_part_new();
+ camel_mime_part_set_content(part,
+ (const char *) photo->data.inlined.data,
+ photo->data.inlined.length, "image/jpeg");
+
+ e_contact_photo_free (photo);
+
+ return part;
+}
+
/**
* em_utils_snoop_type:
* @part: