Bug #571039 - Shows all selected messages in a preview pane on a slow network
This commit is contained in:
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 ******************************************************* */
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user