[evolution] Bug #571039 - Shows all selected messages in a preview pane on a slow network



commit 555c178a7d52ae4aa5a52fa78bbbc0f70f4cc576
Author: Milan Crha <mcrha redhat com>
Date:   Tue Oct 27 14:01:10 2009 +0100

    Bug #571039 - Shows all selected messages in a preview pane on a slow network

 mail/e-mail-reader.c |   15 +++++++++++++--
 mail/mail-mt.c       |    7 ++-----
 mail/mail-ops.c      |   23 ++++++++++++++++++-----
 mail/mail-ops.h      |    6 +++---
 4 files changed, 36 insertions(+), 15 deletions(-)
---
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index cdb3761..c60054b 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -1845,12 +1845,17 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader)
 		html_display_visible = GTK_WIDGET_MAPPED (widget);
 		selected_uid_changed = g_strcmp0 (cursor_uid, format_uid);
 
-		if (html_display_visible && selected_uid_changed)
-			mail_get_messagex (
+		if (html_display_visible && selected_uid_changed) {
+			gint op_id;
+
+			op_id = mail_get_messagex (
 				message_list->folder, cursor_uid,
 				mail_reader_message_loaded_cb,
 				g_object_ref (reader),
 				mail_msg_fast_ordered_push);
+
+			g_object_set_data (G_OBJECT (reader), "preview-get-message-op-id", GINT_TO_POINTER (op_id));
+		}
 	} else
 		em_format_format (EM_FORMAT (html_display), NULL, NULL, NULL);
 
@@ -1866,6 +1871,12 @@ mail_reader_message_selected_cb (EMailReader *reader,
 {
 	GSource *source;
 	const gchar *key;
+	gint op_id;
+
+	/* cancel previous message fetching, if any, first */
+	op_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (reader), "preview-get-message-op-id"));
+	if (op_id)
+		mail_msg_cancel (op_id);
 
 	/* XXX This is kludgy, but we have no other place to store timeout
 	 * state information.  Addendum: See EAttachmentView for an example
diff --git a/mail/mail-mt.c b/mail/mail-mt.c
index 16d593c..f87a8f2 100644
--- a/mail/mail-mt.c
+++ b/mail/mail-mt.c
@@ -309,7 +309,8 @@ mail_msg_check_error (gpointer msg)
 
 	if (!camel_exception_is_set(&m->ex)
 	    || m->ex.id == CAMEL_EXCEPTION_USER_CANCEL
-	    || m->ex.id == CAMEL_EXCEPTION_FOLDER_INVALID_UID)
+	    || m->ex.id == CAMEL_EXCEPTION_FOLDER_INVALID_UID
+	    || (m->cancel && camel_operation_cancel_check (m->cancel)))
 		return;
 
 	if (active_errors == NULL)
@@ -527,10 +528,6 @@ mail_msg_proxy (MailMsg *msg)
 	if (msg->info->desc != NULL && msg->cancel) {
 		camel_operation_end (msg->cancel);
 		camel_operation_unregister (msg->cancel);
-		MAIL_MT_LOCK (mail_msg_lock);
-		camel_operation_unref (msg->cancel);
-		msg->cancel = NULL;
-		MAIL_MT_UNLOCK (mail_msg_lock);
 	}
 
 	g_async_queue_push (msg_reply_queue, msg);
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 0f17dc2..a251c87 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -1836,7 +1836,10 @@ get_message_desc (struct _get_message_msg *m)
 static void
 get_message_exec (struct _get_message_msg *m)
 {
-	m->message = camel_folder_get_message(m->folder, m->uid, &m->base.ex);
+	if (m->base.cancel && camel_operation_cancel_check (m->base.cancel))
+		m->message = NULL;
+	else
+		m->message = camel_folder_get_message (m->folder, m->uid, &m->base.ex);
 }
 
 static void
@@ -1865,12 +1868,13 @@ static MailMsgInfo get_message_info = {
 	(MailMsgFreeFunc) get_message_free
 };
 
-void
+gint
 mail_get_message(CamelFolder *folder, const gchar *uid, void (*done) (CamelFolder *folder, const gchar *uid,
 								     CamelMimeMessage *msg, gpointer data),
 		 gpointer data, MailMsgDispatchFunc dispatch)
 {
 	struct _get_message_msg *m;
+	gint id;
 
 	m = mail_msg_new(&get_message_info);
 	m->folder = folder;
@@ -1879,8 +1883,11 @@ mail_get_message(CamelFolder *folder, const gchar *uid, void (*done) (CamelFolde
 	m->data = data;
 	m->done = (void (*) (CamelFolder *, const gchar *, CamelMimeMessage *, gpointer )) done;
 	m->cancel = camel_operation_new(NULL, NULL);
+	id = m->base.seq;
 
 	dispatch (m);
+
+	return id;
 }
 
 typedef void (*get_done)(CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *);
@@ -1904,11 +1911,12 @@ static MailMsgInfo get_messagex_info = {
 
 /* This is temporary, to avoid having to rewrite everything that uses
    mail_get_message; it adds an exception argument to the callback */
-CamelOperation *
+gint
 mail_get_messagex(CamelFolder *folder, const gchar *uid, void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *),
 		 gpointer data, MailMsgDispatchFunc dispatch)
 {
 	struct _get_message_msg *m;
+	gint id;
 
 	m = mail_msg_new(&get_messagex_info);
 	m->folder = folder;
@@ -1917,10 +1925,11 @@ mail_get_messagex(CamelFolder *folder, const gchar *uid, void (*done) (CamelFold
 	m->data = data;
 	m->done = (void (*) (CamelFolder *, const gchar *, CamelMimeMessage *, gpointer )) done;
 	m->cancel = camel_operation_new(NULL, NULL);
+	id = m->base.seq;
 
 	dispatch (m);
 
-	return m->cancel;
+	return id;
 }
 
 /* ********************************************************************** */
@@ -1991,12 +2000,13 @@ static MailMsgInfo get_messages_info = {
 	(MailMsgFreeFunc) get_messages_free
 };
 
-void
+gint
 mail_get_messages(CamelFolder *folder, GPtrArray *uids,
 		  void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, gpointer data),
 		  gpointer data)
 {
 	struct _get_messages_msg *m;
+	gint id;
 
 	m = mail_msg_new(&get_messages_info);
 	m->folder = folder;
@@ -2005,8 +2015,11 @@ mail_get_messages(CamelFolder *folder, GPtrArray *uids,
 	m->messages = g_ptr_array_new();
 	m->data = data;
 	m->done = done;
+	id = m->base.seq;
 
 	mail_msg_unordered_push (m);
+
+	return id;
 }
 
 /* ** SAVE MESSAGES ******************************************************* */
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index 3233f03..843ada5 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -49,18 +49,18 @@ void mail_transfer_messages (CamelFolder *source, GPtrArray *uids,
 			     gpointer data);
 
 /* get a single message, asynchronously */
-void mail_get_message (CamelFolder *folder, const gchar *uid,
+gint mail_get_message (CamelFolder *folder, const gchar *uid,
 		       void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data),
 		       gpointer data,
 		       MailMsgDispatchFunc dispatch);
 
-CamelOperation *
+gint
 mail_get_messagex(CamelFolder *folder, const gchar *uid,
 		  void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, CamelException *),
 		  gpointer data, MailMsgDispatchFunc dispatch);
 
 /* get several messages */
-void mail_get_messages (CamelFolder *folder, GPtrArray *uids,
+gint mail_get_messages (CamelFolder *folder, GPtrArray *uids,
 			void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, gpointer data),
 			gpointer data);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]