From c4fedc04941946b2e79bf7a4d5cdb4f34dcd4cbd Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 21 Nov 2011 01:01:51 -0500 Subject: Split MDN handling into a module. --- configure.ac | 1 + mail/e-mail-reader.c | 35 +-- mail/em-composer-utils.c | 263 ------------------- mail/em-composer-utils.h | 7 - mail/mail.error.xml | 7 - modules/Makefile.am | 1 + modules/mdn/Makefile.am | 36 +++ modules/mdn/evolution-mdn.c | 500 ++++++++++++++++++++++++++++++++++++ modules/mdn/evolution-mdn.error.xml | 9 + po/POTFILES.in | 2 + 10 files changed, 560 insertions(+), 301 deletions(-) create mode 100644 modules/mdn/Makefile.am create mode 100644 modules/mdn/evolution-mdn.c create mode 100644 modules/mdn/evolution-mdn.error.xml diff --git a/configure.ac b/configure.ac index bb9ab3e988..8b64651c06 100644 --- a/configure.ac +++ b/configure.ac @@ -1678,6 +1678,7 @@ modules/mail/Makefile modules/composer-autosave/Makefile modules/connman/Makefile modules/mailto-handler/Makefile +modules/mdn/Makefile modules/network-manager/Makefile modules/online-accounts/Makefile modules/offline-alert/Makefile diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index b38a2c2220..799ea1a92c 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -2626,7 +2626,7 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) EMailReaderPrivate *priv; EMFormatHTML *formatter; GtkWidget *message_list; - EWebView *web_view; + EPreviewPane *preview_pane; CamelFolder *folder; const gchar *cursor_uid; const gchar *format_uid; @@ -2637,30 +2637,32 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader) formatter = e_mail_reader_get_formatter (reader); message_list = e_mail_reader_get_message_list (reader); + preview_pane = e_mail_reader_get_preview_pane (reader); cursor_uid = MESSAGE_LIST (message_list)->cursor_uid; format_uid = EM_FORMAT (formatter)->uid; - web_view = em_format_html_get_web_view (formatter); + e_preview_pane_clear_alerts (preview_pane); if (MESSAGE_LIST (message_list)->last_sel_single) { - GtkWidget *widget; - gboolean web_view_visible; + gboolean preview_visible; gboolean selected_uid_changed; /* Decide whether to download the full message now. */ - widget = GTK_WIDGET (web_view); - - web_view_visible = gtk_widget_get_mapped (widget); + preview_visible = + gtk_widget_get_mapped (GTK_WIDGET (preview_pane)); selected_uid_changed = g_strcmp0 (cursor_uid, format_uid); - if (web_view_visible && selected_uid_changed) { + if (preview_visible && selected_uid_changed) { EMailReaderClosure *closure; GCancellable *cancellable; EActivity *activity; + EWebView *web_view; gchar *string; + web_view = e_preview_pane_get_web_view (preview_pane); + string = g_strdup_printf ( _("Retrieving message '%s'"), cursor_uid); #if HAVE_CLUTTER @@ -2945,28 +2947,13 @@ mail_reader_message_seen (EMailReader *reader, const gchar *message_uid, CamelMimeMessage *message) { - EMailBackend *backend; - EMFormatHTML *formatter; CamelFolder *folder; guint32 mask, set; - guint32 flags; - - folder = e_mail_reader_get_folder (reader); - backend = e_mail_reader_get_backend (reader); - formatter = e_mail_reader_get_formatter (reader); - - flags = camel_folder_get_message_flags (folder, uid); - - if ((flags & CAMEL_MESSAGE_SEEN) == 0) { - CamelMimeMessage *message; - - message = EM_FORMAT (formatter)->message; - em_utils_handle_receipt (backend, folder, uid, message); - } mask = CAMEL_MESSAGE_SEEN; set = CAMEL_MESSAGE_SEEN; + folder = e_mail_reader_get_folder (reader); camel_folder_set_message_flags (folder, message_uid, mask, set); } diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 3f851c0991..bc84e5508c 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -1850,269 +1850,6 @@ em_utils_redirect_message (EShell *shell, composer_set_no_change (composer); } -/* Message disposition notifications, rfc 2298 */ -void -em_utils_handle_receipt (EMailBackend *backend, - CamelFolder *folder, - const gchar *message_uid, - CamelMimeMessage *message) -{ - EAccount *account; - const gchar *addr; - CamelMessageInfo *info; - - g_return_if_fail (E_IS_MAIL_BACKEND (backend)); - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); - - info = camel_folder_get_message_info (folder, message_uid); - if (info == NULL) - return; - - if (camel_message_info_user_flag (info, "receipt-handled")) { - camel_folder_free_message_info (folder, info); - return; - } - - 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_folder_free_message_info (folder, info); - - account = em_utils_guess_account_with_recipients (message, folder); - - /* TODO Should probably decode/format the address, - * since it could be in rfc2047 format. */ - if (addr == NULL) { - addr = ""; - } else { - while (camel_mime_is_lwsp (*addr)) - addr++; - } - - 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 (backend, folder, message); -} - -static void -em_utils_receipt_done (CamelFolder *folder, - GAsyncResult *result, - EMailBackend *backend) -{ - /* FIXME Poor error handling. */ - if (!e_mail_folder_append_message_finish (folder, result, NULL, NULL)) - return; - - mail_send (backend); -} - -void -em_utils_send_receipt (EMailBackend *backend, - CamelFolder *folder, - CamelMimeMessage *message) -{ - /* See RFC #3798 for a description of message receipts */ - EAccount *account = em_utils_guess_account_with_recipients (message, folder); - CamelMimeMessage *receipt = camel_mime_message_new (); - CamelMultipart *body = camel_multipart_new (); - CamelMimePart *part; - CamelDataWrapper *receipt_text, *receipt_data; - CamelContentType *type; - CamelInternetAddress *addr; - CamelStream *stream; - CamelFolder *out_folder; - CamelMessageInfo *info; - const gchar *message_id; - const gchar *message_date; - const gchar *message_subject; - const gchar *receipt_address; - gchar *fake_msgid; - gchar *hostname; - gchar *self_address, *receipt_subject; - gchar *ua, *recipient; - gchar *transport_uid; - gchar *content; - - message_id = camel_medium_get_header ( - CAMEL_MEDIUM (message), "Message-ID"); - message_date = camel_medium_get_header ( - CAMEL_MEDIUM (message), "Date"); - message_subject = camel_mime_message_get_subject (message); - receipt_address = camel_medium_get_header ( - CAMEL_MEDIUM (message), "Disposition-Notification-To"); - - if (!receipt_address) - return; - - /* the 'account' should be always set */ - g_return_if_fail (account != NULL); - - /* Collect information for the receipt */ - - /* We use camel_header_msgid_generate () to get a canonical - * hostname, then skip the part leading to '@' */ - hostname = strchr ((fake_msgid = camel_header_msgid_generate ()), '@'); - hostname++; - - self_address = account->id->address; - - if (!message_id) - message_id = ""; - if (!message_date) - message_date =""; - - /* Create toplevel container */ - camel_data_wrapper_set_mime_type ( - CAMEL_DATA_WRAPPER (body), - "multipart/report;" - "report-type=\"disposition-notification\""); - camel_multipart_set_boundary (body, NULL); - - /* Create textual receipt */ - receipt_text = camel_data_wrapper_new (); - type = camel_content_type_new ("text", "plain"); - camel_content_type_set_param (type, "format", "flowed"); - camel_content_type_set_param (type, "charset", "UTF-8"); - camel_data_wrapper_set_mime_type_field (receipt_text, type); - camel_content_type_unref (type); - content = g_strdup_printf ( - /* Translators: First %s is an email address, second %s - * is the subject of the email, third %s is the date. */ - _("Your message to %s about \"%s\" on %s has been read."), - self_address, message_subject, message_date); - stream = camel_stream_mem_new (); - camel_stream_write_string (stream, content, NULL, NULL); - camel_data_wrapper_construct_from_stream_sync ( - receipt_text, stream, NULL, NULL); - g_object_unref (stream); - g_free (content); - - part = camel_mime_part_new (); - camel_medium_set_content (CAMEL_MEDIUM (part), receipt_text); - camel_mime_part_set_encoding ( - part, CAMEL_TRANSFER_ENCODING_QUOTEDPRINTABLE); - g_object_unref (receipt_text); - camel_multipart_add_part (body, part); - g_object_unref (part); - - /* Create the machine-readable receipt */ - receipt_data = camel_data_wrapper_new (); - part = camel_mime_part_new (); - - ua = g_strdup_printf ( - "%s; %s", hostname, "Evolution " - VERSION SUB_VERSION " " VERSION_COMMENT); - recipient = g_strdup_printf ("rfc822; %s", self_address); - - type = camel_content_type_new ("message", "disposition-notification"); - camel_data_wrapper_set_mime_type_field (receipt_data, type); - camel_content_type_unref (type); - - content = g_strdup_printf ( - "Reporting-UA: %s\n" - "Final-Recipient: %s\n" - "Original-Message-ID: %s\n" - "Disposition: manual-action/MDN-sent-manually; displayed\n", - ua, recipient, message_id); - stream = camel_stream_mem_new (); - camel_stream_write_string (stream, content, NULL, NULL); - camel_data_wrapper_construct_from_stream_sync ( - receipt_data, stream, NULL, NULL); - g_object_unref (stream); - g_free (content); - - g_free (ua); - g_free (recipient); - g_free (fake_msgid); - - camel_medium_set_content (CAMEL_MEDIUM (part), receipt_data); - camel_mime_part_set_encoding (part, CAMEL_TRANSFER_ENCODING_7BIT); - g_object_unref (receipt_data); - camel_multipart_add_part (body, part); - g_object_unref (part); - - /* Finish creating the message */ - camel_medium_set_content ( - CAMEL_MEDIUM (receipt), CAMEL_DATA_WRAPPER (body)); - g_object_unref (body); - - /* Translators: %s is the subject of the email message */ - receipt_subject = g_strdup_printf ( - _("Delivery Notification for: \"%s\""), message_subject); - camel_mime_message_set_subject (receipt, receipt_subject); - g_free (receipt_subject); - - addr = camel_internet_address_new (); - camel_address_decode (CAMEL_ADDRESS (addr), self_address); - camel_mime_message_set_from (receipt, addr); - g_object_unref (addr); - - addr = camel_internet_address_new (); - camel_address_decode (CAMEL_ADDRESS (addr), receipt_address); - camel_mime_message_set_recipients ( - receipt, CAMEL_RECIPIENT_TYPE_TO, addr); - g_object_unref (addr); - - transport_uid = g_strconcat (account->uid, "-transport", NULL); - - camel_medium_set_header ( - CAMEL_MEDIUM (receipt), - "Return-Path", "<>"); - camel_medium_set_header ( - CAMEL_MEDIUM (receipt), - "X-Evolution-Account", - account->uid); - camel_medium_set_header ( - CAMEL_MEDIUM (receipt), - "X-Evolution-Transport", - transport_uid); - camel_medium_set_header ( - CAMEL_MEDIUM (receipt), - "X-Evolution-Fcc", - account->sent_folder_uri); - - g_free (transport_uid); - - /* Send the receipt */ - info = camel_message_info_new (NULL); - out_folder = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); - camel_message_info_set_flags ( - info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN); - - /* FIXME Pass a GCancellable. */ - e_mail_folder_append_message ( - out_folder, receipt, info, G_PRIORITY_DEFAULT, NULL, - (GAsyncReadyCallback) em_utils_receipt_done, backend); - - camel_message_info_free (info); -} - /* Replying to messages... */ EDestination ** diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h index bd6eb7cffd..215e6bb2bc 100644 --- a/mail/em-composer-utils.h +++ b/mail/em-composer-utils.h @@ -58,13 +58,6 @@ void em_utils_forward_messages (EMailReader *reader, GtkWidget *destroy_when_done); void em_utils_redirect_message (EShell *shell, CamelMimeMessage *message); -void em_utils_handle_receipt (EMailBackend *backend, - CamelFolder *folder, - const gchar *message_uid, - CamelMimeMessage *message); -void em_utils_send_receipt (EMailBackend *backend, - CamelFolder *folder, - CamelMimeMessage *message); gchar * em_utils_construct_composer_text (CamelMimeMessage *message, EMFormat *source_formatter); diff --git a/mail/mail.error.xml b/mail/mail.error.xml index f811abb9fd..118acc1522 100644 --- a/mail/mail.error.xml +++ b/mail/mail.error.xml @@ -396,13 +396,6 @@ An mbox account will be created to preserve the old mbox folders. You can delete <_secondary xml:space="preserve">Please check your account settings and try again. - - <_primary>Read receipt requested. - <_secondary xml:space="preserve">A read receipt notification has been requested for "{1}". Send the receipt notification to {0}? -