diff options
-rw-r--r-- | mail/ChangeLog | 5 | ||||
-rw-r--r-- | mail/mail-ops.c | 154 |
2 files changed, 95 insertions, 64 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 79dff4f13b..7bc59eba43 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -2,6 +2,11 @@ * mail-ops.c (filter_edit): Function to bring up the filter editor. (filter_druid_clicked): Save/close dialogue. + (fetch_mail): Apply filters to incoming mail ... *hold breath* + If we are coming from a non-indexed/searchable/etc source, then + copy it to an mbox first. When copying mail from an mbox source, + dont remove it aftewards, open it for append, so partially + filtered mail isn't lost. * Makefile.am (evolution_mail_LDADD): Added libfilter. (INCLUDES): Add EVOLUTION_DATADIR, and fix matt's brokeneditor(tm) diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 9a773d62f8..dc338a1805 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -30,6 +30,7 @@ #include "folder-browser.h" #include "e-util/e-setup.h" #include "filter/filter-editor.h" +#include "filter/filter-driver.h" #ifndef HAVE_MKSTEMP #include <fcntl.h> @@ -78,9 +79,10 @@ fetch_mail (GtkWidget *button, gpointer user_data) CamelException *ex; CamelStore *store = NULL; CamelFolder *folder = NULL; - int nmsgs, i; - CamelMimeMessage *msg = NULL; char *path, *url = NULL; + FilterDriver *filter = NULL; + char *userrules, *systemrules; + char *tmp_mbox = NULL, *source; if (!check_configured ()) return; @@ -100,23 +102,18 @@ fetch_mail (GtkWidget *button, gpointer user_data) path = CAMEL_SERVICE (fb->folder->parent_store)->url->path; ex = camel_exception_new (); + tmp_mbox = g_strdup_printf ("%s/movemail", path); + /* If fetching mail from an mbox store, safely copy it to a * temporary store first. */ if (!strncmp (url, "mbox:", 5)) { - char *tmp_mbox, *source; int tmpfd; - tmp_mbox = g_strdup_printf ("%s/movemail.XXXXXX", path); -#ifdef HAVE_MKSTEMP - tmpfd = mkstemp (tmp_mbox); -#else - if (mktemp (tmp_mbox)) { - tmpfd = open (tmp_mbox, O_RDWR | O_CREAT | O_EXCL, - S_IRUSR | S_IWUSR); - } else - tmpfd = -1; -#endif + printf("moving from a local mbox\n"); + + tmpfd = open (tmp_mbox, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); + if (tmpfd == -1) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, "Couldn't create temporary " @@ -137,80 +134,107 @@ fetch_mail (GtkWidget *button, gpointer user_data) /* FALL THROUGH */ case 0: - unlink (tmp_mbox); - g_free (tmp_mbox); goto cleanup; } folder = camel_store_get_folder (fb->folder->parent_store, strrchr (tmp_mbox, '/') + 1, ex); + camel_folder_open (folder, FOLDER_OPEN_READ, ex); + if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { mail_exception_dialog ("Unable to move mail", ex, fb); - g_free (tmp_mbox); goto cleanup; } } else { + CamelFolder *sourcefolder; + store = camel_session_get_store (session, url, ex); if (!store) { - mail_exception_dialog ("Unable to get new mail", - ex, fb); + mail_exception_dialog ("Unable to get new mail", ex, fb); goto cleanup; } camel_service_connect_with_url (CAMEL_SERVICE (store), url, ex); if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { - mail_exception_dialog ("Unable to get new mail", - ex, fb); + mail_exception_dialog ("Unable to get new mail", ex, fb); goto cleanup; } - folder = camel_store_get_folder (store, "inbox", ex); - if (!folder) { - mail_exception_dialog ("Unable to get new mail", - ex, fb); + sourcefolder = camel_store_get_folder (store, "inbox", ex); + camel_folder_open (sourcefolder, FOLDER_OPEN_READ, ex); + if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { + mail_exception_dialog ("Unable to get new mail", ex, fb); goto cleanup; } - } - camel_folder_open (folder, FOLDER_OPEN_READ, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { - mail_exception_dialog ("Unable to get new mail", ex, fb); - goto cleanup; + /* can we perform filtering on this source? */ + if (!(sourcefolder->has_summary_capability + && sourcefolder->has_uid_capability + && sourcefolder->has_search_capability)) { + int i, count; + + printf("folder isn't searchable, performing movemail ...\n"); + + folder = camel_store_get_folder (fb->folder->parent_store, + strrchr (tmp_mbox, '/') + 1, + ex); + + if (!camel_folder_exists(folder, ex)) { + camel_folder_create(folder, ex); + } + + camel_folder_open(folder, FOLDER_OPEN_RW, ex); + + if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { + mail_exception_dialog ("Unable to move mail", ex, fb); + goto cleanup; + } + + count = camel_folder_get_message_count (sourcefolder, ex); + printf("got %d messages in source\n", count); + for (i = 1; i <= count; i++) { + CamelMimeMessage *msg; + printf("copying message %d to dest\n", i); + msg = camel_folder_get_message_by_number (sourcefolder, i, ex); + if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { + mail_exception_dialog ("Unable to read message", ex, fb); + gtk_object_unref((GtkObject *)msg); + gtk_object_unref((GtkObject *)sourcefolder); + goto cleanup; + } + + camel_folder_append_message (folder, msg, ex); + if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { + mail_exception_dialog ("Unable to write message", ex, fb); + gtk_object_unref((GtkObject *)msg); + gtk_object_unref((GtkObject *)sourcefolder); + goto cleanup; + } + + camel_folder_delete_message_by_number(sourcefolder, i, ex); + gtk_object_unref((GtkObject *)msg); + } + gtk_object_unref((GtkObject *)sourcefolder); + } else { + printf("we can search on this folder, performing search!\n"); + folder = sourcefolder; + } } - nmsgs = camel_folder_get_message_count (folder, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { - mail_exception_dialog ("Unable to get new mail", ex, fb); - goto cleanup; - } + /* apply filtering rules to this inbox */ + filter = filter_driver_new(); + userrules = g_strdup_printf ("%s/filters.xml", evolution_dir); + systemrules = g_strdup_printf("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR); + filter_driver_set_rules(filter, systemrules, userrules); + filter_driver_set_session(filter, session); + g_free(userrules); + g_free(systemrules); - if (nmsgs == 0) + if (filter_driver_run(filter, folder, fb->folder) == -1) { + mail_exception_dialog ("Unable to get new mail", ex, fb); goto cleanup; - - for (i = 1; i <= nmsgs; i++) { - msg = camel_folder_get_message_by_number (folder, i, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { - mail_exception_dialog ("Unable to read message", - ex, fb); - goto cleanup; - } - - camel_folder_append_message (fb->folder, msg, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { - mail_exception_dialog ("Unable to write message", - ex, fb); - goto cleanup; - } - - camel_folder_delete_message_by_number (folder, i, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { - mail_exception_dialog ("Unable to delete message", - ex, fb); - goto cleanup; - } } - msg = NULL; /* Redisplay. Ick. FIXME */ path = g_strdup_printf ("file://%s", path); @@ -218,6 +242,10 @@ fetch_mail (GtkWidget *button, gpointer user_data) g_free (path); cleanup: + g_free(tmp_mbox); + + if (filter) + gtk_object_unref((GtkObject *)filter); if (url) g_free (url); if (folder) { @@ -230,8 +258,6 @@ fetch_mail (GtkWidget *button, gpointer user_data) gtk_object_unref (GTK_OBJECT (store)); } camel_exception_free (ex); - if (msg) - gtk_object_unref (GTK_OBJECT (msg)); } @@ -437,7 +463,7 @@ filter_druid_clicked(FilterEditor *fe, int button, FolderBrowser *fb) g_free(user); } if (button != -1) { - gnome_dialog_close(fe); + gnome_dialog_close((GnomeDialog *)fe); } } @@ -451,13 +477,13 @@ void filter_edit (GtkWidget *button, gpointer user_data) fe = filter_editor_new(); user = g_strdup_printf ("%s/filters.xml", evolution_dir); - system = g_strdup_printf("%s/filtertypes.xml", EVOLUTION_DATADIR); + system = g_strdup_printf("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR); filter_editor_set_rule_files(fe, system, user); g_free(user); g_free(system); gnome_dialog_append_buttons((GnomeDialog *)fe, GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, 0); - gtk_signal_connect(fe, "clicked", filter_druid_clicked, fb); - gtk_widget_show(fe); + gtk_signal_connect((GtkObject *)fe, "clicked", filter_druid_clicked, fb); + gtk_widget_show((GtkWidget *)fe); } |