handle menu option 'filter messages' / bugfix in mbox folders

This commit is contained in:
Hoà Viêt Dinh 2001-05-30 03:05:08 +00:00
parent 1d1c316bd9
commit 33299f71f8
8 changed files with 135 additions and 38 deletions

View file

@ -1,3 +1,18 @@
2001-05-30 [hoa]
* src/filtering.[ch]
* src/summaryview.c
handling summary menu / filter messages
* src/folder.[ch]
add some stuff
* src/foldersel.c
imap folders now appears in list
* src/mbox_folder.c
doesn't crash if destination mail is not writeable
2001-05-29 [hoa] 2001-05-29 [hoa]
* src/compose.c * src/compose.c

View file

@ -233,19 +233,21 @@ static gboolean filteringaction_apply(FilteringAction * action, MsgInfo * info,
info->flags = 0; info->flags = 0;
filteringaction_update_mark(info); filteringaction_update_mark(info);
val = GPOINTER_TO_INT(g_hash_table_lookup if (folder_table) {
(folder_table, dest_folder)); val = GPOINTER_TO_INT(g_hash_table_lookup
if (val == 0) { (folder_table, dest_folder));
folder_item_scan(dest_folder); if (val == 0) {
g_hash_table_insert(folder_table, dest_folder, folder_item_scan(dest_folder);
GINT_TO_POINTER(1)); g_hash_table_insert(folder_table, dest_folder,
} GINT_TO_POINTER(1));
val = GPOINTER_TO_INT(g_hash_table_lookup }
(folder_table, info->folder)); val = GPOINTER_TO_INT(g_hash_table_lookup
if (val == 0) { (folder_table, info->folder));
folder_item_scan(info->folder); if (val == 0) {
g_hash_table_insert(folder_table, info->folder, folder_item_scan(info->folder);
GINT_TO_POINTER(1)); g_hash_table_insert(folder_table, info->folder,
GINT_TO_POINTER(1));
}
} }
return TRUE; return TRUE;
@ -259,14 +261,16 @@ static gboolean filteringaction_apply(FilteringAction * action, MsgInfo * info,
if (folder_item_copy_msg(dest_folder, info) == -1) if (folder_item_copy_msg(dest_folder, info) == -1)
return FALSE; return FALSE;
val = GPOINTER_TO_INT(g_hash_table_lookup if (folder_table) {
(folder_table, dest_folder)); val = GPOINTER_TO_INT(g_hash_table_lookup
if (val == 0) { (folder_table, dest_folder));
folder_item_scan(dest_folder); if (val == 0) {
g_hash_table_insert(folder_table, dest_folder, folder_item_scan(dest_folder);
GINT_TO_POINTER(1)); g_hash_table_insert(folder_table, dest_folder,
GINT_TO_POINTER(1));
}
} }
return TRUE; return TRUE;
case MATCHING_ACTION_DELETE: case MATCHING_ACTION_DELETE:
@ -423,6 +427,28 @@ void filter_msginfo(GSList * filtering_list, MsgInfo * info,
} }
} }
void filter_msginfo_move_or_delete(GSList * filtering_list, MsgInfo * info,
GHashTable *folder_table)
{
GSList * l;
if (info == NULL) {
g_warning(_("msginfo is not set"));
return;
}
for(l = filtering_list ; l != NULL ; l = g_slist_next(l)) {
FilteringProp * filtering = (FilteringProp *) l->data;
switch (filtering->action->type) {
case MATCHING_ACTION_MOVE:
case MATCHING_ACTION_DELETE:
if (filteringprop_apply(filtering, info, folder_table))
return;
}
}
}
void filter_message(GSList * filtering_list, FolderItem * item, void filter_message(GSList * filtering_list, FolderItem * item,
gint msgnum, GHashTable *folder_table) gint msgnum, GHashTable *folder_table)
{ {

View file

@ -38,6 +38,8 @@ FilteringProp * filteringprop_parse(gchar ** str);
void filter_msginfo(GSList * filtering_list, MsgInfo * info, void filter_msginfo(GSList * filtering_list, MsgInfo * info,
GHashTable *folder_table); GHashTable *folder_table);
void filter_msginfo_move_or_delete(GSList * filtering_list, MsgInfo * info,
GHashTable *folder_table);
void filter_message(GSList * filtering_list, FolderItem * item, void filter_message(GSList * filtering_list, FolderItem * item,
gint msgnum, GHashTable *folder_table); gint msgnum, GHashTable *folder_table);

View file

@ -780,6 +780,7 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
gint folder_item_remove_msg(FolderItem *item, gint num) gint folder_item_remove_msg(FolderItem *item, gint num)
{ {
Folder *folder; Folder *folder;
gint result;
g_return_val_if_fail(item != NULL, -1); g_return_val_if_fail(item != NULL, -1);
@ -788,14 +789,25 @@ gint folder_item_remove_msg(FolderItem *item, gint num)
g_return_val_if_fail(folder->scan != NULL, -1); g_return_val_if_fail(folder->scan != NULL, -1);
g_return_val_if_fail(folder->remove_msg != NULL, -1); g_return_val_if_fail(folder->remove_msg != NULL, -1);
if (folder->finished_remove)
folder->finished_remove(folder, item);
result = folder->remove_msg(folder, item, num);
if (item->last_num < 0) folder->scan(folder, item); if (item->last_num < 0) folder->scan(folder, item);
return folder->remove_msg(folder, item, num); if (result == 0){
if (folder->finished_remove)
folder->finished_remove(folder, item);
}
return result;
} }
gint folder_item_remove_all_msg(FolderItem *item) gint folder_item_remove_all_msg(FolderItem *item)
{ {
Folder *folder; Folder *folder;
gint result;
g_return_val_if_fail(item != NULL, -1); g_return_val_if_fail(item != NULL, -1);
@ -806,7 +818,14 @@ gint folder_item_remove_all_msg(FolderItem *item)
if (item->last_num < 0) folder->scan(folder, item); if (item->last_num < 0) folder->scan(folder, item);
return folder->remove_all_msg(folder, item); result = folder->remove_all_msg(folder, item);
if (result == 0){
if (folder->finished_remove)
folder->finished_remove(folder, item);
}
return result;
} }
gboolean folder_item_is_msg_changed(FolderItem *item, MsgInfo *msginfo) gboolean folder_item_is_msg_changed(FolderItem *item, MsgInfo *msginfo)
@ -913,7 +932,11 @@ static void folder_init(Folder *folder, FolderType type, const gchar *name)
folder->remove_all_msg = imap_remove_all_msg; folder->remove_all_msg = imap_remove_all_msg;
folder->scan = imap_scan_folder; folder->scan = imap_scan_folder;
folder->create_folder = imap_create_folder; folder->create_folder = imap_create_folder;
folder->remove_folder = imap_remove_folder; folder->remove_folder = imap_remove_folder;
/*
folder->copy_msg = imap_copy_msg;
folder->finished_remove = imap_finished_remove;
*/
break; break;
case F_NEWS: case F_NEWS:
folder->get_msg_list = news_get_article_list; folder->get_msg_list = news_get_article_list;

View file

@ -149,6 +149,7 @@ struct _Folder
FolderItem *item, FolderItem *item,
MsgInfo *info); MsgInfo *info);
void (*finished_copy) (Folder * folder, FolderItem * item); void (*finished_copy) (Folder * folder, FolderItem * item);
void (*finished_remove) (Folder * folder, FolderItem * item);
}; };
struct _LocalFolder struct _LocalFolder

View file

@ -232,7 +232,8 @@ static void foldersel_set_tree(void)
folder = FOLDER(list->data); folder = FOLDER(list->data);
g_return_if_fail(folder != NULL); g_return_if_fail(folder != NULL);
if ((folder->type != F_MH) && (folder->type != F_MBOX)) if ((folder->type != F_MH) && (folder->type != F_MBOX) &&
(folder->type != F_IMAP))
continue; continue;
node = gtk_ctree_insert_gnode(GTK_CTREE(ctree), NULL, NULL, node = gtk_ctree_insert_gnode(GTK_CTREE(ctree), NULL, NULL,

View file

@ -1608,6 +1608,9 @@ gint mbox_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
g_free(mbox_path); g_free(mbox_path);
*/ */
if (num == -1)
return -1;
flags_info = g_new0(CopyFlagsInfo, 1); flags_info = g_new0(CopyFlagsInfo, 1);
flags_info->num = num; flags_info->num = num;
flags_info->flags = msginfo->flags; flags_info->flags = msginfo->flags;

View file

@ -74,6 +74,7 @@
#include "addr_compl.h" #include "addr_compl.h"
#include "scoring.h" #include "scoring.h"
#include "prefs_folder_item.h" #include "prefs_folder_item.h"
#include "filtering.h"
#include "pixmaps/dir-open.xpm" #include "pixmaps/dir-open.xpm"
#include "pixmaps/mark.xpm" #include "pixmaps/mark.xpm"
@ -2686,16 +2687,35 @@ void summary_filter(SummaryView *summaryview)
gtk_clist_freeze(GTK_CLIST(summaryview->ctree)); gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL, if (prefs_filtering == NULL) {
GTK_CTREE_FUNC(summary_filter_func), gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
summaryview); GTK_CTREE_FUNC(summary_filter_func),
summaryview);
gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
gtk_clist_thaw(GTK_CLIST(summaryview->ctree)); if (prefs_common.immediate_exec)
summary_execute(summaryview);
else
summary_status_show(summaryview);
}
else {
summaryview->folder_table = g_hash_table_new(NULL, NULL);
if (prefs_common.immediate_exec) gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
summary_execute(summaryview); GTK_CTREE_FUNC(summary_filter_func),
else summaryview);
summary_status_show(summaryview);
gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
folder_item_scan_foreach(summaryview->folder_table);
folderview_update_item_foreach(summaryview->folder_table);
g_hash_table_destroy(summaryview->folder_table);
summaryview->folder_table = NULL;
summary_show(summaryview, summaryview->folder_item, FALSE);
}
debug_print(_("done.\n")); debug_print(_("done.\n"));
STATUSBAR_POP(summaryview->mainwin); STATUSBAR_POP(summaryview->mainwin);
@ -2710,13 +2730,19 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
gchar *file; gchar *file;
FolderItem *dest; FolderItem *dest;
file = procmsg_get_message_file_path(msginfo); if (prefs_filtering == NULL) {
dest = filter_get_dest_folder(prefs_common.fltlist, file); /* old filtering */
g_free(file); file = procmsg_get_message_file_path(msginfo);
dest = filter_get_dest_folder(prefs_common.fltlist, file);
g_free(file);
if (dest && strcmp2(dest->path, FILTER_NOT_RECEIVE) != 0 && if (dest && strcmp2(dest->path, FILTER_NOT_RECEIVE) != 0 &&
summaryview->folder_item != dest) summaryview->folder_item != dest)
summary_move_row_to(summaryview, node, dest); summary_move_row_to(summaryview, node, dest);
}
else
filter_msginfo_move_or_delete(prefs_filtering, msginfo,
summaryview->folder_table);
} }
/* callback functions */ /* callback functions */