aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
Diffstat (limited to 'mail')
-rw-r--r--mail/ChangeLog7
-rw-r--r--mail/mail-ops.c264
2 files changed, 149 insertions, 122 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index ce2dfe1e72..cb8264e7b3 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,10 @@
+2000-10-07 Miguel de Icaza <miguel@helixcode.com>
+
+ * mail-ops.c (do_fetch_mail): Move the functionality to
+ incorporate messages into mail_incorporate_messages.
+ (mail_load_evolution_rule_context): New function. Move the
+ functionality for loading the context rules to its own function.
+
2000-10-06 Iain Holmes <iain@helixcode.com>
* mail-summary.c: Fix the locking up of the mail by only calling
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index db7513e0c3..9bca75bb13 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -81,6 +81,144 @@ setup_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
camel_object_ref (CAMEL_OBJECT (input->destination));
}
+static FilterContext *
+mail_load_evolution_rule_context ()
+{
+ gchar *userrules;
+ gchar *systemrules;
+ FilterContext *fc;
+
+ userrules = g_strdup_printf ("%s/filters.xml", evolution_dir);
+ systemrules = g_strdup_printf ("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR);
+ fc = filter_context_new ();
+ rule_context_load ((RuleContext *)fc, systemrules, userrules, NULL, NULL);
+ g_free (userrules);
+ g_free (systemrules);
+
+ return fc;
+}
+
+static void
+mail_incorporate_messages (CamelFolder *folder,
+ fetch_mail_input_t *input,
+ fetch_mail_data_t *data,
+ CamelException *ex)
+{
+ CamelUIDCache *cache = NULL;
+ FilterContext *fc;
+ FilterDriver *filter;
+ GPtrArray *uids, *new_uids;
+ char *url, *p, *filename;
+ FILE *logfile;
+ int i;
+
+ fc = mail_load_evolution_rule_context ();
+ filter = filter_driver_new (fc, mail_tool_filter_get_folder_func, 0);
+
+ if (input->hook_func)
+ camel_object_hook_event (
+ CAMEL_OBJECT (input->destination), "folder_changed",
+ input->hook_func, input->hook_data);
+
+ camel_folder_freeze (input->destination);
+
+ uids = camel_folder_get_uids (folder);
+
+ if (input->keep_on_server) {
+ /* get the mail source's uid cache file */
+ url = camel_url_to_string (CAMEL_SERVICE (folder->parent_store)->url, FALSE);
+ for (p = url; *p; p++) {
+ if (!isascii ((unsigned char)*p) || strchr (" /'\"`&();|<>${}!", *p))
+ *p = '_';
+ }
+
+ filename = g_strdup_printf ("%s/config/cache-%s", evolution_dir, url);
+ g_free (url);
+
+ cache = camel_uid_cache_new (filename);
+ g_free (filename);
+
+ if (cache) {
+ /* determine the new uids */
+ new_uids = camel_uid_cache_get_new_uids (cache, uids);
+ camel_folder_free_uids (folder, uids);
+ uids = new_uids;
+ }
+ }
+
+ /* FIXME: find out if we want to log or not - config option */
+ if (TRUE /* perform_logging */) {
+ filename = g_strdup_printf ("%s/evolution-filter-log", evolution_dir);
+ logfile = fopen (filename, "a+");
+ g_free (filename);
+ } else
+ logfile = NULL;
+
+ /* get/filter the new messages */
+ for (i = 0; i < uids->len; i++) {
+ CamelMimeMessage *message;
+ CamelMessageInfo *info;
+ gboolean free_info;
+
+ mail_op_set_message ("Retrieving message %d of %d", i + 1, uids->len);
+
+ message = camel_folder_get_message (folder, uids->pdata[i], ex);
+ if (camel_exception_is_set (ex))
+ continue;
+
+ if (camel_folder_has_summary_capability (folder)) {
+ info = (CamelMessageInfo *) camel_folder_get_message_info (folder, uids->pdata[i]);
+ free_info = FALSE;
+ } else {
+ info = g_new0 (CamelMessageInfo, 1);
+ free_info = TRUE;
+ }
+
+ filter_driver_run (filter, message, info, input->destination,
+ FILTER_SOURCE_INCOMING, logfile, ex);
+
+ if (free_info)
+ camel_message_info_free (info);
+
+ /* we don't care if it was filtered or not here because no matter
+ what it's been copied to at least 1 folder - even if it's just
+ the default (assuming we didn't get an exception) */
+ if (!input->keep_on_server && !camel_exception_is_set (ex)) {
+ camel_folder_set_message_flags (folder, uids->pdata[i],
+ CAMEL_MESSAGE_DELETED,
+ CAMEL_MESSAGE_DELETED);
+ }
+ camel_object_unref (CAMEL_OBJECT (message));
+ }
+
+ /* close the log file */
+ if (logfile)
+ fclose (logfile);
+
+ gtk_object_unref (GTK_OBJECT (filter));
+
+ camel_folder_sync (folder, TRUE, ex);
+
+ camel_folder_thaw (input->destination);
+
+ if (input->hook_func)
+ camel_object_unhook_event (
+ CAMEL_OBJECT (input->destination), "folder_changed",
+ input->hook_func, input->hook_data);
+
+ if (cache) {
+ /* save the cache for the next time we fetch mail! */
+ camel_uid_cache_free_uids (uids);
+
+ if (!camel_exception_is_set (ex))
+ camel_uid_cache_save (cache);
+ camel_uid_cache_destroy (cache);
+ } else
+ camel_folder_free_uids (folder, uids);
+
+ data->empty = FALSE;
+}
+
static void
do_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
{
@@ -117,129 +255,11 @@ do_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
}
mail_tool_camel_lock_up ();
- if (camel_folder_get_message_count (folder) == 0) {
+ if (camel_folder_get_message_count (folder) == 0)
data->empty = TRUE;
- } else {
- CamelUIDCache *cache = NULL;
- gchar *userrules;
- gchar *systemrules;
- FilterContext *fc;
- FilterDriver *filter;
- GPtrArray *uids, *new_uids;
- char *url, *p, *filename;
- FILE *logfile;
- int i;
-
- userrules = g_strdup_printf ("%s/filters.xml", evolution_dir);
- systemrules = g_strdup_printf ("%s/evolution/filtertypes.xml", EVOLUTION_DATADIR);
- fc = filter_context_new ();
- rule_context_load ((RuleContext *)fc, systemrules, userrules, NULL, NULL);
- g_free (userrules);
- g_free (systemrules);
-
- filter = filter_driver_new (fc, mail_tool_filter_get_folder_func, 0);
-
- if (input->hook_func)
- camel_object_hook_event (CAMEL_OBJECT (input->destination), "folder_changed",
- input->hook_func, input->hook_data);
-
- camel_folder_freeze (input->destination);
-
- uids = camel_folder_get_uids (folder);
-
- if (input->keep_on_server) {
- /* get the mail source's uid cache file */
- url = camel_url_to_string (CAMEL_SERVICE (folder->parent_store)->url, FALSE);
- for (p = url; *p; p++) {
- if (!isascii ((unsigned char)*p) || strchr (" /'\"`&();|<>${}!", *p))
- *p = '_';
- }
-
- filename = g_strdup_printf ("%s/config/cache-%s", evolution_dir, url);
- g_free (url);
-
- cache = camel_uid_cache_new (filename);
- g_free (filename);
-
- if (cache) {
- /* determine the new uids */
- new_uids = camel_uid_cache_get_new_uids (cache, uids);
- camel_folder_free_uids (folder, uids);
- uids = new_uids;
- }
- }
-
- /* FIXME: find out if we want to log or not - config option */
- if (TRUE /* perform_logging */) {
- filename = g_strdup_printf ("%s/evolution-filter-log", evolution_dir);
- logfile = fopen (filename, "a+");
- g_free (filename);
- } else
- logfile = NULL;
-
- /* get/filter the new messages */
- for (i = 0; i < uids->len; i++) {
- CamelMimeMessage *message;
- CamelMessageInfo *info;
- gboolean free_info;
-
- mail_op_set_message ("Retrieving message %d of %d", i + 1, uids->len);
-
- message = camel_folder_get_message (folder, uids->pdata[i], ex);
- if (camel_exception_is_set (ex))
- continue;
-
- if (camel_folder_has_summary_capability (folder)) {
- info = (CamelMessageInfo *) camel_folder_get_message_info (folder, uids->pdata[i]);
- free_info = FALSE;
- } else {
- info = g_new0 (CamelMessageInfo, 1);
- free_info = TRUE;
- }
-
- filter_driver_run (filter, message, info, input->destination,
- FILTER_SOURCE_INCOMING, logfile, ex);
-
- if (free_info)
- camel_message_info_free (info);
-
- /* we don't care if it was filtered or not here because no matter
- what it's been copied to at least 1 folder - even if it's just
- the default (assuming we didn't get an exception) */
- if (!input->keep_on_server && !camel_exception_is_set (ex)) {
- camel_folder_set_message_flags (folder, uids->pdata[i],
- CAMEL_MESSAGE_DELETED,
- CAMEL_MESSAGE_DELETED);
- }
- camel_object_unref (CAMEL_OBJECT (message));
- }
-
- /* close the log file */
- if (logfile)
- fclose (logfile);
-
- gtk_object_unref (GTK_OBJECT (filter));
-
- camel_folder_sync (folder, TRUE, ex);
-
- camel_folder_thaw (input->destination);
-
- if (input->hook_func)
- camel_object_unhook_event (CAMEL_OBJECT (input->destination), "folder_changed",
- input->hook_func, input->hook_data);
-
- if (cache) {
- /* save the cache for the next time we fetch mail! */
- camel_uid_cache_free_uids (uids);
-
- if (!camel_exception_is_set (ex))
- camel_uid_cache_save (cache);
- camel_uid_cache_destroy (cache);
- } else
- camel_folder_free_uids (folder, uids);
-
- data->empty = FALSE;
- }
+ else
+ mail_incorporate_messages (folder, input, data, ex);
+
mail_tool_camel_lock_down ();
camel_object_unref (CAMEL_OBJECT (folder));