aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog16
-rw-r--r--mail/em-folder-view.c22
-rw-r--r--mail/em-format-html.c31
-rw-r--r--mail/em-format.c2
-rw-r--r--mail/em-format.h2
-rw-r--r--mail/em-mailer-prefs.c9
-rw-r--r--mail/em-mailer-prefs.h2
-rw-r--r--mail/em-utils.c94
-rw-r--r--mail/em-utils.h1
-rw-r--r--mail/evolution-mail.schemas.in.in27
-rw-r--r--mail/mail-config.glade128
11 files changed, 330 insertions, 4 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index bd2d3c2f96..c9385fb5ce 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,19 @@
+2007-06-02 Srinivasa Ragavan <sragavan@novell.com>
+
+ ** Adds support for Contact Image in the preview pane
+
+ * em-folder-view.c: (emfv_message_selected_timeout),
+ (emfv_setting_notify):
+ * em-format-html.c: (efh_format_headers):
+ * em-format.c: (emf_init):
+ * em-format.h:
+ * em-mailer-prefs.c: (em_mailer_prefs_construct):
+ * em-mailer-prefs.h:
+ * em-utils.c: (em_utils_in_addressbook), (em_utils_contact_photo):
+ * em-utils.h:
+ * evolution-mail.schemas.in.in:
+ * mail-config.glade:
+
2007-05-31 Daniel Nylander <po@danielnylander.se>
*default/sv : Added Swedish Welcome mail.
diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c
index 9dd72f8522..fa162af44d 100644
--- a/mail/em-folder-view.c
+++ b/mail/em-folder-view.c
@@ -2364,7 +2364,7 @@ emfv_message_selected_timeout(void *data)
g_object_ref (emfv);
/* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */
e_profile_event_emit("goto.load", emfv->displayed_uid, 0);
- hstream = gtk_html_begin(((EMFormatHTML *)emfv->preview)->html);
+/* hstream = gtk_html_begin(((EMFormatHTML *)emfv->preview)->html);
g_signal_connect(((EMFormatHTML *)emfv->preview)->html, "object_requested", G_CALLBACK(emfv_spin), NULL);
@@ -2372,7 +2372,7 @@ emfv_message_selected_timeout(void *data)
_("Retrieving Message"),
emfv->displayed_uid);
gtk_html_stream_close(hstream, GTK_HTML_STREAM_OK);
-
+*/
mail_get_messagex(emfv->folder, emfv->displayed_uid, emfv_list_done_message_selected, emfv, mail_thread_queued);
} else {
e_profile_event_emit("goto.empty", "", 0);
@@ -2661,6 +2661,8 @@ enum {
EMFV_SHOW_DELETED,
EMFV_THREAD_LIST,
EMFV_PANED_SIZE,
+ EMFV_SENDER_PHOTO,
+ EMFV_PHOTO_LOCAL,
EMFV_SETTINGS /* last, for loop count */
};
@@ -2680,6 +2682,8 @@ static const char * const emfv_display_keys[] = {
"show_deleted",
"thread_list",
"paned_size",
+ "sender_photo",
+ "photo_local",
};
static GHashTable *emfv_setting_key;
@@ -2770,6 +2774,20 @@ emfv_setting_notify(GConfClient *gconf, guint cnxn_id, GConfEntry *entry, EMFold
if (emf->message)
em_format_redraw(emf);
break; }
+ case EMFV_SENDER_PHOTO: {
+ EMFormat *emf = (EMFormat *)emfv->preview;
+
+ emf->show_photo = gconf_value_get_bool (value);
+ if (emf->message)
+ em_format_redraw(emf);
+
+ break; }
+ case EMFV_PHOTO_LOCAL: {
+ EMFormat *emf = (EMFormat *)emfv->preview;
+
+ emf->photo_local = gconf_value_get_bool (value);
+
+ break; }
case EMFV_SHOW_PREVIEW: {
gboolean state_gconf, state_camel;
char *ret;
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 66ca8885b9..3ce658cfe1 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -1748,7 +1748,9 @@ efh_format_headers(EMFormatHTML *efh, CamelStream *stream, CamelMedium *part)
CamelContentType *ct;
struct _camel_header_raw *header;
gboolean have_icon = FALSE;
-
+ const char *photo_name = NULL;
+ CamelInternetAddress *cia = NULL;
+
ct = camel_mime_part_get_content_type((CamelMimePart *)part);
charset = camel_content_type_param (ct, "charset");
charset = e_iconv_charset_name(charset);
@@ -1777,6 +1779,10 @@ efh_format_headers(EMFormatHTML *efh, CamelStream *stream, CamelMedium *part)
mailer = !g_ascii_strcasecmp (h->name, "X-Evolution-Mailer");
while (header) {
+
+ if (emf->show_photo && !photo_name && !g_ascii_strcasecmp (header->name, "From"))
+ photo_name = header->value;
+
if (!mailer_shown && mailer && (!g_ascii_strcasecmp (header->name, "X-Mailer") ||
!g_ascii_strcasecmp (header->name, "User-Agent") ||
!g_ascii_strcasecmp (header->name, "X-Newsreader"))) {
@@ -1801,6 +1807,29 @@ efh_format_headers(EMFormatHTML *efh, CamelStream *stream, CamelMedium *part)
if (!efh->simple_headers) {
camel_stream_printf(stream, "</table></td>");
+ if (photo_name) {
+ char *classid;
+ CamelMimePart *photopart;
+
+ cia = camel_internet_address_new();
+ camel_address_decode((CamelAddress *) cia, (const char *) photo_name);
+ photopart = em_utils_contact_photo (cia, emf->photo_local);
+
+ if (photopart) {
+ classid = g_strdup_printf("icon:///em-format-html/%s/photo/header",
+ emf->part_id->str);
+ camel_stream_printf(stream,
+ "<td align=\"right\" valign=\"top\"><img width=64 src=\"%s\"></td>",
+ classid);
+ em_format_add_puri(emf, sizeof(EMFormatPURI), classid,
+ photopart, efh_write_image);
+ camel_object_unref(photopart);
+
+ g_free(classid);
+ }
+ camel_object_unref(cia);
+ }
+
if (have_icon && efh->show_icon) {
GtkIconInfo *icon_info;
char *classid;
diff --git a/mail/em-format.c b/mail/em-format.c
index 1871e885c3..cb3f418e38 100644
--- a/mail/em-format.c
+++ b/mail/em-format.c
@@ -121,6 +121,8 @@ emf_init(GObject *o)
emf->inline_table = g_hash_table_new(g_str_hash, g_str_equal);
emf->composer = FALSE;
+ emf->show_photo = TRUE;
+ emf->photo_local = TRUE;
e_dlist_init(&emf->header_list);
em_format_default_headers(emf);
emf->part_id = g_string_new("");
diff --git a/mail/em-format.h b/mail/em-format.h
index 3d2a82ef67..ca3cafc53d 100644
--- a/mail/em-format.h
+++ b/mail/em-format.h
@@ -227,6 +227,8 @@ struct _EMFormat {
char *charset; /* charset override */
char *default_charset; /* charset fallback */
gboolean composer; /* Formatting from composer ?*/
+ gboolean show_photo; /* Want to show the photo of the sender ?*/
+ gboolean photo_local; /* Photos only from local addressbooks */
};
struct _EMFormatClass {
diff --git a/mail/em-mailer-prefs.c b/mail/em-mailer-prefs.c
index 7caeee32a3..9c61eddfec 100644
--- a/mail/em-mailer-prefs.c
+++ b/mail/em-mailer-prefs.c
@@ -1084,6 +1084,15 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs)
/* headers */
locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/headers", NULL);
+
+ prefs->photo_show= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "photo_show"));
+ toggle_button_init (prefs, prefs->photo_show, FALSE,
+ "/apps/evolution/mail/display/sender_photo",
+ G_CALLBACK (toggle_button_toggled));
+ prefs->photo_local = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "photo_local"));
+ toggle_button_init (prefs, prefs->photo_local, FALSE,
+ "/apps/evolution/mail/display/photo_local",
+ G_CALLBACK (toggle_button_toggled));
/* always de-sensitised until the user types something in the entry */
prefs->add_header = GTK_BUTTON (glade_xml_get_widget (gui, "cmdHeadersAdd"));
diff --git a/mail/em-mailer-prefs.h b/mail/em-mailer-prefs.h
index f6adc4593e..6426e3fd41 100644
--- a/mail/em-mailer-prefs.h
+++ b/mail/em-mailer-prefs.h
@@ -119,6 +119,8 @@ struct _EMMailerPrefs {
struct _GtkEntry *entry_header;
struct _GtkTreeView *header_list;
struct _GtkListStore *header_list_store;
+ struct _GtkToggleButton *photo_show;
+ struct _GtkToggleButton *photo_local;
/* Junk prefs */
struct _GtkToggleButton *check_incoming;
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:
diff --git a/mail/em-utils.h b/mail/em-utils.h
index 97b1aedfff..3f3da78650 100644
--- a/mail/em-utils.h
+++ b/mail/em-utils.h
@@ -103,6 +103,7 @@ char *em_uri_to_camel (const char *euri);
/* is this address in the addressbook? caches results */
gboolean em_utils_in_addressbook(struct _CamelInternetAddress *addr);
+struct _CamelMimePart *em_utils_contact_photo (struct _CamelInternetAddress *addr, gboolean local);
const char *em_utils_snoop_type(struct _CamelMimePart *part);
diff --git a/mail/evolution-mail.schemas.in.in b/mail/evolution-mail.schemas.in.in
index 6f9f66b0c0..4bffe3cb99 100644
--- a/mail/evolution-mail.schemas.in.in
+++ b/mail/evolution-mail.schemas.in.in
@@ -288,6 +288,33 @@
</schema>
<schema>
+ <key>/schemas/apps/evolution/mail/display/sender_photo</key>
+ <applyto>/apps/evolution/mail/display/sender_photo</applyto>
+ <owner>evolution-mail</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short>Show photo of the sender</short>
+ <long>
+ Show the photo of the sender in the message reading pane.
+ </long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/apps/evolution/mail/display/photo_local</key>
+ <applyto>/apps/evolution/mail/display/photo_local</applyto>
+ <owner>evolution-mail</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short>Search for the sender photo in local addressbooks </short>
+ <long>
+ This option would help in improving the speed of fetching.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
<key>/schemas/apps/evolution/mail/display/mime_types</key>
<applyto>/apps/evolution/mail/display/mime_types</applyto>
<owner>evolution-mail</owner>
diff --git a/mail/mail-config.glade b/mail/mail-config.glade
index 2d94f86894..0fe68716c8 100644
--- a/mail/mail-config.glade
+++ b/mail/mail-config.glade
@@ -6361,6 +6361,134 @@ For example: &quot;Work&quot; or &quot;Personal&quot;</property>
<property name="spacing">6</property>
<child>
+ <widget class="GtkVBox" id="vbox206">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">3</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox238">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="label587">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Sender Photograph&lt;/b&gt;</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox206">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox239">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkCheckButton" id="photo_show">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Show the photograph of sender in the email preview</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox240">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkCheckButton" id="photo_local">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">S_earch for sender photograph only in local addressbooks</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
<widget class="GtkLabel" id="label524">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;span weight=&quot;bold&quot;&gt;Displayed Mail _Headers&lt;/span&gt;</property>