aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2010-02-19 06:31:34 +0800
committerMatthew Barnes <mbarnes@redhat.com>2010-02-19 06:32:53 +0800
commit320ec4b32e74fa948f122868ba5474a81fad5875 (patch)
tree67b4c1df1279afdc41826ecd0a6d431873b398f0 /mail
parent6627772b60a58db60522147d1da5f49349dc3897 (diff)
downloadgsoc2013-evolution-320ec4b32e74fa948f122868ba5474a81fad5875.tar.gz
gsoc2013-evolution-320ec4b32e74fa948f122868ba5474a81fad5875.tar.zst
gsoc2013-evolution-320ec4b32e74fa948f122868ba5474a81fad5875.zip
Bug 588833 - Improve account selection heuristics for replies
Diffstat (limited to 'mail')
-rw-r--r--mail/em-utils.c133
1 files changed, 88 insertions, 45 deletions
diff --git a/mail/em-utils.c b/mail/em-utils.c
index a2a6705ae5..d664a635cb 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -2167,77 +2167,120 @@ em_utils_generate_account_hash (void)
}
EAccount *
+em_utils_guess_account (CamelMimeMessage *message,
+ CamelFolder *folder)
+{
+ EAccount *account = NULL;
+
+ g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL);
+
+ if (folder != NULL)
+ g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
+
+ /* check for newsgroup header */
+ if (folder != NULL
+ && camel_medium_get_header (CAMEL_MEDIUM (message), "Newsgroups"))
+ account = guess_account_from_folder (folder);
+
+ /* check for source folder */
+ if (account == NULL && folder != NULL)
+ account = guess_account_from_folder (folder);
+
+ /* then message source */
+ if (account == NULL)
+ account = guess_account_from_message (message);
+
+ return account;
+}
+
+EAccount *
em_utils_guess_account_with_recipients (CamelMimeMessage *message,
CamelFolder *folder)
{
- GHashTable *account_hash = NULL;
EAccount *account = NULL;
- GList *iter, *recipients = NULL;
+ EAccountList *account_list;
+ GHashTable *recipients;
+ EIterator *iter;
const CamelInternetAddress *addr;
const gchar *type;
+ const gchar *key;
+
+ /* This policy is subject to debate and tweaking,
+ * but please also document the rational here. */
g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL);
- account = em_utils_guess_account (message, folder);
- if (account != NULL)
- return account;
+ /* Build a set of email addresses in which to test for membership.
+ * Only the keys matter here; the values just need to be non-NULL. */
+ recipients = g_hash_table_new (g_str_hash, g_str_equal);
type = CAMEL_RECIPIENT_TYPE_TO;
addr = camel_mime_message_get_recipients (message, type);
- if (addr != NULL)
- recipients = g_list_append (recipients, (gpointer) addr);
+ if (addr != NULL) {
+ gint index = 0;
+
+ while (camel_internet_address_get (addr, index++, NULL, &key))
+ g_hash_table_insert (
+ recipients, (gpointer) key,
+ GINT_TO_POINTER (1));
+ }
type = CAMEL_RECIPIENT_TYPE_CC;
addr = camel_mime_message_get_recipients (message, type);
- if (addr != NULL)
- recipients = g_list_append (recipients, (gpointer) addr);
+ if (addr != NULL) {
+ gint index = 0;
- /* finally recipient (to/cc) in account table */
- account_hash = em_utils_generate_account_hash ();
- for (iter = recipients; iter == NULL; iter = iter->next) {
- const gchar *tmp;
- gint ii = 0;
+ while (camel_internet_address_get (addr, index++, NULL, &key))
+ g_hash_table_insert (
+ recipients, (gpointer) key,
+ GINT_TO_POINTER (1));
+ }
- addr = (CamelInternetAddress *) iter->data;
+ /* First Preference: We were given a folder that maps to an
+ * enabled account, and that account's email address appears
+ * in the list of To: or Cc: recipients. */
- /* XXX Is this necessary? */
- if (addr == NULL)
- continue;
+ if (folder != NULL)
+ account = guess_account_from_folder (folder);
- while (camel_internet_address_get (addr, ii++, NULL, &tmp)) {
- account = g_hash_table_lookup (account_hash, tmp);
- if (account != NULL && account->enabled)
- break;
- }
- }
- g_hash_table_destroy (account_hash);
+ if (account == NULL || !account->enabled)
+ goto second_preference;
- return account;
-}
+ if ((key = account->id->address) == NULL)
+ goto second_preference;
-EAccount *
-em_utils_guess_account (CamelMimeMessage *message,
- CamelFolder *folder)
-{
- EAccount *account = NULL;
+ if (g_hash_table_lookup (recipients, key) != NULL)
+ goto exit;
- g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL);
+second_preference:
- if (folder != NULL)
- g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL);
+ /* Second Preference: Choose any enabled account whose email
+ * address appears in the list to To: or Cc: recipients. */
- /* check for newsgroup header */
- if (folder != NULL
- && camel_medium_get_header (CAMEL_MEDIUM (message), "Newsgroups"))
- account = guess_account_from_folder (folder);
+ account_list = e_get_account_list ();
+ iter = e_list_get_iterator (E_LIST (account_list));
+ while (e_iterator_is_valid (iter)) {
+ account = (EAccount *) e_iterator_get (iter);
+ e_iterator_next (iter);
- /* check for source folder */
- if (account == NULL && folder != NULL)
- account = guess_account_from_folder (folder);
+ if (account == NULL || !account->enabled)
+ continue;
- /* then message source */
- if (account == NULL)
- account = guess_account_from_message (message);
+ if ((key = account->id->address) == NULL)
+ continue;
+
+ if (g_hash_table_lookup (recipients, key) != NULL) {
+ g_object_unref (iter);
+ goto exit;
+ }
+ }
+ g_object_unref (iter);
+
+ /* Last Preference: Defer to em_utils_guess_account(). */
+ account = em_utils_guess_account (message, folder);
+
+exit:
+ g_hash_table_destroy (recipients);
return account;
}