From 555c178a7d52ae4aa5a52fa78bbbc0f70f4cc576 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 27 Oct 2009 14:01:10 +0100 Subject: 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 cdb3761d60..c60054b266 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 16d593c0f3..f87a8f2e91 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 0f17dc2a4a..a251c871a9 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 3233f03219..843ada5d54 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); -- cgit v1.2.3