diff options
Diffstat (limited to 'mail/mail-ops.c')
-rw-r--r-- | mail/mail-ops.c | 307 |
1 files changed, 88 insertions, 219 deletions
diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 0572f1596d..a0629ac093 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -30,8 +30,6 @@ /* #include <ctype.h> */ #include <errno.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-exec.h> #include <gal/util/e-util.h> #include <gal/widgets/e-unicode.h> #include <gal/util/e-unicode-i18n.h> @@ -43,7 +41,6 @@ #include "mail-tools.h" #include "mail-ops.h" #include "mail-vfolder.h" -#include "mail-session.h" #include "composer/e-msg-composer.h" #include "folder-browser.h" #include "e-util/e-html-utils.h" @@ -122,14 +119,13 @@ filter_folder_filter (struct _mail_msg *mm) folder_uids = uids = camel_folder_get_uids (folder); camel_filter_driver_filter_folder (m->driver, folder, m->cache, uids, m->delete, &mm->ex); - camel_filter_driver_flush (m->driver, &mm->ex); if (folder_uids) camel_folder_free_uids (folder, folder_uids); - /* sync our source folder */ + /* sync and expunge */ if (!m->cache) - camel_folder_sync (folder, FALSE, camel_exception_is_set (&mm->ex) ? NULL : &mm->ex); + camel_folder_sync (folder, TRUE, camel_exception_is_set (&mm->ex) ? NULL : &mm->ex); camel_folder_thaw (folder); if (m->destination) @@ -168,8 +164,6 @@ filter_folder_free (struct _mail_msg *mm) if (m->driver) camel_object_unref (CAMEL_OBJECT (m->driver)); - - mail_session_flush_filter_log (); } static struct _mail_msg_op filter_folder_op = { @@ -181,8 +175,7 @@ static struct _mail_msg_op filter_folder_op = { void mail_filter_folder (CamelFolder *source_folder, GPtrArray *uids, - const char *type, gboolean notify, - CamelOperation *cancel) + const char *type, CamelOperation *cancel) { struct _filter_mail_msg *m; @@ -199,12 +192,6 @@ mail_filter_folder (CamelFolder *source_folder, GPtrArray *uids, m->driver = camel_session_get_filter_driver (session, type, NULL); - if (!notify) { - /* FIXME: have a #define NOTIFY_FILTER_NAME macro? */ - /* the filter name has to stay in sync with mail-session::get_filter_driver */ - camel_filter_driver_remove_rule_by_name (m->driver, "new-mail-notification"); - } - e_thread_put (mail_thread_new, (EMsg *)m); } @@ -212,7 +199,7 @@ mail_filter_folder (CamelFolder *source_folder, GPtrArray *uids, void mail_filter_on_demand (CamelFolder *folder, GPtrArray *uids) { - mail_filter_folder (folder, uids, FILTER_SOURCE_INCOMING, FALSE, NULL); + mail_filter_folder (folder, uids, FILTER_SOURCE_INCOMING, NULL); } /* ********************************************************************** */ @@ -430,42 +417,28 @@ mail_fetch_mail (const char *source, int keep, const char *type, CamelOperation extern CamelFolder *sent_folder; -static char *normal_recipients[] = { - CAMEL_RECIPIENT_TYPE_TO, - CAMEL_RECIPIENT_TYPE_CC, - CAMEL_RECIPIENT_TYPE_BCC -}; - -static char *resent_recipients[] = { - CAMEL_RECIPIENT_TYPE_RESENT_TO, - CAMEL_RECIPIENT_TYPE_RESENT_CC, - CAMEL_RECIPIENT_TYPE_RESENT_BCC -}; - /* send 1 message to a specific transport */ static void mail_send_message (CamelMimeMessage *message, const char *destination, CamelFilterDriver *driver, CamelException *ex) { - const CamelInternetAddress *iaddr; - CamelAddress *from, *recipients; CamelMessageInfo *info; CamelTransport *xport = NULL; char *transport_url = NULL; char *sent_folder_uri = NULL; - const char *resent_from; CamelFolder *folder; XEvolution *xev; - int i; - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", + camel_medium_add_header (CAMEL_MEDIUM (message), "X-Mailer", "Ximian Evolution " VERSION SUB_VERSION " " VERSION_COMMENT); camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); xev = mail_tool_remove_xevolution_headers (message); - if (xev->account) { + if (xev->transport) { + transport_url = g_strstrip (g_strdup (xev->transport)); + } else if (xev->account) { const MailConfigAccount *account; char *name; @@ -475,8 +448,6 @@ mail_send_message (CamelMimeMessage *message, const char *destination, if (account && account->transport && account->transport->url) transport_url = g_strdup (account->transport->url); - } else if (xev->transport) { - transport_url = g_strstrip (g_strdup (xev->transport)); } if (xev->fcc) @@ -491,27 +462,7 @@ mail_send_message (CamelMimeMessage *message, const char *destination, return; } - from = (CamelAddress *) camel_internet_address_new (); - resent_from = camel_medium_get_header (CAMEL_MEDIUM (message), "Resent-From"); - if (resent_from) { - camel_address_decode (from, resent_from); - } else { - iaddr = camel_mime_message_get_from (message); - camel_address_copy (from, CAMEL_ADDRESS (iaddr)); - } - - recipients = (CamelAddress *) camel_internet_address_new (); - for (i = 0; i < 3; i++) { - const char *type; - - type = resent_from ? resent_recipients[i] : normal_recipients[i]; - iaddr = camel_mime_message_get_recipients (message, type); - camel_address_cat (recipients, CAMEL_ADDRESS (iaddr)); - } - - camel_transport_send_to (xport, message, from, recipients, ex); - camel_object_unref (CAMEL_OBJECT (recipients)); - camel_object_unref (CAMEL_OBJECT (from)); + camel_transport_send (xport, CAMEL_MEDIUM (message), ex); mail_tool_restore_xevolution_headers (message, xev); mail_tool_destroy_xevolution (xev); @@ -558,7 +509,7 @@ mail_send_message (CamelMimeMessage *message, const char *destination, } if (folder) { - camel_folder_append_message (folder, message, info, NULL, ex); + camel_folder_append_message (folder, message, info, ex); if (camel_exception_is_set (ex)) { ExceptionId id; @@ -582,7 +533,7 @@ struct _send_mail_msg { CamelFilterDriver *driver; char *destination; CamelMimeMessage *message; - + void (*done)(char *uri, CamelMimeMessage *message, gboolean sent, void *data); void *data; }; @@ -628,7 +579,7 @@ static void send_mail_free (struct _mail_msg *mm) { struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - + camel_object_unref (CAMEL_OBJECT (m->driver)); camel_object_unref (CAMEL_OBJECT (m->message)); g_free (m->destination); @@ -826,9 +777,8 @@ struct _append_msg { CamelFolder *folder; CamelMimeMessage *message; CamelMessageInfo *info; - char *appended_uid; - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, char *appended_uid, void *data); + void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data); void *data; }; @@ -844,7 +794,7 @@ append_mail_append (struct _mail_msg *mm) struct _append_msg *m = (struct _append_msg *)mm; camel_mime_message_set_date(m->message, CAMEL_MESSAGE_DATE_CURRENT, 0); - camel_folder_append_message(m->folder, m->message, m->info, &m->appended_uid, &mm->ex); + camel_folder_append_message(m->folder, m->message, m->info, &mm->ex); } static void @@ -853,7 +803,7 @@ append_mail_appended (struct _mail_msg *mm) struct _append_msg *m = (struct _append_msg *)mm; if (m->done) - m->done(m->folder, m->message, m->info, !camel_exception_is_set(&mm->ex), m->appended_uid, m->data); + m->done(m->folder, m->message, m->info, !camel_exception_is_set(&mm->ex), m->data); } static void @@ -874,7 +824,7 @@ static struct _mail_msg_op append_mail_op = { void mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageInfo *info, - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, char *appended_uid, void *data), + void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data), void *data) { struct _append_msg *m; @@ -925,6 +875,10 @@ transfer_messages_transfer (struct _mail_msg *mm) { struct _transfer_msg *m = (struct _transfer_msg *)mm; CamelFolder *dest; + char *desc; + void (*func) (CamelFolder *, GPtrArray *, + CamelFolder *, + CamelException *); dest = mail_tool_uri_to_folder (m->dest_uri, m->dest_flags, &mm->ex); if (camel_exception_is_set (&mm->ex)) @@ -936,10 +890,39 @@ transfer_messages_transfer (struct _mail_msg *mm) return; } + if (m->delete) { + func = camel_folder_move_messages_to; + desc = _("Moving"); + } else { + func = camel_folder_copy_messages_to; + desc = _("Copying"); + } + camel_folder_freeze (m->source); camel_folder_freeze (dest); - camel_folder_transfer_messages_to (m->source, m->uids, dest, NULL, m->delete, &mm->ex); + if (CAMEL_IS_VTRASH_FOLDER (dest)) { + if (m->delete) { + int i; + + /* Just mark all the messages as deleted */ + for (i = 0; i < m->uids->len; i++) + camel_folder_delete_message (m->source, m->uids->pdata[i]); + } else { + /* no-op - can't copy messages to*/ + } + } else { + if (dest == m->source) { + int i; + + /* Undelete the messages if they are marked as deleted */ + for (i = 0; i < m->uids->len; i++) + camel_folder_set_message_flags (m->source, m->uids->pdata[i], + CAMEL_MESSAGE_DELETED, 0); + } else { + (func) (m->source, m->uids, dest, &mm->ex); + } + } camel_folder_thaw (m->source); camel_folder_thaw (dest); @@ -1995,16 +1978,15 @@ save_part_save (struct _mail_msg *mm) struct _save_part_msg *m = (struct _save_part_msg *)mm; CamelMimeFilterCharset *charsetfilter; CamelContentType *content_type; - CamelStream *filtered_stream; + CamelStreamFilter *filtered_stream; CamelStream *stream_fs; CamelDataWrapper *data; const char *charset; stream_fs = camel_stream_fs_new_with_name (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (stream_fs == NULL) { - camel_exception_setv (&mm->ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot create output file: %s:\n %s"), - m->path, g_strerror (errno)); + camel_exception_setv (&mm->ex, 1, _("Cannot create output file: %s:\n %s"), m->path, + g_strerror (errno)); return; } @@ -2020,23 +2002,24 @@ save_part_save (struct _mail_msg *mm) && (charset = header_content_type_param (content_type, "charset")) && g_strcasecmp (charset, "utf-8") != 0) { charsetfilter = camel_mime_filter_charset_new_convert ("utf-8", charset); - filtered_stream = (CamelStream *) camel_stream_filter_new_with_stream (stream_fs); - camel_object_unref (CAMEL_OBJECT (stream_fs)); + filtered_stream = camel_stream_filter_new_with_stream (stream_fs); if (charsetfilter) { - camel_stream_filter_add (CAMEL_STREAM_FILTER (filtered_stream), CAMEL_MIME_FILTER (charsetfilter)); + camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (charsetfilter)); camel_object_unref (CAMEL_OBJECT (charsetfilter)); } } else { - filtered_stream = stream_fs; + /* no we can't use a CAMEL_BLAH() cast here, since its not true, HOWEVER + we only treat it as a normal stream from here on, so it is OK */ + filtered_stream = (CamelStreamFilter *)stream_fs; + camel_object_ref (CAMEL_OBJECT (stream_fs)); } - if (camel_data_wrapper_write_to_stream (data, filtered_stream) == -1 - || camel_stream_flush (filtered_stream) == -1) - camel_exception_setv (&mm->ex, CAMEL_EXCEPTION_SYSTEM, - _("Could not write data: %s"), - g_strerror (errno)); + if (camel_data_wrapper_write_to_stream (data, CAMEL_STREAM (filtered_stream)) == -1 + || camel_stream_flush (CAMEL_STREAM (filtered_stream)) == -1) + camel_exception_setv (&mm->ex, 1, _("Could not write data: %s"), g_strerror (errno)); camel_object_unref (CAMEL_OBJECT (filtered_stream)); + camel_object_unref (CAMEL_OBJECT (stream_fs)); } static void @@ -2085,85 +2068,6 @@ mail_save_part (CamelMimePart *part, const char *path, } -/* ** PREPARE OFFLINE ***************************************************** */ - -struct _prep_offline_msg { - struct _mail_msg msg; - - CamelOperation *cancel; - char *uri; - void (*done)(const char *uri, void *data); - void *data; -}; - -static void prep_offline_do(struct _mail_msg *mm) -{ - struct _prep_offline_msg *m = (struct _prep_offline_msg *)mm; - CamelFolder *folder; - - if (m->cancel) - camel_operation_register(m->cancel); - - folder = mail_tool_uri_to_folder(m->uri, 0, &mm->ex); - if (folder) { - if (CAMEL_IS_DISCO_FOLDER(folder)) { - camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)folder, - "(match-all (not (system-flag \"Seen\")))", - &mm->ex); - } - /* prepare_for_offline should do this? */ - /* of course it should all be atomic, but ... */ - camel_folder_sync(folder, FALSE, NULL); - camel_object_unref((CamelObject *)folder); - } - - if (m->cancel) - camel_operation_unregister(m->cancel); -} - -static void prep_offline_done(struct _mail_msg *mm) -{ - struct _prep_offline_msg *m = (struct _prep_offline_msg *)mm; - - if (m->done) - m->done(m->uri, m->data); -} - -static void prep_offline_free(struct _mail_msg *mm) -{ - struct _prep_offline_msg *m = (struct _prep_offline_msg *)mm; - - if (m->cancel) - camel_operation_unref(m->cancel); - g_free(m->uri); -} - -static struct _mail_msg_op prep_offline_op = { - NULL, /* DO NOT CHANGE THIS, IT MUST BE NULL FOR CANCELLATION TO WORK */ - prep_offline_do, - prep_offline_done, - prep_offline_free, -}; - -void -mail_prep_offline(const char *uri, - CamelOperation *cancel, - void (*done)(const char *, void *data), - void *data) -{ - struct _prep_offline_msg *m; - - m = mail_msg_new(&prep_offline_op, NULL, sizeof(*m)); - m->cancel = cancel; - if (cancel) - camel_operation_ref(cancel); - m->uri = g_strdup(uri); - m->data = data; - m->done = done; - - e_thread_put(mail_thread_queued, (EMsg *)m); -} - /* ** GO OFFLINE ***************************************************** */ struct _set_offline_msg { @@ -2181,9 +2085,9 @@ static char *set_offline_desc(struct _mail_msg *mm, int done) char *service_name = camel_service_get_name (CAMEL_SERVICE (m->store), TRUE); char *msg; - msg = g_strdup_printf(m->offline?_("Disconnecting from %s"):_("Reconnecting to %s"), - service_name); - g_free(service_name); + msg = g_strdup_printf (m->offline ? _("Disconnecting from %s") : + _("Reconnecting to %s"), service_name); + g_free (service_name); return msg; } @@ -2197,11 +2101,29 @@ static void set_offline_do(struct _mail_msg *mm) camel_service_disconnect (CAMEL_SERVICE (m->store), TRUE, &mm->ex); } - } else { - camel_disco_store_set_status (CAMEL_DISCO_STORE (m->store), - m->offline ? CAMEL_DISCO_STORE_OFFLINE : CAMEL_DISCO_STORE_ONLINE, - &mm->ex); + return; + } + + if (m->offline && camel_disco_store_status (CAMEL_DISCO_STORE (m->store)) == CAMEL_DISCO_STORE_ONLINE) { + CamelFolder *inbox; + + /* FIXME. Something more generic here... (bug 10755) */ + inbox = camel_store_get_inbox (m->store, NULL); + if (inbox) { + camel_disco_folder_prepare_for_offline ( + CAMEL_DISCO_FOLDER (inbox), + "(match-all (not (system-flag \"Seen\")))", + &mm->ex); + camel_folder_sync (inbox, FALSE, NULL); + camel_object_unref (CAMEL_OBJECT (inbox)); + if (camel_exception_is_set (&mm->ex)) + return; + } } + + camel_disco_store_set_status (CAMEL_DISCO_STORE (m->store), + m->offline ? CAMEL_DISCO_STORE_OFFLINE : + CAMEL_DISCO_STORE_ONLINE, &mm->ex); } static void set_offline_done(struct _mail_msg *mm) @@ -2248,56 +2170,3 @@ mail_store_set_offline (CamelStore *store, gboolean offline, e_thread_put(mail_thread_queued, (EMsg *)m); } - -/* ** Execute Shell Command ***************************************************** */ - -struct _execute_shell_command_msg { - struct _mail_msg msg; - - char *command; -}; - -static char *execute_shell_command_desc (struct _mail_msg *mm, int done) -{ - struct _execute_shell_command_msg *m = (struct _execute_shell_command_msg *) mm; - char *msg; - - msg = g_strdup_printf (_("Executing shell command: %s"), m->command); - - return msg; -} - -static void execute_shell_command_do (struct _mail_msg *mm) -{ - struct _execute_shell_command_msg *m = (struct _execute_shell_command_msg *) mm; - - gnome_execute_shell (NULL, m->command); -} - -static void execute_shell_command_free (struct _mail_msg *mm) -{ - struct _execute_shell_command_msg *m = (struct _execute_shell_command_msg *) mm; - - g_free (m->command); -} - -static struct _mail_msg_op execute_shell_command_op = { - execute_shell_command_desc, - execute_shell_command_do, - NULL, - execute_shell_command_free, -}; - -void -mail_execute_shell_command (CamelFilterDriver *driver, const char *command, void *data) -{ - struct _execute_shell_command_msg *m; - - if (command == NULL) - return; - - m = mail_msg_new (&execute_shell_command_op, NULL, sizeof (*m)); - m->command = g_strdup (command); - - e_thread_put (mail_thread_queued, (EMsg *) m); -} |