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]
|
2001-05-29 [hoa]
|
||||||
|
|
||||||
* src/compose.c
|
* src/compose.c
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
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)
|
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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue