From 4b88140cb6e3d7a82d2da878d3d3345c460be60a Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 29 Oct 2010 19:54:45 -0400 Subject: Bug 633172 - Folder->Subscriptions is always enabled --- mail/em-subscription-editor.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'mail') diff --git a/mail/em-subscription-editor.c b/mail/em-subscription-editor.c index e34a9248c7..c040daf48e 100644 --- a/mail/em-subscription-editor.c +++ b/mail/em-subscription-editor.c @@ -1044,32 +1044,30 @@ static void subscription_editor_realize (GtkWidget *widget) { EMSubscriptionEditor *editor; - EAccountList *account_list; - EIterator *account_iter; GtkComboBox *combo_box; + CamelSession *session; + GList *list, *iter; gint initial_index = 0; editor = EM_SUBSCRIPTION_EDITOR (widget); + session = em_subscription_editor_get_session (editor); /* Chain up to parent's realize() method. */ GTK_WIDGET_CLASS (em_subscription_editor_parent_class)->realize (widget); /* Find accounts to display, and watch for the default account. */ - account_list = e_get_account_list (); - account_iter = e_list_get_iterator (E_LIST (account_list)); - while (e_iterator_is_valid (account_iter)) { - EAccount *account; - - /* XXX EIterator misuses const. */ - account = (EAccount *) e_iterator_get (account_iter); - if (subscription_editor_test_account (editor, account)) { - if (account == editor->priv->initial_account) - initial_index = editor->priv->stores->len; - subscription_editor_add_account (editor, account); - } - e_iterator_next (account_iter); + list = e_get_subscribable_accounts (session); + for (iter = list; iter != NULL; iter = g_list_next (iter)) { + EAccount *account = E_ACCOUNT (iter->data); + if (account == editor->priv->initial_account) + initial_index = editor->priv->stores->len; + subscription_editor_add_account (editor, account); } - g_object_unref (account_iter); + g_list_free (list); + + /* The subscription editor should only be accessible if + * at least one enabled account supports subscriptions. */ + g_return_if_fail (editor->priv->stores->len > 0); combo_box = GTK_COMBO_BOX (editor->priv->combo_box); gtk_combo_box_set_active (combo_box, initial_index); -- cgit v1.2.3 From 58727dbb22ceeaf950ba7931fd516b112689b5a6 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 30 Oct 2010 14:23:01 -0400 Subject: Kill mail_append_mail(). Use e_mail_folder_append_message() instead. --- mail/e-mail-folder-utils.c | 87 ++++++++++++++++++++++++++++------------------ mail/e-mail-folder-utils.h | 7 ++++ mail/e-mail-session.c | 24 +++++++------ mail/em-composer-utils.c | 21 ++++++----- mail/mail-ops.c | 86 --------------------------------------------- mail/mail-ops.h | 5 --- 6 files changed, 87 insertions(+), 143 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-folder-utils.c b/mail/e-mail-folder-utils.c index 7186589849..f2ba207e01 100644 --- a/mail/e-mail-folder-utils.c +++ b/mail/e-mail-folder-utils.c @@ -27,15 +27,19 @@ typedef struct _AsyncContext AsyncContext; struct _AsyncContext { - GCancellable *cancellable; + CamelMimeMessage *message; + CamelMessageInfo *info; gchar *message_uid; }; static void async_context_free (AsyncContext *context) { - if (context->cancellable != NULL) - g_object_unref (context->cancellable); + if (context->message != NULL) + g_object_unref (context->message); + + if (context->info != NULL) + camel_message_info_free (context->info); g_free (context->message_uid); @@ -43,28 +47,58 @@ async_context_free (AsyncContext *context) } static void -mail_folder_append_message_ready (CamelFolder *folder, - GAsyncResult *result, - GSimpleAsyncResult *simple) +mail_folder_append_message_thread (GSimpleAsyncResult *simple, + GObject *object, + GCancellable *cancellable) { AsyncContext *context; GError *error = NULL; context = g_simple_async_result_get_op_res_gpointer (simple); - camel_folder_append_message_finish ( - folder, result, &context->message_uid, &error); + e_mail_folder_append_message_sync ( + CAMEL_FOLDER (object), context->message, + context->info, &context->message_uid, + cancellable, &error); if (error != NULL) { g_simple_async_result_set_from_error (simple, error); g_error_free (error); } +} + +gboolean +e_mail_folder_append_message_sync (CamelFolder *folder, + CamelMimeMessage *message, + CamelMessageInfo *info, + gchar **appended_uid, + GCancellable *cancellable, + GError **error) +{ + CamelMedium *medium; + gboolean success; - camel_operation_pop_message (context->cancellable); + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); + g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); - g_simple_async_result_complete (simple); + medium = CAMEL_MEDIUM (message); - g_object_unref (simple); + camel_operation_push_message ( + cancellable, + _("Saving message to folder '%s'"), + camel_folder_get_full_name (folder)); + + if (camel_medium_get_header (medium, "X-Mailer") == NULL) + camel_medium_set_header (medium, "X-Mailer", X_MAILER); + + camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); + + success = camel_folder_append_message_sync ( + folder, message, info, appended_uid, cancellable, error); + + camel_operation_pop_message (cancellable); + + return success; } void @@ -78,17 +112,15 @@ e_mail_folder_append_message (CamelFolder *folder, { GSimpleAsyncResult *simple; AsyncContext *context; - CamelMedium *medium; g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); - medium = CAMEL_MEDIUM (message); - context = g_slice_new0 (AsyncContext); + context->message = g_object_ref (message); - if (G_IS_CANCELLABLE (cancellable)) - context->cancellable = g_object_ref (cancellable); + if (info != NULL) + context->info = camel_message_info_ref (info); simple = g_simple_async_result_new ( G_OBJECT (folder), callback, user_data, @@ -97,20 +129,11 @@ e_mail_folder_append_message (CamelFolder *folder, g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); - camel_operation_push_message ( - context->cancellable, - _("Saving message to folder '%s'"), - camel_folder_get_full_name (folder)); - - if (camel_medium_get_header (medium, "X-Mailer") == NULL) - camel_medium_set_header (medium, "X-Mailer", X_MAILER); - - camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); + g_simple_async_result_run_in_thread ( + simple, mail_folder_append_message_thread, + io_priority, cancellable); - camel_folder_append_message ( - folder, message, info, io_priority, - context->cancellable, (GAsyncReadyCallback) - mail_folder_append_message_ready, simple); + g_object_unref (simple); } gboolean @@ -130,13 +153,11 @@ e_mail_folder_append_message_finish (CamelFolder *folder, simple = G_SIMPLE_ASYNC_RESULT (result); context = g_simple_async_result_get_op_res_gpointer (simple); - if (g_simple_async_result_propagate_error (simple, error)) - return FALSE; - if (appended_uid != NULL) { *appended_uid = context->message_uid; context->message_uid = NULL; } - return TRUE; + /* Assume success unless a GError is set. */ + return !g_simple_async_result_propagate_error (simple, error); } diff --git a/mail/e-mail-folder-utils.h b/mail/e-mail-folder-utils.h index c5d3fefe13..7872f3e146 100644 --- a/mail/e-mail-folder-utils.h +++ b/mail/e-mail-folder-utils.h @@ -25,6 +25,13 @@ G_BEGIN_DECLS +gboolean e_mail_folder_append_message_sync + (CamelFolder *folder, + CamelMimeMessage *message, + CamelMessageInfo *info, + gchar **appended_uid, + GCancellable *cancellable, + GError **error); void e_mail_folder_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelMessageInfo *info, diff --git a/mail/e-mail-session.c b/mail/e-mail-session.c index 7b726cfec5..debaf28cea 100644 --- a/mail/e-mail-session.c +++ b/mail/e-mail-session.c @@ -51,6 +51,7 @@ #include "e-util/e-alert-dialog.h" #include "e-util/e-util-private.h" +#include "e-mail-folder-utils.h" #include "e-mail-local.h" #include "e-mail-session.h" #include "em-composer-utils.h" @@ -386,18 +387,16 @@ forward_to_flush_outbox_cb (EMailSession *session) static void ms_forward_to_cb (CamelFolder *folder, - CamelMimeMessage *msg, - CamelMessageInfo *info, - gint queued, - const gchar *appended_uid, - gpointer data) + GAsyncResult *result, + EMailSession *session) { - EMailSession *session = E_MAIL_SESSION (data); GConfClient *client; - client = gconf_client_get_default (); + /* FIXME Poor error handling. */ + if (!e_mail_folder_append_message_finish (folder, result, NULL, NULL)) + return; - camel_message_info_free (info); + client = gconf_client_get_default (); /* do not call mail send immediately, just pile them all in the outbox */ if (preparing_flush || @@ -926,8 +925,13 @@ mail_session_forward_to (CamelSession *session, out_folder = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); camel_message_info_set_flags ( info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN); - mail_append_mail ( - out_folder, forward, info, ms_forward_to_cb, session); + + /* FIXME Pass a GCancellable. */ + e_mail_folder_append_message ( + out_folder, forward, info, G_PRIORITY_DEFAULT, NULL, + (GAsyncReadyCallback) ms_forward_to_cb, session); + + camel_message_info_free (info); return TRUE; } diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index f084155362..02eb039916 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -1665,15 +1665,13 @@ em_utils_handle_receipt (EMailSession *session, static void em_utils_receipt_done (CamelFolder *folder, - CamelMimeMessage *msg, - CamelMessageInfo *info, - gint queued, - const gchar *appended_uid, - gpointer data) + GAsyncResult *result, + EMailSession *session) { - EMailSession *session = E_MAIL_SESSION (data); + /* FIXME Poor error handling. */ + if (!e_mail_folder_append_message_finish (folder, result, NULL, NULL)) + return; - camel_message_info_free (info); mail_send (session); } @@ -1812,8 +1810,13 @@ em_utils_send_receipt (EMailSession *session, out_folder = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); camel_message_info_set_flags ( info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN); - mail_append_mail ( - out_folder, receipt, info, em_utils_receipt_done, session); + + /* FIXME Pass a GCancellable. */ + e_mail_folder_append_message ( + out_folder, receipt, info, G_PRIORITY_DEFAULT, NULL, + (GAsyncReadyCallback) em_utils_receipt_done, session); + + camel_message_info_free (info); } /* Replying to messages... */ diff --git a/mail/mail-ops.c b/mail/mail-ops.c index ffaa7e41af..ccbd934fe7 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -919,92 +919,6 @@ mail_send_queue (EMailSession *session, mail_msg_unordered_push (m); } -/* ** APPEND MESSAGE TO FOLDER ******************************************** */ - -struct _append_msg { - MailMsg base; - - CamelFolder *folder; - CamelMimeMessage *message; - CamelMessageInfo *info; - gchar *appended_uid; - - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, gint ok, const gchar *appended_uid, gpointer data); - gpointer data; -}; - -static gchar * -append_mail_desc (struct _append_msg *m) -{ - return g_strdup_printf (_("Saving message to folder '%s'"), camel_folder_get_full_name (m->folder)); -} - -static void -append_mail_exec (struct _append_msg *m, - GCancellable *cancellable, - GError **error) -{ - camel_mime_message_set_date ( - m->message, CAMEL_MESSAGE_DATE_CURRENT, 0); - - camel_folder_append_message_sync ( - m->folder, m->message, - m->info, &m->appended_uid, - cancellable, error); -} - -static void -append_mail_done (struct _append_msg *m) -{ - if (m->done) - m->done ( - m->folder, m->message, - m->info, m->base.error == NULL, - m->appended_uid, m->data); -} - -static void -append_mail_free (struct _append_msg *m) -{ - g_object_unref (m->message); - g_object_unref (m->folder); - g_free (m->appended_uid); -} - -static MailMsgInfo append_mail_info = { - sizeof (struct _append_msg), - (MailMsgDescFunc) append_mail_desc, - (MailMsgExecFunc) append_mail_exec, - (MailMsgDoneFunc) append_mail_done, - (MailMsgFreeFunc) append_mail_free -}; - -void -mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageInfo *info, - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, gint ok, const gchar *appended_uid, gpointer data), - gpointer data) -{ - struct _append_msg *m; - - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); - - if (!camel_medium_get_header (CAMEL_MEDIUM (message), "X-Mailer")) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", x_mailer); - - m = mail_msg_new (&append_mail_info); - m->folder = folder; - g_object_ref (folder); - m->message = message; - g_object_ref (message); - m->info = info; - - m->done = done; - m->data = data; - - mail_msg_unordered_push (m); -} - /* ** TRANSFER MESSAGES **************************************************** */ struct _transfer_msg { diff --git a/mail/mail-ops.h b/mail/mail-ops.h index fbcf6bf826..583c18e34f 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -32,11 +32,6 @@ G_BEGIN_DECLS #include #include -void mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageInfo *info, - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, gint ok, - const gchar *appended_uid, gpointer data), - gpointer data); - void mail_transfer_messages (EMailSession *session, CamelFolder *source, GPtrArray *uids, -- cgit v1.2.3 From 7b7d920a755ebf8fc54cf5bf26c287b480f019ed Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 30 Oct 2010 15:20:42 -0400 Subject: Remove an unused function. --- mail/em-subscription-editor.c | 22 ---------------------- 1 file changed, 22 deletions(-) (limited to 'mail') diff --git a/mail/em-subscription-editor.c b/mail/em-subscription-editor.c index c040daf48e..db278b8a63 100644 --- a/mail/em-subscription-editor.c +++ b/mail/em-subscription-editor.c @@ -904,28 +904,6 @@ subscription_editor_add_account (EMSubscriptionEditor *editor, g_ptr_array_add (editor->priv->stores, data); } -static gboolean -subscription_editor_test_account (EMSubscriptionEditor *editor, - EAccount *account) -{ - CamelSession *session; - CamelStore *store; - const gchar *url; - - /* Account must be enabled. */ - if (!account->enabled) - return FALSE; - - session = em_subscription_editor_get_session (editor); - url = e_account_get_string (account, E_ACCOUNT_SOURCE_URL); - - store = (CamelStore *) camel_session_get_service ( - session, url, CAMEL_PROVIDER_STORE, NULL); - - /* Corresponding CamelStore must support subscriptions. */ - return (store != NULL) && camel_store_supports_subscriptions (store); -} - static void subscription_editor_set_account (EMSubscriptionEditor *editor, EAccount *account) -- cgit v1.2.3 From f544e10b71f0c80ee0cf8eb2edde0620fd7f4e70 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 30 Oct 2010 20:56:51 -0400 Subject: Skip writing to Outbox when sending. When sending a message from a composer window, it seems pointless to write message to Outbox only to immediately read it back and mark it for deletion. Instead, bypass the Outbox folder when sending, and if an error occurs, offer to save the message to Outbox instead. --- mail/e-mail-session-utils.c | 109 ++++++----------------- mail/e-mail-session-utils.h | 3 +- mail/em-composer-utils.c | 213 ++++++++++++++++++++++++-------------------- 3 files changed, 143 insertions(+), 182 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-session-utils.c b/mail/e-mail-session-utils.c index b436243c10..2369a69d35 100644 --- a/mail/e-mail-session-utils.c +++ b/mail/e-mail-session-utils.c @@ -33,7 +33,6 @@ typedef struct _AsyncContext AsyncContext; struct _AsyncContext { CamelFolder *sent_folder; - CamelFolder *outbox_folder; CamelMimeMessage *message; CamelMessageInfo *info; @@ -63,9 +62,6 @@ async_context_free (AsyncContext *context) if (context->sent_folder != NULL) g_object_unref (context->sent_folder); - if (context->outbox_folder != NULL) - g_object_unref (context->outbox_folder); - if (context->message != NULL) g_object_unref (context->message); @@ -564,19 +560,6 @@ cleanup: /* The send operation was successful; ignore cleanup errors. */ - /* Mark the Outbox message for deletion. */ - camel_folder_set_message_flags ( - context->outbox_folder, context->message_uid, - CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN, ~0); - - /* Synchronize the Outbox folder. */ - camel_folder_synchronize_sync ( - context->outbox_folder, FALSE, cancellable, &error); - if (error != NULL) { - g_warning ("%s", error->message); - g_clear_error (&error); - } - /* Mark the draft message for deletion, if present. */ e_mail_session_handle_draft_headers_sync ( session, context->message, cancellable, &error); @@ -617,17 +600,23 @@ exit: g_string_free (error_messages, TRUE); } -static void -mail_session_send_to_prepare (CamelFolder *outbox_folder, - GAsyncResult *result, - GSimpleAsyncResult *simple) +void +e_mail_session_send_to (EMailSession *session, + CamelMimeMessage *message, + const gchar *destination, + gint io_priority, + GCancellable *cancellable, + CamelFilterGetFolderFunc get_folder_func, + gpointer get_folder_data, + GAsyncReadyCallback callback, + gpointer user_data) { + GSimpleAsyncResult *simple; AsyncContext *context; CamelAddress *from; CamelAddress *recipients; CamelMedium *medium; CamelMessageInfo *info; - CamelMimeMessage *message; EAccount *account = NULL; GPtrArray *post_to_uris; struct _camel_header_raw *xev; @@ -638,20 +627,7 @@ mail_session_send_to_prepare (CamelFolder *outbox_folder, gchar *sent_folder_uri = NULL; GError *error = NULL; - context = g_simple_async_result_get_op_res_gpointer (simple); - - message = camel_folder_get_message_finish ( - outbox_folder, result, &error); - - if (error != NULL) { - g_warn_if_fail (message == NULL); - g_simple_async_result_set_from_error (simple, error); - g_simple_async_result_complete (simple); - g_object_unref (simple); - g_error_free (error); - return; - } - + g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); medium = CAMEL_MEDIUM (message); @@ -686,7 +662,7 @@ mail_session_send_to_prepare (CamelFolder *outbox_folder, sent_folder_uri = g_strstrip (g_strdup (string)); if (transport_uri == NULL) - transport_uri = g_strdup (context->destination); + transport_uri = g_strdup (destination); post_to_uris = g_ptr_array_new (); for (header = xev; header != NULL; header = header->next) { @@ -750,6 +726,10 @@ mail_session_send_to_prepare (CamelFolder *outbox_folder, /* The rest of the processing happens in a thread. */ + context = g_slice_new0 (AsyncContext); + context->message = g_object_ref (message); + context->destination = g_strdup (destination); + context->io_priority = io_priority; context->from = from; context->recipients = recipients; context->message = g_object_ref (message); @@ -759,46 +739,10 @@ mail_session_send_to_prepare (CamelFolder *outbox_folder, context->transport_uri = transport_uri; context->sent_folder_uri = sent_folder_uri; - g_simple_async_result_run_in_thread ( - simple, (GSimpleAsyncThreadFunc) - mail_session_send_to_thread, - context->io_priority, - context->cancellable); - - g_object_unref (simple); -} - -void -e_mail_session_send_to (EMailSession *session, - CamelFolder *outbox_folder, - const gchar *message_uid, - const gchar *destination, - gint io_priority, - GCancellable *cancellable, - CamelFilterGetFolderFunc get_folder_func, - gpointer get_folder_data, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *simple; - AsyncContext *context; - GError *error = NULL; - - g_return_if_fail (E_IS_MAIL_SESSION (session)); - g_return_if_fail (CAMEL_IS_FOLDER (outbox_folder)); - g_return_if_fail (message_uid != NULL); - - context = g_slice_new0 (AsyncContext); - context->outbox_folder = g_object_ref (outbox_folder); - context->message_uid = g_strdup (message_uid); - context->destination = g_strdup (destination); - context->io_priority = io_priority; - if (G_IS_CANCELLABLE (cancellable)) context->cancellable = g_object_ref (cancellable); - /* More convenient to do this here than in the prepare function. - * Failure here emits a runtime warning but is non-fatal. */ + /* Failure here emits a runtime warning but is non-fatal. */ context->driver = camel_session_get_filter_driver ( CAMEL_SESSION (session), E_FILTER_SOURCE_OUTGOING, &error); if (context->driver != NULL) @@ -810,6 +754,10 @@ e_mail_session_send_to (EMailSession *session, g_error_free (error); } + /* This gets popped in async_context_free(). */ + camel_operation_push_message ( + context->cancellable, _("Sending message")); + simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_send_to); @@ -817,14 +765,13 @@ e_mail_session_send_to (EMailSession *session, g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); - /* This gets popped in async_context_free(). */ - camel_operation_push_message ( - context->cancellable, _("Sending message")); + g_simple_async_result_run_in_thread ( + simple, (GSimpleAsyncThreadFunc) + mail_session_send_to_thread, + context->io_priority, + context->cancellable); - camel_folder_get_message ( - outbox_folder, message_uid, io_priority, - context->cancellable, (GAsyncReadyCallback) - mail_session_send_to_prepare, simple); + g_object_unref (simple); } gboolean diff --git a/mail/e-mail-session-utils.h b/mail/e-mail-session-utils.h index fcbc2636f7..4d97524f5d 100644 --- a/mail/e-mail-session-utils.h +++ b/mail/e-mail-session-utils.h @@ -58,8 +58,7 @@ gboolean e_mail_session_handle_source_headers_finish GAsyncResult *result, GError **error); void e_mail_session_send_to (EMailSession *session, - CamelFolder *outbox_folder, - const gchar *message_uid, + CamelMimeMessage *message, const gchar *destination, gint io_priority, GCancellable *cancellable, diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 02eb039916..91480a38eb 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -488,10 +488,21 @@ composer_send_completed (EMailSession *session, } if (error != NULL) { - e_alert_submit ( - GTK_WIDGET (context->composer), + gint response; + + /* Clear the activity bar before + * presenting the error dialog. */ + g_object_unref (context->activity); + context->activity = NULL; + + response = e_alert_run_dialog_for_args ( + GTK_WINDOW (context->composer), "mail-composer:send-error", error->message, NULL); + if (response == GTK_RESPONSE_OK) /* Try Again */ + e_msg_composer_send (context->composer); + if (response == GTK_RESPONSE_ACCEPT) /* Save to Outbox */ + e_msg_composer_save_to_outbox (context->composer); g_error_free (error); goto exit; } @@ -508,76 +519,13 @@ exit: async_context_free (context); } -static void -composer_send_appended (CamelFolder *outbox_folder, - GAsyncResult *result, - AsyncContext *context) -{ - CamelSession *session; - GCancellable *cancellable; - gchar *message_uid = NULL; - GError *error = NULL; - - e_mail_folder_append_message_finish ( - outbox_folder, result, &message_uid, &error); - - /* Ignore cancellations. */ - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_warn_if_fail (message_uid == NULL); - async_context_free (context); - g_error_free (error); - return; - } - - if (error != NULL) { - g_warn_if_fail (message_uid == NULL); - e_alert_submit ( - GTK_WIDGET (context->composer), - "mail-composer:append-to-outbox-error", - error->message, NULL); - g_warning ("%s", error->message); - async_context_free (context); - g_error_free (error); - return; - } - - session = e_msg_composer_get_session (context->composer); - cancellable = e_activity_get_cancellable (context->activity); - - /* If we're online, go ahead and send the message now. */ - if (camel_session_get_online (session)) - e_mail_session_send_to ( - E_MAIL_SESSION (session), - outbox_folder, message_uid, NULL, - G_PRIORITY_DEFAULT, cancellable, NULL, NULL, - (GAsyncReadyCallback) composer_send_completed, - context); - - /* If we're offline, writing the message to the Outbox - * folder is as much as we can do. Tell the user. */ - else { - g_object_unref (context->activity); - context->activity = NULL; - - e_alert_run_dialog_for_args ( - GTK_WINDOW (context->composer), - "mail-composer:saved-to-outbox", NULL); - - gtk_widget_destroy (GTK_WIDGET (context->composer)); - async_context_free (context); - } - - g_free (message_uid); -} - static void em_utils_composer_send_cb (EMsgComposer *composer, CamelMimeMessage *message, EActivity *activity) { AsyncContext *context; - CamelFolder *outbox_folder; - CamelMessageInfo *info; + CamelSession *session; GCancellable *cancellable; context = g_slice_new0 (AsyncContext); @@ -586,18 +534,13 @@ em_utils_composer_send_cb (EMsgComposer *composer, context->activity = g_object_ref (activity); cancellable = e_activity_get_cancellable (activity); - outbox_folder = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); - - info = camel_message_info_new (NULL); - camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, ~0); + session = e_msg_composer_get_session (context->composer); - e_mail_folder_append_message ( - outbox_folder, message, info, - G_PRIORITY_DEFAULT, cancellable, - (GAsyncReadyCallback) composer_send_appended, + e_mail_session_send_to ( + E_MAIL_SESSION (session), message, NULL, + G_PRIORITY_DEFAULT, cancellable, NULL, NULL, + (GAsyncReadyCallback) composer_send_completed, context); - - camel_message_info_free (info); } static void @@ -614,9 +557,9 @@ composer_set_no_change (EMsgComposer *composer) } static void -composer_save_draft_complete (EMailSession *session, - GAsyncResult *result, - AsyncContext *context) +composer_save_to_drafts_complete (EMailSession *session, + GAsyncResult *result, + AsyncContext *context) { GError *error = NULL; @@ -649,9 +592,9 @@ composer_save_draft_complete (EMailSession *session, } static void -composer_save_draft_cleanup (CamelFolder *drafts_folder, - GAsyncResult *result, - AsyncContext *context) +composer_save_to_drafts_cleanup (CamelFolder *drafts_folder, + GAsyncResult *result, + AsyncContext *context) { CamelSession *session; GCancellable *cancellable; @@ -672,7 +615,7 @@ composer_save_draft_cleanup (CamelFolder *drafts_folder, g_warn_if_fail (context->message_uid == NULL); e_alert_submit ( GTK_WIDGET (context->composer), - "mail-composer:save-draft-error", + "mail-composer:save-to-drafts-error", error->message, NULL); async_context_free (context); g_error_free (error); @@ -687,12 +630,12 @@ composer_save_draft_cleanup (CamelFolder *drafts_folder, e_mail_session_handle_draft_headers ( E_MAIL_SESSION (session), context->message, G_PRIORITY_DEFAULT, cancellable, (GAsyncReadyCallback) - composer_save_draft_complete, context); + composer_save_to_drafts_complete, context); } static void -composer_save_draft_append_mail (AsyncContext *context, - CamelFolder *drafts_folder) +composer_save_to_drafts_append_mail (AsyncContext *context, + CamelFolder *drafts_folder) { CamelFolder *local_drafts_folder; GCancellable *cancellable; @@ -714,7 +657,7 @@ composer_save_draft_append_mail (AsyncContext *context, e_mail_folder_append_message ( drafts_folder, context->message, info, G_PRIORITY_DEFAULT, cancellable, - (GAsyncReadyCallback) composer_save_draft_cleanup, + (GAsyncReadyCallback) composer_save_to_drafts_cleanup, context); camel_message_info_free (info); @@ -723,9 +666,9 @@ composer_save_draft_append_mail (AsyncContext *context, } static void -composer_save_draft_got_folder (EMailSession *session, - GAsyncResult *result, - AsyncContext *context) +composer_save_to_drafts_got_folder (EMailSession *session, + GAsyncResult *result, + AsyncContext *context) { CamelFolder *drafts_folder; GError *error = NULL; @@ -761,13 +704,13 @@ composer_save_draft_got_folder (EMailSession *session, } } - composer_save_draft_append_mail (context, drafts_folder); + composer_save_to_drafts_append_mail (context, drafts_folder); } static void -em_utils_composer_save_draft_cb (EMsgComposer *composer, - CamelMimeMessage *message, - EActivity *activity) +em_utils_composer_save_to_drafts_cb (EMsgComposer *composer, + CamelMimeMessage *message, + EActivity *activity) { AsyncContext *context; EComposerHeaderTable *table; @@ -796,7 +739,7 @@ em_utils_composer_save_draft_cb (EMsgComposer *composer, drafts_folder_uri = NULL; if (drafts_folder_uri == NULL) { - composer_save_draft_append_mail (context, NULL); + composer_save_to_drafts_append_mail (context, NULL); context->folder_uri = g_strdup (local_drafts_folder_uri); } else { GCancellable *cancellable; @@ -808,10 +751,78 @@ em_utils_composer_save_draft_cb (EMsgComposer *composer, E_MAIL_SESSION (session), drafts_folder_uri, 0, G_PRIORITY_DEFAULT, cancellable, (GAsyncReadyCallback) - composer_save_draft_got_folder, context); + composer_save_to_drafts_got_folder, context); } } +static void +composer_save_to_outbox_completed (CamelFolder *outbox_folder, + GAsyncResult *result, + AsyncContext *context) +{ + GError *error = NULL; + + e_mail_folder_append_message_finish ( + outbox_folder, result, NULL, &error); + + /* Ignore cancellations. */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + e_activity_set_state (context->activity, E_ACTIVITY_CANCELLED); + g_error_free (error); + goto exit; + } + + if (error != NULL) { + e_alert_submit ( + GTK_WIDGET (context->composer), + "mail-composer:append-to-outbox-error", + error->message, NULL); + g_error_free (error); + goto exit; + } + + e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED); + + /* Wait for the EActivity's completion message to + * time out and then destroy the composer window. */ + g_object_weak_ref ( + G_OBJECT (context->activity), (GWeakNotify) + gtk_widget_destroy, context->composer); + +exit: + async_context_free (context); +} + +static void +em_utils_composer_save_to_outbox_cb (EMsgComposer *composer, + CamelMimeMessage *message, + EActivity *activity) +{ + AsyncContext *context; + CamelFolder *outbox_folder; + CamelMessageInfo *info; + GCancellable *cancellable; + + context = g_slice_new0 (AsyncContext); + context->message = g_object_ref (message); + context->composer = g_object_ref (composer); + context->activity = g_object_ref (activity); + + cancellable = e_activity_get_cancellable (activity); + outbox_folder = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); + + info = camel_message_info_new (NULL); + camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, ~0); + + e_mail_folder_append_message ( + outbox_folder, message, info, + G_PRIORITY_DEFAULT, cancellable, + (GAsyncReadyCallback) composer_save_to_outbox_completed, + context); + + camel_message_info_free (info); +} + static void em_utils_composer_print_cb (EMsgComposer *composer, GtkPrintOperationAction action, @@ -1260,7 +1271,7 @@ setup_forward_attached_callbacks (EMsgComposer *composer, composer, "send", G_CALLBACK (update_forwarded_flags_cb), data); g_signal_connect ( - composer, "save-draft", + composer, "save-to-drafts", G_CALLBACK (update_forwarded_flags_cb), data); g_object_set_data_full ( @@ -2707,8 +2718,12 @@ em_configure_new_composer (EMsgComposer *composer) G_CALLBACK (em_utils_composer_send_cb), NULL); g_signal_connect ( - composer, "save-draft", - G_CALLBACK (em_utils_composer_save_draft_cb), NULL); + composer, "save-to-drafts", + G_CALLBACK (em_utils_composer_save_to_drafts_cb), NULL); + + g_signal_connect ( + composer, "save-to-outbox", + G_CALLBACK (em_utils_composer_save_to_outbox_cb), NULL); g_signal_connect ( composer, "print", -- cgit v1.2.3 From 2084cccbe5a964ca8f504512a6e402f4ea5fee39 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 30 Oct 2010 21:54:16 -0400 Subject: Require a CamelMimeMessage in em_utils_handle_receipt(). Eliminates one of the two remaining calls to mail_get_messagex(). --- mail/em-composer-utils.c | 73 +++++++++++++++++++++++++----------------------- mail/em-composer-utils.h | 4 +-- 2 files changed, 40 insertions(+), 37 deletions(-) (limited to 'mail') diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 91480a38eb..6aebe52dc7 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -1607,61 +1607,44 @@ em_utils_redirect_message_by_uid (EShell *shell, g_object_ref (shell), mail_msg_unordered_push); } -static void -emu_handle_receipt_message (CamelFolder *folder, - const gchar *uid, - CamelMimeMessage *msg, - gpointer data, - GError **error) -{ - EMailSession *session = E_MAIL_SESSION (data); - - if (msg) - em_utils_handle_receipt (session, folder, uid, msg); - - /* we dont care really if we can't get the message */ - g_clear_error (error); -} - /* Message disposition notifications, rfc 2298 */ void em_utils_handle_receipt (EMailSession *session, CamelFolder *folder, - const gchar *uid, - CamelMimeMessage *msg) + const gchar *message_uid, + CamelMimeMessage *message) { EAccount *account; const gchar *addr; CamelMessageInfo *info; - info = camel_folder_get_message_info (folder, uid); - if (info == NULL) - return; + g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); + g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); - if (camel_message_info_user_flag(info, "receipt-handled")) { - camel_folder_free_message_info (folder, info); + info = camel_folder_get_message_info (folder, message_uid); + if (info == NULL) return; - } - if (msg == NULL) { - mail_get_messagex ( - folder, uid, emu_handle_receipt_message, - session, mail_msg_unordered_push); + if (camel_message_info_user_flag (info, "receipt-handled")) { camel_folder_free_message_info (folder, info); return; } - if ((addr = camel_medium_get_header((CamelMedium *)msg, "Disposition-Notification-To")) == NULL) { + addr = camel_medium_get_header ( + CAMEL_MEDIUM (message), "Disposition-Notification-To"); + if (addr == NULL) { camel_folder_free_message_info (folder, info); return; } - camel_message_info_set_user_flag(info, "receipt-handled", TRUE); + camel_message_info_set_user_flag (info, "receipt-handled", TRUE); camel_folder_free_message_info (folder, info); - account = em_utils_guess_account_with_recipients (msg, folder); + account = em_utils_guess_account_with_recipients (message, folder); - /* TODO: should probably decode/format the address, it could be in rfc2047 format */ + /* TODO Should probably decode/format the address, + * since it could be in rfc2047 format. */ if (addr == NULL) { addr = ""; } else { @@ -1669,9 +1652,29 @@ em_utils_handle_receipt (EMailSession *session, addr++; } - if (account && (account->receipt_policy == E_ACCOUNT_RECEIPT_ALWAYS || account->receipt_policy == E_ACCOUNT_RECEIPT_ASK) - && e_alert_run_dialog_for_args (e_shell_get_active_window (NULL), "mail:ask-receipt", addr, camel_mime_message_get_subject(msg), NULL) == GTK_RESPONSE_YES) - em_utils_send_receipt (session, folder, msg); + if (account == NULL) + return; + + if (account->receipt_policy == E_ACCOUNT_RECEIPT_NEVER) + return; + + if (account->receipt_policy == E_ACCOUNT_RECEIPT_ASK) { + GtkWindow *window; + const gchar *subject; + gint response; + + /* FIXME Parent window should be passed in. */ + window = e_shell_get_active_window (NULL); + subject = camel_mime_message_get_subject (message); + + response = e_alert_run_dialog_for_args ( + window, "mail:ask-receipt", addr, subject, NULL); + + if (response != GTK_RESPONSE_YES) + return; + } + + em_utils_send_receipt (session, folder, message); } static void diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h index 5dbd8e1409..bab32c450e 100644 --- a/mail/em-composer-utils.h +++ b/mail/em-composer-utils.h @@ -60,8 +60,8 @@ void em_utils_redirect_message_by_uid (EShell *shell, const gchar *uid); void em_utils_handle_receipt (EMailSession *session, CamelFolder *folder, - const gchar *uid, - CamelMimeMessage *msg); + const gchar *message_uid, + CamelMimeMessage *message); void em_utils_send_receipt (EMailSession *session, CamelFolder *folder, CamelMimeMessage *message); -- cgit v1.2.3 From 27834f2c8578ea6d3aba4f6ddc7033f4e199fe80 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 31 Oct 2010 13:17:32 -0400 Subject: EMailReader: Rewrite message retrieval tracking. Instead of mail_get_messagex(), call camel_folder_get_message() and submit an EActivity to the shell backend. EMailReader now uses the activity's GCancellable to cancel the previous retrieval operation when the user selects a different message. Eliminates the last call to mail_get_messagex(). --- mail/e-mail-reader.c | 159 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 95 insertions(+), 64 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 114bca0531..f5c511cc2a 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -66,20 +66,23 @@ ((EMailReaderPrivate *) g_object_get_qdata \ (G_OBJECT (obj), quark_private)) +typedef struct _EMailReaderClosure EMailReaderClosure; typedef struct _EMailReaderPrivate EMailReaderPrivate; +struct _EMailReaderClosure { + EMailReader *reader; + EActivity *activity; + gchar *message_uid; +}; + struct _EMailReaderPrivate { /* This timer runs when the user selects a single message. */ guint message_selected_timeout_id; - /* This is the message UID to automatically mark as read - * after a short period (specified by a user preference). */ - gchar *mark_read_message_uid; - - /* This is the ID of an asynchronous operation - * to retrieve a message from a mail folder. */ - gint retrieving_message_operation_id; + /* This allows message retrieval to be cancelled if another + * message is selected before the retrieval has completed. */ + GCancellable *retrieving_message; /* These flags work together to prevent message selection * restoration after a folder switch from automatically @@ -113,16 +116,31 @@ static guint signals[LAST_SIGNAL]; G_DEFINE_INTERFACE (EMailReader, e_mail_reader, G_TYPE_INITIALLY_UNOWNED) +static void +mail_reader_closure_free (EMailReaderClosure *closure) +{ + if (closure->reader != NULL) + g_object_unref (closure->reader); + + if (closure->activity != NULL) + g_object_unref (closure->activity); + + g_free (closure->message_uid); + + g_slice_free (EMailReaderClosure, closure); +} + static void mail_reader_private_free (EMailReaderPrivate *priv) { if (priv->message_selected_timeout_id > 0) g_source_remove (priv->message_selected_timeout_id); - if (priv->retrieving_message_operation_id > 0) - mail_msg_cancel (priv->retrieving_message_operation_id); - - g_free (priv->mark_read_message_uid); + if (priv->retrieving_message != NULL) { + g_cancellable_cancel (priv->retrieving_message); + g_object_unref (priv->retrieving_message); + priv->retrieving_message = 0; + } g_slice_free (EMailReaderPrivate, priv); } @@ -2447,17 +2465,15 @@ mail_reader_key_press_cb (EMailReader *reader, } static gboolean -mail_reader_message_read_cb (EMailReader *reader) +mail_reader_message_read_cb (EMailReaderClosure *closure) { - EMailReaderPrivate *priv; + EMailReader *reader; GtkWidget *message_list; const gchar *cursor_uid; const gchar *message_uid; - priv = E_MAIL_READER_GET_PRIVATE (reader); - - message_uid = priv->mark_read_message_uid; - g_return_val_if_fail (message_uid != NULL, FALSE); + reader = closure->reader; + message_uid = closure->message_uid; message_list = e_mail_reader_get_message_list (reader); cursor_uid = MESSAGE_LIST (message_list)->cursor_uid; @@ -2470,13 +2486,12 @@ mail_reader_message_read_cb (EMailReader *reader) static void mail_reader_message_loaded_cb (CamelFolder *folder, - const gchar *message_uid, - CamelMimeMessage *message, - gpointer user_data, - GError **error) + GAsyncResult *result, + EMailReaderClosure *closure) { - EMailReader *reader = user_data; + EMailReader *reader; EMailReaderPrivate *priv; + CamelMimeMessage *message; EMFormatHTML *formatter; GtkWidget *message_list; EMailBackend *backend; @@ -2486,9 +2501,13 @@ mail_reader_message_loaded_cb (CamelFolder *folder, EWebView *web_view; EMEvent *event; EMEventTargetMessage *target; - const gchar *cursor_uid; + const gchar *message_uid; gboolean schedule_timeout; gint timeout_interval; + GError *error = NULL; + + reader = closure->reader; + message_uid = closure->message_uid; priv = E_MAIL_READER_GET_PRIVATE (reader); @@ -2496,10 +2515,19 @@ mail_reader_message_loaded_cb (CamelFolder *folder, * while we were loading the message and we're likely holding the * last reference. Nothing to do but drop the reference. */ if (priv == NULL) { - g_object_unref (reader); + mail_reader_closure_free (closure); return; } + message = camel_folder_get_message_finish (folder, result, &error); + + /* If the user picked a different message in the time it took + * to fetch this message, then don't bother rendering it. */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_error_free (error); + goto exit; + } + backend = e_mail_reader_get_backend (reader); formatter = e_mail_reader_get_formatter (reader); message_list = e_mail_reader_get_message_list (reader); @@ -2508,15 +2536,8 @@ mail_reader_message_loaded_cb (CamelFolder *folder, shell = e_shell_backend_get_shell (shell_backend); shell_settings = e_shell_get_shell_settings (shell); - cursor_uid = MESSAGE_LIST (message_list)->cursor_uid; - web_view = em_format_html_get_web_view (formatter); - /* If the user picked a different message in the time it took - * to fetch this message, then don't bother rendering it. */ - if (g_strcmp0 (cursor_uid, message_uid) != 0) - goto exit; - /** @Event: message.reading * @Title: Viewing a message * @Target: EMEventTargetMessage @@ -2548,40 +2569,43 @@ mail_reader_message_loaded_cb (CamelFolder *folder, e_shell_settings_get_int ( shell_settings, "mail-mark-seen-timeout"); - g_free (priv->mark_read_message_uid); - priv->mark_read_message_uid = NULL; - if (MESSAGE_LIST (message_list)->seen_id > 0) { g_source_remove (MESSAGE_LIST (message_list)->seen_id); MESSAGE_LIST (message_list)->seen_id = 0; } if (schedule_timeout) { - priv->mark_read_message_uid = g_strdup (message_uid); - MESSAGE_LIST (message_list)->seen_id = g_timeout_add ( - timeout_interval, (GSourceFunc) - mail_reader_message_read_cb, reader); + EMailReaderClosure *timeout_closure; + + timeout_closure = g_slice_new0 (EMailReaderClosure); + timeout_closure->reader = g_object_ref (reader); + timeout_closure->message_uid = g_strdup (message_uid); + + MESSAGE_LIST (message_list)->seen_id = g_timeout_add_full ( + G_PRIORITY_DEFAULT, timeout_interval, + (GSourceFunc) mail_reader_message_read_cb, + timeout_closure, (GDestroyNotify) + mail_reader_closure_free); - } else if (error != NULL && *error != NULL) { + } else if (error != NULL) { gchar *string; /* Display the error inline and clear the exception. */ string = g_strdup_printf ( "

%s

%s

", _("Unable to retrieve message"), - (*error)->message); + error->message); e_web_view_load_string (web_view, string); g_free (string); - g_clear_error (error); + g_error_free (error); } - /* We referenced this in the call to mail_get_messagex (). */ - g_object_unref (reader); - exit: priv->restoring_message_selection = FALSE; + + mail_reader_closure_free (closure); } static gboolean @@ -2593,6 +2617,7 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) EWebView *web_view; CamelFolder *folder; CamelStore *parent_store; + EMailBackend *backend; const gchar *cursor_uid; const gchar *format_uid; @@ -2601,6 +2626,7 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) folder = e_mail_reader_get_folder (reader); parent_store = camel_folder_get_parent_store (folder); + backend = e_mail_reader_get_backend (reader); formatter = e_mail_reader_get_formatter (reader); message_list = e_mail_reader_get_message_list (reader); @@ -2622,10 +2648,10 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) selected_uid_changed = g_strcmp0 (cursor_uid, format_uid); if (web_view_visible && selected_uid_changed) { - gint op_id; + EMailReaderClosure *closure; + GCancellable *cancellable; + EActivity *activity; gchar *string; - gboolean store_async; - MailMsgDispatchFunc disp_func; string = g_strdup_printf ( _("Retrieving message '%s'"), cursor_uid); @@ -2637,21 +2663,29 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) #endif g_free (string); - store_async = parent_store->flags & CAMEL_STORE_ASYNC; + activity = e_activity_new (); + + cancellable = camel_operation_new (); + e_activity_set_cancellable (activity, cancellable); + + closure = g_slice_new0 (EMailReaderClosure); + closure->reader = g_object_ref (reader); + closure->activity = g_object_ref (activity); + closure->message_uid = g_strdup (cursor_uid); + + camel_folder_get_message ( + folder, cursor_uid, G_PRIORITY_DEFAULT, + cancellable, (GAsyncReadyCallback) + mail_reader_message_loaded_cb, closure); - if (store_async) - disp_func = mail_msg_unordered_push; - else - disp_func = mail_msg_fast_ordered_push; + e_shell_backend_add_activity ( + E_SHELL_BACKEND (backend), activity); - op_id = mail_get_messagex ( - folder, cursor_uid, - mail_reader_message_loaded_cb, - g_object_ref (reader), - disp_func); + if (priv->retrieving_message != NULL) + g_object_unref (priv->retrieving_message); + priv->retrieving_message = cancellable; - if (!store_async) - priv->retrieving_message_operation_id = op_id; + g_object_unref (activity); } } else { /* FIXME Need to pass a GCancellable. */ @@ -2671,7 +2705,6 @@ mail_reader_message_selected_cb (EMailReader *reader, { EMailReaderPrivate *priv; MessageList *message_list; - gboolean store_async; CamelFolder *folder; CamelStore *parent_store; @@ -2679,11 +2712,9 @@ mail_reader_message_selected_cb (EMailReader *reader, folder = e_mail_reader_get_folder (reader); parent_store = camel_folder_get_parent_store (folder); - store_async = parent_store->flags & CAMEL_STORE_ASYNC; - /* Cancel previous message retrieval if the store is not async. */ - if (!store_async && priv->retrieving_message_operation_id > 0) - mail_msg_cancel (priv->retrieving_message_operation_id); + /* Cancel the previous message retrieval activity. */ + g_cancellable_cancel (priv->retrieving_message); /* Cancel the seen timer. */ message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader)); -- cgit v1.2.3 From bccdf838c2b61837ea4722ce1af94b5a37d3e98a Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 31 Oct 2010 13:25:46 -0400 Subject: Kill mail_get_messagex(). Use camel_folder_get_message() instead. --- mail/mail-ops.c | 55 ------------------------------------------------------- mail/mail-ops.h | 5 ----- 2 files changed, 60 deletions(-) (limited to 'mail') diff --git a/mail/mail-ops.c b/mail/mail-ops.c index ccbd934fe7..af045c6bb8 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -2104,61 +2104,6 @@ mail_get_message (CamelFolder *folder, const gchar *uid, void (*done) (CamelFold return id; } -typedef void (*get_done)(CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, GError **error); - -static void -get_messagex_done (struct _get_message_msg *m) -{ - get_done done; - - if (!m->done) - return; - - if (camel_operation_cancel_check (CAMEL_OPERATION (m->cancellable))) - return; - - done = (get_done)m->done; - done (m->folder, m->uid, m->message, m->data, &m->base.error); -} - -static MailMsgInfo get_messagex_info = { - sizeof (struct _get_message_msg), - (MailMsgDescFunc) get_message_desc, - (MailMsgExecFunc) get_message_exec, - (MailMsgDoneFunc) get_messagex_done, - (MailMsgFreeFunc) get_message_free -}; - -/* This is temporary, to avoid having to rewrite everything that uses - mail_get_message; it adds an exception argument to the callback */ -gint -mail_get_messagex (CamelFolder *folder, - const gchar *uid, - void (*done) (CamelFolder *folder, - const gchar *uid, - CamelMimeMessage *msg, - gpointer data, - GError **error), - gpointer data, - MailMsgDispatchFunc dispatch) -{ - struct _get_message_msg *m; - gint id; - - m = mail_msg_new (&get_messagex_info); - m->folder = folder; - g_object_ref (folder); - m->uid = g_strdup (uid); - m->data = data; - m->done = (void (*) (CamelFolder *, const gchar *, CamelMimeMessage *, gpointer )) done; - m->cancellable = camel_operation_new (); - id = m->base.seq; - - dispatch (m); - - return id; -} - /* ********************************************************************** */ struct _get_messages_msg { diff --git a/mail/mail-ops.h b/mail/mail-ops.h index 583c18e34f..faeae3591b 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -47,11 +47,6 @@ gint mail_get_message (CamelFolder *folder, const gchar *uid, gpointer data, MailMsgDispatchFunc dispatch); -gint -mail_get_messagex (CamelFolder *folder, const gchar *uid, - void (*done) (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data, GError **error), - gpointer data, MailMsgDispatchFunc dispatch); - /* get several messages */ gint mail_get_messages (CamelFolder *folder, GPtrArray *uids, void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, gpointer data), -- cgit v1.2.3 From 4a929caada81820d7499b09875870b84e9900912 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 31 Oct 2010 16:02:30 -0400 Subject: Pass an EAlertSink to e_alert_sink_submit_alert(). Passing a random GtkWidget and then searching its ancestors for an EAlertSink turned out to be not as useful as I thought. Most of the time we know about and have access to the widget that implements EAlertSink, so just pass it directly as an EAlertSink. --- mail/e-mail-backend.c | 3 ++- mail/em-composer-utils.c | 9 +++++---- mail/mail-mt.c | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-backend.c b/mail/e-mail-backend.c index 36b244d8d4..09cbcae8ef 100644 --- a/mail/e-mail-backend.c +++ b/mail/e-mail-backend.c @@ -29,6 +29,7 @@ #include "e-util/e-account-utils.h" #include "e-util/e-alert-dialog.h" +#include "e-util/e-alert-sink.h" #include "misc/e-account-combo-box.h" @@ -637,6 +638,6 @@ e_mail_backend_submit_alert (EMailBackend *backend, shell_content = e_shell_view_get_shell_content (shell_view); va_start (va, tag); - e_alert_submit_valist (GTK_WIDGET (shell_content), tag, va); + e_alert_submit_valist (E_ALERT_SINK (shell_content), tag, va); va_end (va); } diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 6aebe52dc7..85d5bb26d4 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -39,6 +39,7 @@ #include "e-util/e-account-utils.h" #include "e-util/e-alert-dialog.h" +#include "e-util/e-alert-sink.h" #include "e-util/e-util.h" #include "shell/e-shell.h" @@ -302,7 +303,7 @@ composer_presend_check_recipients (EMsgComposer *composer) /* I'm sensing a lack of love, er, I mean recipients. */ if (num == 0 && num_post == 0) { e_alert_submit ( - GTK_WIDGET (composer), + E_ALERT_SINK (composer), "mail:send-no-recipients", NULL); goto finished; } @@ -349,7 +350,7 @@ composer_presend_check_account (EMsgComposer *composer) if (!check_passed) e_alert_submit ( - GTK_WIDGET (composer), + E_ALERT_SINK (composer), "mail:send-no-account-enabled", NULL); return check_passed; @@ -614,7 +615,7 @@ composer_save_to_drafts_cleanup (CamelFolder *drafts_folder, if (error != NULL) { g_warn_if_fail (context->message_uid == NULL); e_alert_submit ( - GTK_WIDGET (context->composer), + E_ALERT_SINK (context->composer), "mail-composer:save-to-drafts-error", error->message, NULL); async_context_free (context); @@ -774,7 +775,7 @@ composer_save_to_outbox_completed (CamelFolder *outbox_folder, if (error != NULL) { e_alert_submit ( - GTK_WIDGET (context->composer), + E_ALERT_SINK (context->composer), "mail-composer:append-to-outbox-error", error->message, NULL); g_error_free (error); diff --git a/mail/mail-mt.c b/mail/mail-mt.c index 8e507e46fc..21471c5108 100644 --- a/mail/mail-mt.c +++ b/mail/mail-mt.c @@ -27,6 +27,7 @@ #include +#include #include #include "mail-mt.h" @@ -252,13 +253,13 @@ mail_msg_check_error (gpointer msg) if (m->info->desc && (what = m->info->desc (m))) { e_alert_submit ( - GTK_WIDGET (shell_content), + E_ALERT_SINK (shell_content), "mail:async-error", what, m->error->message, NULL); g_free (what); } else e_alert_submit ( - GTK_WIDGET (shell_content), + E_ALERT_SINK (shell_content), "mail:async-error-nodescribe", m->error->message, NULL); } -- cgit v1.2.3 From 616f0b140bb937d7afeb46f834e32e8c51a67e1e Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 31 Oct 2010 17:11:35 -0400 Subject: EActivity: Add an "alert-sink" property. This is just for convenience, EActivity does not use this property. Especially useful in async function callbacks when the operation failed and now you have to do something useful with the GError. --- mail/em-composer-utils.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'mail') diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 85d5bb26d4..99df9ed1a7 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -598,9 +598,14 @@ composer_save_to_drafts_cleanup (CamelFolder *drafts_folder, AsyncContext *context) { CamelSession *session; + EAlertSink *alert_sink; GCancellable *cancellable; GError *error = NULL; + session = e_msg_composer_get_session (context->composer); + alert_sink = e_activity_get_alert_sink (context->activity); + cancellable = e_activity_get_cancellable (context->activity); + e_mail_folder_append_message_finish ( drafts_folder, result, &context->message_uid, &error); @@ -615,7 +620,7 @@ composer_save_to_drafts_cleanup (CamelFolder *drafts_folder, if (error != NULL) { g_warn_if_fail (context->message_uid == NULL); e_alert_submit ( - E_ALERT_SINK (context->composer), + alert_sink, "mail-composer:save-to-drafts-error", error->message, NULL); async_context_free (context); @@ -623,9 +628,6 @@ composer_save_to_drafts_cleanup (CamelFolder *drafts_folder, return; } - session = e_msg_composer_get_session (context->composer); - cancellable = e_activity_get_cancellable (context->activity); - /* Mark the previously saved draft message for deletion. * Note: This is just a nice-to-have; ignore failures. */ e_mail_session_handle_draft_headers ( @@ -761,8 +763,11 @@ composer_save_to_outbox_completed (CamelFolder *outbox_folder, GAsyncResult *result, AsyncContext *context) { + EAlertSink *alert_sink; GError *error = NULL; + alert_sink = e_activity_get_alert_sink (context->activity); + e_mail_folder_append_message_finish ( outbox_folder, result, NULL, &error); @@ -775,7 +780,7 @@ composer_save_to_outbox_completed (CamelFolder *outbox_folder, if (error != NULL) { e_alert_submit ( - E_ALERT_SINK (context->composer), + alert_sink, "mail-composer:append-to-outbox-error", error->message, NULL); g_error_free (error); -- cgit v1.2.3 From a2747569c8c4716c83880a6cc796ee1bd9b3f420 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 31 Oct 2010 17:16:57 -0400 Subject: Kill em_folder_utils_unsubscribe_folder(). Use e_mail_session_unsubscribe_folder() instead. --- mail/e-mail-session-utils.c | 119 ++++++++++++++++++++++++++++++++++++++++++++ mail/e-mail-session-utils.h | 16 ++++++ mail/em-folder-utils.c | 75 ---------------------------- mail/em-folder-utils.h | 3 -- mail/mail.error.xml | 5 ++ 5 files changed, 140 insertions(+), 78 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-session-utils.c b/mail/e-mail-session-utils.c index 2369a69d35..0df301f67f 100644 --- a/mail/e-mail-session-utils.c +++ b/mail/e-mail-session-utils.c @@ -50,6 +50,7 @@ struct _AsyncContext { GPtrArray *post_to_uris; + gchar *folder_uri; gchar *destination; gchar *message_uid; gchar *transport_uri; @@ -91,6 +92,7 @@ async_context_free (AsyncContext *context) g_ptr_array_free (context->post_to_uris, TRUE); } + g_free (context->folder_uri); g_free (context->destination); g_free (context->message_uid); g_free (context->transport_uri); @@ -791,3 +793,120 @@ e_mail_session_send_to_finish (EMailSession *session, /* Assume success unless a GError is set. */ return !g_simple_async_result_propagate_error (simple, error); } + +static void +mail_session_unsubscribe_folder_thread (GSimpleAsyncResult *simple, + EMailSession *session, + GCancellable *cancellable) +{ + AsyncContext *context; + GError *error = NULL; + + context = g_simple_async_result_get_op_res_gpointer (simple); + + e_mail_session_unsubscribe_folder_sync ( + session, context->folder_uri, cancellable, &error); + + if (error != NULL) { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } +} + +gboolean +e_mail_session_unsubscribe_folder_sync (EMailSession *session, + const gchar *folder_uri, + GCancellable *cancellable, + GError **error) +{ + CamelURL *url; + CamelStore *store; + CamelProviderURLFlags flags; + const gchar *message; + const gchar *path = NULL; + gboolean success = FALSE; + + g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); + g_return_val_if_fail (folder_uri != NULL, FALSE); + + message = _("Unsubscribing from folder '%s'"); + camel_operation_push_message (cancellable, message, folder_uri); + + store = camel_session_get_store ( + CAMEL_SESSION (session), folder_uri, error); + if (store == NULL) + goto exit; + + url = camel_url_new (folder_uri, error); + if (url == NULL) + goto exit; + + flags = CAMEL_SERVICE (store)->provider->url_flags; + + if (flags & CAMEL_URL_FRAGMENT_IS_PATH) + path = url->fragment; + else if (url->path != NULL && *url->path != '\0') + path = url->path + 1; + + g_return_val_if_fail (path != NULL, FALSE); + + success = camel_store_unsubscribe_folder_sync ( + store, path, cancellable, error); + + camel_url_free (url); + +exit: + camel_operation_pop_message (cancellable); + + return success; +} + +void +e_mail_session_unsubscribe_folder (EMailSession *session, + const gchar *folder_uri, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + AsyncContext *context; + + g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (folder_uri != NULL); + + context = g_slice_new0 (AsyncContext); + context->folder_uri = g_strdup (folder_uri); + + simple = g_simple_async_result_new ( + G_OBJECT (session), callback, user_data, + e_mail_session_unsubscribe_folder); + + g_simple_async_result_set_op_res_gpointer ( + simple, context, (GDestroyNotify) async_context_free); + + g_simple_async_result_run_in_thread ( + simple, (GSimpleAsyncThreadFunc) + mail_session_unsubscribe_folder_thread, + io_priority, cancellable); + + g_object_unref (simple); +} + +gboolean +e_mail_session_unsubscribe_folder_finish (EMailSession *session, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + g_return_val_if_fail ( + g_simple_async_result_is_valid ( + result, G_OBJECT (session), + e_mail_session_unsubscribe_folder), FALSE); + + simple = G_SIMPLE_ASYNC_RESULT (result); + + /* Assume success unless a GError is set. */ + return !g_simple_async_result_propagate_error (simple, error); +} diff --git a/mail/e-mail-session-utils.h b/mail/e-mail-session-utils.h index 4d97524f5d..e7ec28dd2d 100644 --- a/mail/e-mail-session-utils.h +++ b/mail/e-mail-session-utils.h @@ -69,6 +69,22 @@ void e_mail_session_send_to (EMailSession *session, gboolean e_mail_session_send_to_finish (EMailSession *session, GAsyncResult *result, GError **error); +gboolean e_mail_session_unsubscribe_folder_sync + (EMailSession *session, + const gchar *folder_uri, + GCancellable *cancellable, + GError **error); +void e_mail_session_unsubscribe_folder + (EMailSession *session, + const gchar *folder_uri, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean e_mail_session_unsubscribe_folder_finish + (EMailSession *session, + GAsyncResult *result, + GError **error); G_END_DECLS diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c index c2720fc5ae..e84152e574 100644 --- a/mail/em-folder-utils.c +++ b/mail/em-folder-utils.c @@ -754,81 +754,6 @@ em_folder_utils_create_folder (CamelFolderInfo *folderinfo, gtk_dialog_run (GTK_DIALOG (dialog)); } -struct _folder_unsub_t { - MailMsg base; - EMailSession *session; - gchar *folder_uri; -}; - -static gchar * -emfu_unsubscribe_folder__desc (struct _folder_unsub_t *msg) -{ - return g_strdup_printf ( - _("Unsubscribing from folder \"%s\""), msg->folder_uri); -} - -static void -emfu_unsubscribe_folder__exec (struct _folder_unsub_t *msg, - GCancellable *cancellable, - GError **error) -{ - CamelStore *store; - CamelURL *url; - const gchar *path = NULL; - gint url_flags; - - store = camel_session_get_store ( - CAMEL_SESSION (msg->session), - msg->folder_uri, error); - if (store == NULL) - return; - - url = camel_url_new (msg->folder_uri, NULL); - url_flags = CAMEL_SERVICE (store)->provider->url_flags; - - if (url_flags & CAMEL_URL_FRAGMENT_IS_PATH) - path = url->fragment; - else if (url->path != NULL && *url->path != '\0') - path = url->path + 1; - - if (path != NULL) - camel_store_unsubscribe_folder_sync ( - store, path, cancellable, error); - - camel_url_free (url); -} - -static void -emfu_unsubscribe_folder__free (struct _folder_unsub_t *msg) -{ - g_object_unref (msg->session); - g_free (msg->folder_uri); -} - -static MailMsgInfo unsubscribe_info = { - sizeof (struct _folder_unsub_t), - (MailMsgDescFunc) emfu_unsubscribe_folder__desc, - (MailMsgExecFunc) emfu_unsubscribe_folder__exec, - (MailMsgDoneFunc) NULL, - (MailMsgFreeFunc) emfu_unsubscribe_folder__free -}; - -void -em_folder_utils_unsubscribe_folder (EMailSession *session, - const gchar *folder_uri) -{ - struct _folder_unsub_t *unsub; - - g_return_if_fail (E_IS_MAIL_SESSION (session)); - g_return_if_fail (folder_uri != NULL); - - unsub = mail_msg_new (&unsubscribe_info); - unsub->session = g_object_ref (session); - unsub->folder_uri = g_strdup (folder_uri); - - mail_msg_unordered_push (unsub); -} - const gchar * em_folder_utils_get_icon_name (guint32 flags) { diff --git a/mail/em-folder-utils.h b/mail/em-folder-utils.h index f67ef50531..9d937d2424 100644 --- a/mail/em-folder-utils.h +++ b/mail/em-folder-utils.h @@ -49,9 +49,6 @@ void em_folder_utils_delete_folder (EMailBackend *backend, void em_folder_utils_create_folder (CamelFolderInfo *folderinfo, EMFolderTree *emft, GtkWindow *parent); -void em_folder_utils_unsubscribe_folder - (EMailSession *session, - const gchar *folder_uri); const gchar * em_folder_utils_get_icon_name (guint32 flags); diff --git a/mail/mail.error.xml b/mail/mail.error.xml index 60e4d5670c..0e9dfa151f 100644 --- a/mail/mail.error.xml +++ b/mail/mail.error.xml @@ -486,5 +486,10 @@ You can choose to ignore this folder, overwrite or append its contents, or quit. <_secondary>Folder '{0}' doesn't contain any duplicate message.