diff options
author | NotZed <NotZed@HelixCode.com> | 2000-05-17 12:10:34 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2000-05-17 12:10:34 +0800 |
commit | 13a30fa49424793d4a09e58a604eafbb18c8eecc (patch) | |
tree | 62c438008024cf2b48b3a9beee0f7f679177b01e | |
parent | ba7f533031784b4c46d744f6e0bae9fe7feee981 (diff) | |
download | gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.tar gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.tar.gz gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.tar.bz2 gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.tar.lz gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.tar.xz gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.tar.zst gsoc2013-evolution-13a30fa49424793d4a09e58a604eafbb18c8eecc.zip |
Ok, so all incoming mail comes through filters, yay!
The default is just to copy to the inbox.
I wouldn't trust this code as far as i could piss up
a wall, just yet.
2000-05-16 NotZed <NotZed@HelixCode.com>
* mail-ops.c
(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.
svn path=/trunk/; revision=3102
-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); } |