aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-ops.c')
-rw-r--r--mail/mail-ops.c307
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);
-}