diff options
| author | Milan Crha <mcrha@redhat.com> | 2013-03-05 21:15:10 +0800 | 
|---|---|---|
| committer | Milan Crha <mcrha@redhat.com> | 2013-03-05 21:15:10 +0800 | 
| commit | 0f04843c8b25e06d5cbed20e5173fe61fa10dde2 (patch) | |
| tree | ae0ce2306285a870206c657e12b93a30b90233d8 | |
| parent | b31eb86d8bbbe50b6eec42ad574ad06e04f52198 (diff) | |
| download | gsoc2013-evolution-0f04843c8b25e06d5cbed20e5173fe61fa10dde2.tar.gz gsoc2013-evolution-0f04843c8b25e06d5cbed20e5173fe61fa10dde2.tar.zst gsoc2013-evolution-0f04843c8b25e06d5cbed20e5173fe61fa10dde2.zip | |
Bug #693254 - Mail reply uses wrong "From:" account
| -rw-r--r-- | libemail-engine/e-mail-utils.c | 45 | ||||
| -rw-r--r-- | libemail-engine/e-mail-utils.h | 16 | ||||
| -rw-r--r-- | mail/em-composer-utils.c | 82 | 
3 files changed, 129 insertions, 14 deletions
| diff --git a/libemail-engine/e-mail-utils.c b/libemail-engine/e-mail-utils.c index 52c5fb3a27..ef990740cb 100644 --- a/libemail-engine/e-mail-utils.c +++ b/libemail-engine/e-mail-utils.c @@ -1104,10 +1104,12 @@ mail_account_in_recipients (ESourceRegistry *registry,  }  ESource * -em_utils_guess_mail_account_with_recipients (ESourceRegistry *registry, -                                             CamelMimeMessage *message, -                                             CamelFolder *folder, -                                             const gchar *message_uid) +em_utils_guess_mail_account_with_recipients_and_sort (ESourceRegistry *registry, +						      CamelMimeMessage *message, +						      CamelFolder *folder, +						      const gchar *message_uid, +						      EMailUtilsSourtSourcesFunc sort_func, +						      gpointer sort_func_data)  {  	ESource *source = NULL;  	GHashTable *recipients; @@ -1176,6 +1178,9 @@ second_preference:  	extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;  	list = e_source_registry_list_sources (registry, extension_name); +	if (sort_func) +		sort_func (&list, sort_func_data); +  	for (iter = list; iter != NULL; iter = g_list_next (iter)) {  		ESource *temp = E_SOURCE (iter->data); @@ -1202,10 +1207,12 @@ exit:  }  ESource * -em_utils_guess_mail_identity_with_recipients (ESourceRegistry *registry, -                                              CamelMimeMessage *message, -                                              CamelFolder *folder, -                                              const gchar *message_uid) +em_utils_guess_mail_identity_with_recipients_and_sort (ESourceRegistry *registry, +						       CamelMimeMessage *message, +						       CamelFolder *folder, +						       const gchar *message_uid, +						       EMailUtilsSourtSourcesFunc sort_func, +						       gpointer sort_func_data)  {  	ESource *source;  	ESourceExtension *extension; @@ -1215,8 +1222,8 @@ em_utils_guess_mail_identity_with_recipients (ESourceRegistry *registry,  	g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);  	g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); -	source = em_utils_guess_mail_account_with_recipients ( -		registry, message, folder, message_uid); +	source = em_utils_guess_mail_account_with_recipients_and_sort ( +		registry, message, folder, message_uid, sort_func, sort_func_data);  	if (source == NULL)  		return NULL; @@ -1243,6 +1250,24 @@ em_utils_guess_mail_identity_with_recipients (ESourceRegistry *registry,  }  ESource * +em_utils_guess_mail_account_with_recipients (ESourceRegistry *registry, +                                             CamelMimeMessage *message, +                                             CamelFolder *folder, +                                             const gchar *message_uid) +{ +	return em_utils_guess_mail_account_with_recipients_and_sort (registry, message, folder, message_uid, NULL, NULL); +} + +ESource * +em_utils_guess_mail_identity_with_recipients (ESourceRegistry *registry, +                                              CamelMimeMessage *message, +                                              CamelFolder *folder, +                                              const gchar *message_uid) +{ +	return em_utils_guess_mail_identity_with_recipients_and_sort (registry, message, folder, message_uid, NULL, NULL); +} + +ESource *  em_utils_ref_mail_identity_for_store (ESourceRegistry *registry,                                        CamelStore *store)  { diff --git a/libemail-engine/e-mail-utils.h b/libemail-engine/e-mail-utils.h index e7521d6e26..9f6477fb0c 100644 --- a/libemail-engine/e-mail-utils.h +++ b/libemail-engine/e-mail-utils.h @@ -25,6 +25,8 @@  #include <camel/camel.h>  #include <libedataserver/libedataserver.h> +typedef void (* EMailUtilsSourtSourcesFunc) (GList **psources, gpointer user_data); +  gboolean	em_utils_folder_is_drafts	(ESourceRegistry *registry,  						 CamelFolder *folder);  gboolean	em_utils_folder_is_templates	(ESourceRegistry *registry, @@ -59,6 +61,20 @@ ESource *	em_utils_guess_mail_identity_with_recipients  						 CamelMimeMessage *message,  						 CamelFolder *folder,  						 const gchar *message_uid); +ESource *	em_utils_guess_mail_account_with_recipients_and_sort +						(ESourceRegistry *registry, +						 CamelMimeMessage *message, +						 CamelFolder *folder, +						 const gchar *message_uid, +						 EMailUtilsSourtSourcesFunc sort_func, +						 gpointer sort_func_data); +ESource *	em_utils_guess_mail_identity_with_recipients_and_sort +						(ESourceRegistry *registry, +						 CamelMimeMessage *message, +						 CamelFolder *folder, +						 const gchar *message_uid, +						 EMailUtilsSourtSourcesFunc sort_func, +						 gpointer sort_func_data);  ESource *	em_utils_ref_mail_identity_for_store  						(ESourceRegistry *registry,  						 CamelStore *store); diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 8c463b9005..9015d05cfe 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -53,6 +53,7 @@  #include <composer/e-composer-post-header.h>  #include "e-mail-printer.h" +#include "e-mail-ui-session.h"  #include "em-utils.h"  #include "em-composer-utils.h"  #include "em-folder-selector.h" @@ -1926,6 +1927,79 @@ em_utils_forward_messages (EMailReader *reader,  	}  } +static gint +compare_sources_with_uids_order_cb (gconstpointer a, +				    gconstpointer b, +				    gpointer user_data) +{ +	ESource *asource = (ESource *) a; +	ESource *bsource = (ESource *) b; +	GHashTable *uids_order = user_data; +	gint aindex, bindex; + +	aindex = GPOINTER_TO_INT (g_hash_table_lookup (uids_order, e_source_get_uid (asource))); +	bindex = GPOINTER_TO_INT (g_hash_table_lookup (uids_order, e_source_get_uid (bsource))); + +	if (aindex <= 0) +		aindex = g_hash_table_size (uids_order); +	if (bindex <= 0) +		bindex = g_hash_table_size (uids_order); + +	return aindex - bindex; +} + +static void +sort_sources_by_ui (GList **psources, +		    gpointer user_data) +{ +	EShell *shell = user_data; +	EShellBackend *shell_backend; +	EMailSession *mail_session; +	EMailAccountStore *account_store; +	GtkTreeModel *model; +	GtkTreeIter iter; +	GHashTable *uids_order; +	gint index = 0; + +	g_return_if_fail (psources != NULL); +	g_return_if_fail (E_IS_SHELL (shell)); + +	/* nothing to sort */ +	if (!*psources || !g_list_next (*psources)) +		return; + +	shell_backend = e_shell_get_backend_by_name (shell, "mail"); +	g_return_if_fail (shell_backend != NULL); + +	mail_session = e_mail_backend_get_session (E_MAIL_BACKEND (shell_backend)); +	g_return_if_fail (mail_session != NULL); + +	account_store = e_mail_ui_session_get_account_store (E_MAIL_UI_SESSION (mail_session)); +	g_return_if_fail (account_store != NULL); + +	model = GTK_TREE_MODEL (account_store); +	if (!gtk_tree_model_get_iter_first (model, &iter)) +		return; + +	uids_order = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + +	do { +		CamelService *service = NULL; + +		gtk_tree_model_get (model, &iter, E_MAIL_ACCOUNT_STORE_COLUMN_SERVICE, &service, -1); + +		if (service) { +			index++; +			g_hash_table_insert (uids_order, g_strdup (camel_service_get_uid (service)), GINT_TO_POINTER (index)); +			g_object_unref (service); +		} +	} while (gtk_tree_model_iter_next (model, &iter)); + +	*psources = g_list_sort_with_data (*psources, compare_sources_with_uids_order_cb, uids_order); + +	g_hash_table_destroy (uids_order); +} +  /* Redirecting messages... */  static EMsgComposer * @@ -1955,8 +2029,8 @@ redirect_get_composer (EShell *shell,  	registry = e_shell_get_registry (shell);  	/* This returns a new ESource reference. */ -	source = em_utils_guess_mail_identity_with_recipients ( -		registry, message, NULL, NULL); +	source = em_utils_guess_mail_identity_with_recipients_and_sort ( +		registry, message, NULL, NULL, sort_sources_by_ui, shell);  	if (source != NULL) {  		identity_uid = e_source_dup_uid (source); @@ -2893,8 +2967,8 @@ em_utils_reply_to_message (EShell *shell,  	registry = e_shell_get_registry (shell);  	/* This returns a new ESource reference. */ -	source = em_utils_guess_mail_identity_with_recipients ( -		registry, message, folder, message_uid); +	source = em_utils_guess_mail_identity_with_recipients_and_sort ( +		registry, message, folder, message_uid, sort_sources_by_ui, shell);  	if (source != NULL) {  		identity_uid = e_source_dup_uid (source);  		g_object_unref (source); | 
