handle menu option 'filter messages' / bugfix in mbox folders
This commit is contained in:
parent
1d1c316bd9
commit
33299f71f8
|
@ -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]
|
||||
|
||||
* src/compose.c
|
||||
|
|
|
@ -233,19 +233,21 @@ static gboolean filteringaction_apply(FilteringAction * action, MsgInfo * info,
|
|||
info->flags = 0;
|
||||
filteringaction_update_mark(info);
|
||||
|
||||
val = GPOINTER_TO_INT(g_hash_table_lookup
|
||||
(folder_table, dest_folder));
|
||||
if (val == 0) {
|
||||
folder_item_scan(dest_folder);
|
||||
g_hash_table_insert(folder_table, dest_folder,
|
||||
GINT_TO_POINTER(1));
|
||||
}
|
||||
val = GPOINTER_TO_INT(g_hash_table_lookup
|
||||
(folder_table, info->folder));
|
||||
if (val == 0) {
|
||||
folder_item_scan(info->folder);
|
||||
g_hash_table_insert(folder_table, info->folder,
|
||||
GINT_TO_POINTER(1));
|
||||
if (folder_table) {
|
||||
val = GPOINTER_TO_INT(g_hash_table_lookup
|
||||
(folder_table, dest_folder));
|
||||
if (val == 0) {
|
||||
folder_item_scan(dest_folder);
|
||||
g_hash_table_insert(folder_table, dest_folder,
|
||||
GINT_TO_POINTER(1));
|
||||
}
|
||||
val = GPOINTER_TO_INT(g_hash_table_lookup
|
||||
(folder_table, info->folder));
|
||||
if (val == 0) {
|
||||
folder_item_scan(info->folder);
|
||||
g_hash_table_insert(folder_table, info->folder,
|
||||
GINT_TO_POINTER(1));
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
@ -259,14 +261,16 @@ static gboolean filteringaction_apply(FilteringAction * action, MsgInfo * info,
|
|||
if (folder_item_copy_msg(dest_folder, info) == -1)
|
||||
return FALSE;
|
||||
|
||||
val = GPOINTER_TO_INT(g_hash_table_lookup
|
||||
(folder_table, dest_folder));
|
||||
if (val == 0) {
|
||||
folder_item_scan(dest_folder);
|
||||
g_hash_table_insert(folder_table, dest_folder,
|
||||
GINT_TO_POINTER(1));
|
||||
if (folder_table) {
|
||||
val = GPOINTER_TO_INT(g_hash_table_lookup
|
||||
(folder_table, dest_folder));
|
||||
if (val == 0) {
|
||||
folder_item_scan(dest_folder);
|
||||
g_hash_table_insert(folder_table, dest_folder,
|
||||
GINT_TO_POINTER(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return TRUE;
|
||||
|
||||
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,
|
||||
gint msgnum, GHashTable *folder_table)
|
||||
{
|
||||
|
|
|
@ -38,6 +38,8 @@ FilteringProp * filteringprop_parse(gchar ** str);
|
|||
|
||||
void filter_msginfo(GSList * filtering_list, MsgInfo * info,
|
||||
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,
|
||||
gint msgnum, GHashTable *folder_table);
|
||||
|
||||
|
|
29
src/folder.c
29
src/folder.c
|
@ -780,6 +780,7 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
|
|||
gint folder_item_remove_msg(FolderItem *item, gint num)
|
||||
{
|
||||
Folder *folder;
|
||||
gint result;
|
||||
|
||||
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->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);
|
||||
|
||||
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)
|
||||
{
|
||||
Folder *folder;
|
||||
gint result;
|
||||
|
||||
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);
|
||||
|
||||
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)
|
||||
|
@ -913,7 +932,11 @@ static void folder_init(Folder *folder, FolderType type, const gchar *name)
|
|||
folder->remove_all_msg = imap_remove_all_msg;
|
||||
folder->scan = imap_scan_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;
|
||||
case F_NEWS:
|
||||
folder->get_msg_list = news_get_article_list;
|
||||
|
|
|
@ -149,6 +149,7 @@ struct _Folder
|
|||
FolderItem *item,
|
||||
MsgInfo *info);
|
||||
void (*finished_copy) (Folder * folder, FolderItem * item);
|
||||
void (*finished_remove) (Folder * folder, FolderItem * item);
|
||||
};
|
||||
|
||||
struct _LocalFolder
|
||||
|
|
|
@ -232,7 +232,8 @@ static void foldersel_set_tree(void)
|
|||
folder = FOLDER(list->data);
|
||||
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;
|
||||
|
||||
node = gtk_ctree_insert_gnode(GTK_CTREE(ctree), NULL, NULL,
|
||||
|
|
|
@ -1608,6 +1608,9 @@ gint mbox_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
|
|||
g_free(mbox_path);
|
||||
*/
|
||||
|
||||
if (num == -1)
|
||||
return -1;
|
||||
|
||||
flags_info = g_new0(CopyFlagsInfo, 1);
|
||||
flags_info->num = num;
|
||||
flags_info->flags = msginfo->flags;
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
#include "addr_compl.h"
|
||||
#include "scoring.h"
|
||||
#include "prefs_folder_item.h"
|
||||
#include "filtering.h"
|
||||
|
||||
#include "pixmaps/dir-open.xpm"
|
||||
#include "pixmaps/mark.xpm"
|
||||
|
@ -2686,16 +2687,35 @@ void summary_filter(SummaryView *summaryview)
|
|||
|
||||
gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
|
||||
|
||||
gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
|
||||
GTK_CTREE_FUNC(summary_filter_func),
|
||||
summaryview);
|
||||
if (prefs_filtering == NULL) {
|
||||
gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
|
||||
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)
|
||||
summary_execute(summaryview);
|
||||
else
|
||||
summary_status_show(summaryview);
|
||||
gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
|
||||
GTK_CTREE_FUNC(summary_filter_func),
|
||||
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"));
|
||||
STATUSBAR_POP(summaryview->mainwin);
|
||||
|
@ -2710,13 +2730,19 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
|
|||
gchar *file;
|
||||
FolderItem *dest;
|
||||
|
||||
file = procmsg_get_message_file_path(msginfo);
|
||||
dest = filter_get_dest_folder(prefs_common.fltlist, file);
|
||||
g_free(file);
|
||||
if (prefs_filtering == NULL) {
|
||||
/* old filtering */
|
||||
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 &&
|
||||
summaryview->folder_item != dest)
|
||||
summary_move_row_to(summaryview, node, dest);
|
||||
if (dest && strcmp2(dest->path, FILTER_NOT_RECEIVE) != 0 &&
|
||||
summaryview->folder_item != dest)
|
||||
summary_move_row_to(summaryview, node, dest);
|
||||
}
|
||||
else
|
||||
filter_msginfo_move_or_delete(prefs_filtering, msginfo,
|
||||
summaryview->folder_table);
|
||||
}
|
||||
|
||||
/* callback functions */
|
||||
|
|
Loading…
Reference in a new issue