aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
Diffstat (limited to 'mail')
-rw-r--r--mail/ChangeLog33
-rw-r--r--mail/folder-browser-factory.c2
-rw-r--r--mail/mail-config.c16
-rw-r--r--mail/mail-config.h3
-rw-r--r--mail/mail-ops.c207
-rw-r--r--mail/mail-tools.c11
-rw-r--r--mail/mail-tools.h4
-rw-r--r--mail/mail-vfolder.c4
-rw-r--r--mail/message-list.c34
9 files changed, 229 insertions, 85 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 4803929966..2bb572baa0 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,35 @@
+2000-10-12 Not Zed <NotZed@HelixCode.com>
+
+ * message-list.c (message_list_setup_etable): Duh, fix the test
+ for the folder name, strstr != strcmp is it.
+
+2000-10-10 Not Zed <NotZed@HelixCode.com>
+
+ * message-list.c (folder_to_cachename): Removed, changed callers
+ to use mail_config_folder_to_cachename instead.
+
+ * mail-config.c (mail_config_folder_to_cachename): New utility
+ function to get a cache name for a folder.
+
+ * mail-tools.c (mail_tool_do_movemail): Changed to return the path
+ to the mbox, rather than opening a folder of it.
+
+ * mail-ops.c (mail_incorporate_messages): Dont bother making the
+ pseudo messageinfo, filder_driver_filter_message will do it for
+ us.
+ (report_status): Callback to report status of filtering operation.
+ (do_fetch_mail): Changed significantly - for the api changes to
+ the filtering system. Also now incorporates a mailbox file
+ directly, without having to import it into a camel folder first.
+ (mail_incorporate_messages): Removed entirely, no longer needed.
+
+ * mail-vfolder.c (vfolder_refresh): Fix for context api changes.
+ (vfolder_uri_to_folder): Likewise.
+
+ * folder-browser-factory.c (create_ondemand_hooks): Changed for
+ api changes. Also only adds demand filters to the menu (fixed a
+ small logic bug).
+
2000-10-11 Chris Toshok <toshok@helixcode.com>
* subscribe-dialog.c (folder_etree_value_at): special case for
@@ -159,6 +191,7 @@
`mail-search-dialogue.h' and `mail-search-dialogue.c' as NotZed
forgot to put them into CVS.
+>>>>>>> 1.631
2000-10-06 Not Zed <NotZed@HelixCode.com>
* mail-search-dialogue.c: New widget, full search dialogue for
diff --git a/mail/folder-browser-factory.c b/mail/folder-browser-factory.c
index 1bc493b381..31f61cd786 100644
--- a/mail/folder-browser-factory.c
+++ b/mail/folder-browser-factory.c
@@ -71,7 +71,7 @@ create_ondemand_hooks (FolderBrowser *fb, BonoboUIComponent *uic)
system = EVOLUTION_DATADIR "/evolution/filtertypes.xml";
fb->filter_context = filter_context_new();
rule_context_load ((RuleContext *) fb->filter_context, system, user);
- while ( (rule = rule_context_next_rule((RuleContext *)fb->filter_context, rule)) != NULL ) {
+ while ( (rule = rule_context_next_rule((RuleContext *)fb->filter_context, rule, FILTER_SOURCE_DEMAND)) != NULL ) {
register_ondemand((RuleContext *)fb->filter_context, rule, fb, uic);
}
g_free (user);
diff --git a/mail/mail-config.c b/mail/mail-config.c
index fc8fa7203e..b8d3058181 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -550,6 +550,22 @@ mail_config_add_news (MailConfigService *news)
config->news = g_slist_append (config->news, new_news);
}
+char *
+mail_config_folder_to_cachename(CamelFolder *folder, const char *prefix)
+{
+ char *url, *p, *filename;
+
+ url = camel_url_to_string(CAMEL_SERVICE(folder->parent_store)->url, FALSE);
+ for (p = url; *p; p++) {
+ if (!isprint((unsigned char)*p) || strchr(" /'\"`&();|<>${}!", *p))
+ *p = '_';
+ }
+
+ filename = g_strdup_printf("%s/config/%s%s", evolution_dir, prefix, url);
+ g_free(url);
+ return filename;
+}
+
diff --git a/mail/mail-config.h b/mail/mail-config.h
index f716373dce..f6ee59e3b0 100644
--- a/mail/mail-config.h
+++ b/mail/mail-config.h
@@ -83,6 +83,9 @@ MailConfigService *mail_config_get_default_news (void);
GSList *mail_config_get_news (void);
void mail_config_add_news (MailConfigService *source);
+/* static utility functions */
+char *mail_config_folder_to_cachename(CamelFolder *folder, const char *prefix);
+
#endif
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 4a784d3688..d74f343134 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -98,6 +98,8 @@ mail_load_evolution_rule_context ()
return fc;
}
+#if 0
+/* to be removed */
static void
mail_incorporate_messages (CamelFolder *folder,
fetch_mail_input_t *input,
@@ -158,7 +160,7 @@ mail_incorporate_messages (CamelFolder *folder,
/* get/filter the new messages */
for (i = 0; i < uids->len; i++) {
CamelMimeMessage *message;
- CamelMessageInfo *info;
+ const CamelMessageInfo *info;
gboolean free_info;
gboolean last_message = (i+1 == uids->len);
time_t now;
@@ -176,19 +178,13 @@ mail_incorporate_messages (CamelFolder *folder,
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 (camel_folder_has_summary_capability (folder))
+ info = camel_folder_get_message_info (folder, uids->pdata[i]);
+ else
+ info = NULL;
- if (free_info)
- camel_message_info_free (info);
+ filter_driver_filter_message(filter, message, info, input->destination,
+ FILTER_SOURCE_INCOMING, logfile, ex);
/* 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
@@ -228,14 +224,40 @@ mail_incorporate_messages (CamelFolder *folder,
data->empty = FALSE;
}
+#endif
+
+static void
+mail_op_report_status(FilterDriver *driver, enum filter_status_t status, const char *desc, CamelMimeMessage *msg, void *data)
+{
+ printf("reporting status: %s\n", desc);
+
+ /* FIXME: make it work */
+ switch(status) {
+ case FILTER_STATUS_START:
+ mail_op_set_message (_("Retrieving messages : %s"), desc);
+ break;
+ case FILTER_STATUS_END:
+ break;
+ case FILTER_STATUS_ACTION:
+ break;
+ default:
+ break;
+ }
+
+ /* use the 'standard' logging function, data is already the fd */
+ if (data)
+ filter_driver_status_log(driver, status, desc, msg, data);
+}
static void
do_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
{
fetch_mail_input_t *input = (fetch_mail_input_t *) in_data;
fetch_mail_data_t *data = (fetch_mail_data_t *) op_data;
- CamelFolder *folder = NULL;
-
+ FilterContext *fc;
+ FilterDriver *filter;
+ FILE *logfile = NULL;
+
/* If using IMAP, don't do anything... */
if (!strncmp (input->source_url, "imap:", 5)) {
data->empty = FALSE;
@@ -248,31 +270,82 @@ do_fetch_mail (gpointer in_data, gpointer op_data, CamelException *ex)
if (input->destination == NULL)
return;
}
-
- if (!strncmp (input->source_url, "mbox:", 5))
- folder = mail_tool_do_movemail (input->source_url, ex);
- else
- folder = mail_tool_get_inbox (input->source_url, ex);
-
- if (folder == NULL) {
- /* This happens with an IMAP source and on error
- * and on "no new mail"
- */
- camel_object_unref (CAMEL_OBJECT (input->destination));
- input->destination = NULL;
- data->empty = TRUE;
- return;
+
+ /* setup filter driver */
+ fc = mail_load_evolution_rule_context();
+ filter = filter_driver_new(fc, mail_tool_filter_get_folder_func, 0);
+ filter_driver_set_default_folder(filter, input->destination);
+
+ if (TRUE /* perform_logging */) {
+ char *filename = g_strdup_printf ("%s/evolution-filter-log", evolution_dir);
+ logfile = fopen (filename, "a+");
+ g_free (filename);
}
-
+ filter_driver_set_status_func(filter, mail_op_report_status, logfile);
+
+ /* why on earth we 'up' a lock to get it, ... */
mail_tool_camel_lock_up ();
- if (camel_folder_get_message_count (folder) == 0)
- data->empty = TRUE;
- else
- mail_incorporate_messages (folder, input, data, ex);
+
+ camel_folder_freeze(input->destination);
+
+ if (!strncmp (input->source_url, "mbox:", 5)) {
+ char *path = mail_tool_do_movemail (input->source_url, ex);
+
+ if (path && !camel_exception_is_set(ex)) {
+ filter_driver_filter_mbox(filter, path, FILTER_SOURCE_INCOMING, ex);
+
+ /* ok? zap the output file */
+ if (!camel_exception_is_set(ex)) {
+ unlink(path);
+ }
+ }
+ g_free(path);
+ } else {
+ CamelFolder *folder = mail_tool_get_inbox (input->source_url, ex);
+
+ if (folder) {
+ if (camel_folder_get_message_count (folder) > 0) {
+ GPtrArray *uids, *new_uids = NULL;
+ CamelUIDCache *cache = NULL;
+
+ uids = camel_folder_get_uids(folder);
+ if (input->keep_on_server) {
+ char *cachename = mail_config_folder_to_cachename(folder, "cache-");
+
+ cache = camel_uid_cache_new(cachename);
+ if (cache) {
+ new_uids = camel_uid_cache_get_new_uids(cache, uids);
+ camel_folder_free_uids(folder, uids);
+ uids = new_uids;
+ }
+ }
+ filter_driver_filter_folder(filter, folder, FILTER_SOURCE_INCOMING, uids, !input->keep_on_server, ex);
+ if (new_uids) {
+ camel_uid_cache_free_uids(new_uids);
+ if (!camel_exception_is_set(ex))
+ camel_uid_cache_save(cache);
+ camel_uid_cache_destroy(cache);
+ } else {
+ camel_folder_free_uids(folder, uids);
+ }
+ } else {
+ data->empty = TRUE;
+ }
+ camel_object_unref (CAMEL_OBJECT (folder));
+ } else {
+ data->empty = TRUE;
+ }
+ }
+
+ if (logfile)
+ fclose(logfile);
+
+ camel_folder_thaw(input->destination);
mail_tool_camel_lock_down ();
-
- camel_object_unref (CAMEL_OBJECT (folder));
+
+ /*camel_object_unref (CAMEL_OBJECT (input->destination));*/
+ gtk_object_unref((GtkObject *)filter);
}
static void
@@ -328,6 +401,9 @@ mail_do_fetch_mail (const gchar *source_url, gboolean keep_on_server,
/* ** FILTER ON DEMAND ********************************************************** */
+/* why do we have this separate code, it is basically a copy of the code above,
+ should be consolidated */
+
typedef struct filter_ondemand_input_s
{
FilterContext *context;
@@ -360,20 +436,56 @@ static void
do_filter_ondemand (gpointer in_data, gpointer op_data, CamelException *ex)
{
filter_ondemand_input_t *input = (filter_ondemand_input_t *) in_data;
+ FilterDriver *driver;
+ GPtrArray *uids, *new_uids;
+ char *filename;
+ FILE *logfile = NULL;
+ int i;
mail_tool_camel_lock_up ();
- if (camel_folder_get_message_count (input->source) != 0) {
- FilterDriver *driver;
- GPtrArray *uids;
- char *filename;
- FILE *logfile;
- int i;
-
- uids = camel_folder_get_uids (input->source);
-
- camel_folder_freeze (input->source);
+ if (camel_folder_get_message_count (input->source) == 0) {
+ mail_tool_camel_lock_down();
+ return;
+ }
+
+ /* setup filter driver */
+ driver = filter_driver_new (input->context, mail_tool_filter_get_folder_func, NULL);
+ /* -- we want no default destination this time */
+ if (TRUE /* perform_logging */) {
+ filename = g_strdup_printf ("%s/evolution-filter-log", evolution_dir);
+ logfile = fopen (filename, "a+");
+ g_free (filename);
+ }
+ filter_driver_set_status_func(driver, mail_op_report_status, logfile);
+ /* build the uid list - all uid's not deleted already */
+ uids = camel_folder_get_uids (input->source);
+ new_uids = g_ptr_array_new();
+ for (i=0;i<uids->len;i++) {
+ CamelMessageInfo *info = camel_folder_get_message_info(input->source, uids->pdata[i]);
+ if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) {
+ g_ptr_array_add(new_uids, uids->pdata[i]);
+ }
+ }
+
+ /* run the filter */
+ filter_driver_filter_folder(driver, input->source, FILTER_SOURCE_DEMAND, new_uids, TRUE, ex);
+
+ camel_folder_free_uids (input->source, uids);
+ g_ptr_array_free(new_uids, TRUE);
+
+ if (logfile)
+ fclose(logfile);
+
+ gtk_object_unref((GtkObject *)driver);
+ mail_tool_camel_lock_down ();
+}
+
+#if 0
+/* to be removed, old version */
+{
+ {
+
- driver = filter_driver_new (input->context, mail_tool_filter_get_folder_func, NULL);
/* FIXME: find out if we want to log or not - config option */
if (TRUE /* perform_logging */) {
@@ -442,6 +554,7 @@ do_filter_ondemand (gpointer in_data, gpointer op_data, CamelException *ex)
}
mail_tool_camel_lock_down ();
}
+#endif
static void
cleanup_filter_ondemand (gpointer in_data, gpointer op_data, CamelException *ex)
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index 2646a8ad41..ccbcce3d1d 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -178,7 +178,8 @@ mail_tool_get_inbox (const gchar *url, CamelException *ex)
}
-CamelFolder *
+/* why is this function so stupidly complex when allthe work is done elsehwere? */
+char *
mail_tool_do_movemail (const gchar *source_url, CamelException *ex)
{
gchar *dest_url;
@@ -232,18 +233,14 @@ mail_tool_do_movemail (const gchar *source_url, CamelException *ex)
return NULL;
}
- g_free (dest_path);
-
if (camel_exception_is_set (ex)) {
g_free (dest_url);
+ g_free (dest_path);
return NULL;
}
- /* Get the CamelFolder for our dest_path. */
-
- ret = mail_tool_get_folder_from_urlname (dest_url, "movemail", TRUE, ex);
g_free (dest_url);
- return ret;
+ return dest_path;
}
void
diff --git a/mail/mail-tools.h b/mail/mail-tools.h
index ee2af84a5a..1178921bb7 100644
--- a/mail/mail-tools.h
+++ b/mail/mail-tools.h
@@ -54,8 +54,8 @@ CamelFolder *mail_tool_get_local_inbox (CamelException *ex);
CamelFolder *mail_tool_get_inbox (const gchar *url, CamelException *ex);
/* Does a camel_movemail into the local movemail folder
- * and returns the movemail folder that was created. */
-CamelFolder *
+ * and returns the path to the new movemail folder that was created. which shoudl be freed later */
+char *
mail_tool_do_movemail (const gchar *source_url, CamelException *ex);
/* Transfers all the messages from source into dest;
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index a26c2986fc..606a5a0b64 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -74,7 +74,7 @@ vfolder_refresh(void)
char *uri, *path;
rule = NULL;
- while ( (rule = rule_context_next_rule((RuleContext *)context, rule)) ) {
+ while ( (rule = rule_context_next_rule((RuleContext *)context, rule, NULL)) ) {
info = vfolder_find(rule->name);
g_string_truncate(expr, 0);
filter_rule_build_code(rule, expr);
@@ -189,7 +189,7 @@ vfolder_uri_to_folder(const char *uri, CamelException *ex)
d(printf("Opening vfolder: %s\n", uri));
- rule = (VfolderRule *)rule_context_find_rule((RuleContext *)context, info->name);
+ rule = (VfolderRule *)rule_context_find_rule((RuleContext *)context, info->name, NULL);
storeuri = g_strdup_printf("vfolder:%s/vfolder/%s", evolution_dir, info->name);
foldername = g_strdup_printf("mbox?%s", info->query);
diff --git a/mail/message-list.c b/mail/message-list.c
index 2305a8d47a..7cfd7397d7 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -87,7 +87,6 @@ static void select_msg (MessageList *message_list, gint row);
static char *filter_date (const void *data);
static void nuke_uids (GtkObject *o);
-static char *folder_to_cachename(CamelFolder *folder, const char *prefix);
static void save_tree_state(MessageList *ml);
static struct {
@@ -843,7 +842,7 @@ save_header_state(MessageList *ml)
|| ml->etable == NULL)
return;
- filename = folder_to_cachename(ml->folder, "et-header-");
+ filename = mail_config_folder_to_cachename(ml->folder, "et-header-");
e_table_scrolled_save_state(E_TABLE_SCROLLED(ml->etable), filename);
g_free(filename);
}
@@ -883,17 +882,17 @@ message_list_setup_etable(MessageList *message_list)
char *path;
struct stat st;
- path = folder_to_cachename(message_list->folder, "et-header-");
+ path = mail_config_folder_to_cachename(message_list->folder, "et-header-");
if (stat(path, &st) == 0 && st.st_size > 0 && S_ISREG(st.st_mode)) {
e_table_scrolled_load_state(E_TABLE_SCROLLED(message_list->etable), path);
} else {
/* I wonder if there's a better way to do this ...? */
name = camel_service_get_name((CAMEL_SERVICE(message_list->folder->parent_store)), TRUE);
printf("folder name is '%s'\n", name);
- if (strstr(name, "/Drafts")
- || strstr(name, "/Outbox")
- || strstr(name, "/Sent")) {
- e_table_scrolled_set_state(E_TABLE_SCROLLED(message_list->etable), state);
+ if (strstr(name, "/Drafts") != NULL
+ || strstr(name, "/Outbox") != NULL
+ || strstr(name, "/Sent") != NULL) {
+ e_table_scrolled_set_specification(E_TABLE_SCROLLED(message_list->etable), spec);
}
g_free(name);
}
@@ -984,7 +983,6 @@ message_list_destroy (GtkObject *object)
}
gtk_object_unref (GTK_OBJECT (message_list->table_model));
-
gtk_object_unref (GTK_OBJECT (message_list->etable));
if (message_list->uid_rowmap) {
@@ -1126,22 +1124,6 @@ clear_tree (MessageList *ml)
e_tree_model_node_set_expanded (etm, ml->tree_root, TRUE);
}
-static char *
-folder_to_cachename(CamelFolder *folder, const char *prefix)
-{
- char *url, *p, *filename;
-
- url = camel_url_to_string(CAMEL_SERVICE(folder->parent_store)->url, FALSE);
- for (p = url; *p; p++) {
- if (!isprint((unsigned char)*p) || strchr(" /'\"`&();|<>${}!", *p))
- *p = '_';
- }
-
- filename = g_strdup_printf("%s/config/%s%s", evolution_dir, prefix, url);
- g_free(url);
- return filename;
-}
-
/* we save the node id to the file if the node should be closed when
we start up. We only save nodeid's for messages with children */
static void
@@ -1181,7 +1163,7 @@ load_tree_state(MessageList *ml)
int len;
result = g_hash_table_new(g_str_hash, g_str_equal);
- filename = folder_to_cachename(ml->folder, "treestate-");
+ filename = mail_config_folder_to_cachename(ml->folder, "treestate-");
in = fopen(filename, "r");
if (in) {
while (fgets(linebuf, sizeof(linebuf), in) != NULL) {
@@ -1205,7 +1187,7 @@ save_tree_state(MessageList *ml)
ETreePath *node;
FILE *out;
- filename = folder_to_cachename(ml->folder, "treestate-");
+ filename = mail_config_folder_to_cachename(ml->folder, "treestate-");
out = fopen(filename, "w");
if (out) {
node = e_tree_model_get_root((ETreeModel *)ml->table_model);