+2006-03-01 [wwp] 2.0.0cvs91
+
+ * src/messageview.c
+ * src/procmsg.c
+ * src/procmsg.h
+ * src/summaryview.c
+ * src/plugins/spamassassin/spamassassin.c
+ * src/plugins/spamassassin/spamassassin.h
+ make learner callbacks return a status (0 for ok),
+ handle it in main code to avoid setting flags when learning failed,
+ don't learn on TCP if offline in spamassassin,
+ thanks to Colin.
+
+
+
2006-03-01 [wwp] 2.0.0cvs90
* src/compose.c
( cvs diff -u -r 1.18.2.23 -r 1.18.2.24 src/plugins/spamassassin/spamassassin.c; cvs diff -u -r 1.4.2.8 -r 1.4.2.9 src/plugins/spamassassin/spamassassin.h; cvs diff -u -r 1.23.2.21 -r 1.23.2.22 src/plugins/spamassassin/spamassassin_gtk.c; ) > 2.0.0cvs88.patchset
( cvs diff -u -r 1.18.2.24 -r 1.18.2.25 src/plugins/spamassassin/spamassassin.c; ) > 2.0.0cvs89.patchset
( cvs diff -u -r 1.382.2.247 -r 1.382.2.248 src/compose.c; ) > 2.0.0cvs90.patchset
+( cvs diff -u -r 1.94.2.78 -r 1.94.2.79 src/messageview.c; cvs diff -u -r 1.150.2.54 -r 1.150.2.55 src/procmsg.c; cvs diff -u -r 1.60.2.24 -r 1.60.2.25 src/procmsg.h; cvs diff -u -r 1.395.2.176 -r 1.395.2.177 src/summaryview.c; cvs diff -u -r 1.18.2.25 -r 1.18.2.26 src/plugins/spamassassin/spamassassin.c; cvs diff -u -r 1.4.2.9 -r 1.4.2.10 src/plugins/spamassassin/spamassassin.h; ) > 2.0.0cvs91.patchset
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=90
+EXTRA_VERSION=91
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
#include "partial_download.h"
#include "gedit-print.h"
#include "inc.h"
+#include "log.h"
static GList *messageview_list = NULL;
void messageview_learn (MessageView *msgview, gboolean is_spam)
{
if (is_spam) {
- procmsg_msginfo_set_flags(msgview->msginfo, MSG_SPAM, 0);
- procmsg_spam_learner_learn(msgview->msginfo, NULL, TRUE);
+ if (procmsg_spam_learner_learn(msgview->msginfo, NULL, TRUE) == 0)
+ procmsg_msginfo_set_flags(msgview->msginfo, MSG_SPAM, 0);
+ else
+ log_error(_("An error happened while learning.\n"));
+
} else {
- procmsg_msginfo_unset_flags(msgview->msginfo, MSG_SPAM, 0);
- procmsg_spam_learner_learn(msgview->msginfo, NULL, FALSE);
+ if (procmsg_spam_learner_learn(msgview->msginfo, NULL, FALSE) == 0)
+ procmsg_msginfo_unset_flags(msgview->msginfo, MSG_SPAM, 0);
+ else
+ log_error(_("An error happened while learning.\n"));
}
if (msgview->toolbar)
toolbar_set_learn_button
#include "libspamc.h"
#include "spamassassin.h"
+#include "inc.h"
#include "log.h"
#include "prefs_common.h"
return &config;
}
-void spamassassin_learn(MsgInfo *msginfo, GSList *msglist, gboolean spam)
+int spamassassin_learn(MsgInfo *msginfo, GSList *msglist, gboolean spam)
{
gchar *cmd = NULL;
gchar *file = NULL;
gboolean async = FALSE;
if (msginfo == NULL && msglist == NULL)
- return;
+ return -1;
+
+ if (config.transport == SPAMASSASSIN_TRANSPORT_TCP
+ && prefs_common.work_offline
+ && !inc_offline_should_override())
+ return -1;
if (msginfo) {
file = procmsg_get_message_file(msginfo);
if (file == NULL)
- return;
+ return -1;
if (config.transport == SPAMASSASSIN_TRANSPORT_TCP) {
cmd = g_strdup_printf("spamc -d %s -p %u -u %s -t %u -s %u -L %s < %s",
config.hostname, config.port,
g_free(tmpfile);
}
g_free(cmd);
- return;
+ return 0;
} else {
cmd = g_strdup_printf("sa-learn -u %s %s %s",
config.username,
}
}
if (cmd == NULL)
- return;
+ return -1;
debug_print("%s\n", cmd);
/* only run async if we have a list, or we could end up
* forking lots of perl processes and bury the machine */
execute_command_line(cmd, async);
g_free(cmd);
+ return 0;
}
void spamassassin_save_config(void)
void spamassassin_set_message_callback (MessageCallback callback);
gint spamassassin_gtk_init(void);
void spamassassin_gtk_done(void);
-void spamassassin_learn(MsgInfo *msginfo, GSList *msglist, gboolean spam);
+int spamassassin_learn(MsgInfo *msginfo, GSList *msglist, gboolean spam);
void spamassassin_register_hook(void);
void spamassassin_unregister_hook(void);
#endif
static GSList *spam_learners = NULL;
-void procmsg_register_spam_learner (void (*learn_func)(MsgInfo *info, GSList *list, gboolean spam))
+void procmsg_register_spam_learner (int (*learn_func)(MsgInfo *info, GSList *list, gboolean spam))
{
if (!g_slist_find(spam_learners, learn_func))
spam_learners = g_slist_append(spam_learners, learn_func);
}
}
-void procmsg_unregister_spam_learner (void (*learn_func)(MsgInfo *info, GSList *list, gboolean spam))
+void procmsg_unregister_spam_learner (int (*learn_func)(MsgInfo *info, GSList *list, gboolean spam))
{
spam_learners = g_slist_remove(spam_learners, learn_func);
if (mainwindow_get_mainwindow()) {
return g_slist_length(spam_learners) > 0;
}
-void procmsg_spam_learner_learn (MsgInfo *info, GSList *list, gboolean spam)
+int procmsg_spam_learner_learn (MsgInfo *info, GSList *list, gboolean spam)
{
GSList *cur = spam_learners;
+ int ret = 0;
for (; cur; cur = cur->next) {
- void ((*func)(MsgInfo *info, GSList *list, gboolean spam)) = cur->data;
- func(info, list, spam);
+ int ((*func)(MsgInfo *info, GSList *list, gboolean spam)) = cur->data;
+ ret |= func(info, list, spam);
}
+ return ret;
}
static gchar *spam_folder_item = NULL;
(MsgInfo *src_msginfo,
MimeInfo *mimeinfo);
-void procmsg_register_spam_learner (void (*learn_func)(MsgInfo *info, GSList *list, gboolean spam));
-void procmsg_unregister_spam_learner (void (*learn_func)(MsgInfo *info, GSList *list, gboolean spam));
+void procmsg_register_spam_learner (int (*learn_func)(MsgInfo *info, GSList *list, gboolean spam));
+void procmsg_unregister_spam_learner (int (*learn_func)(MsgInfo *info, GSList *list, gboolean spam));
gboolean procmsg_spam_can_learn (void);
void procmsg_spam_set_folder (const char *item_identifier);
FolderItem *procmsg_spam_get_folder (void);
-void procmsg_spam_learner_learn (MsgInfo *msginfo, GSList *msglist, gboolean spam);
+int procmsg_spam_learner_learn (MsgInfo *msginfo, GSList *msglist, gboolean spam);
#endif /* __PROCMSG_H__ */
#include "partial_download.h"
#include "timing.h"
#include "gedit-print.h"
+#include "log.h"
#define SUMMARY_COL_MARK_WIDTH 10
#define SUMMARY_COL_STATUS_WIDTH 13
for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
MsgInfo *msginfo = gtk_ctree_node_get_row_data(ctree, row);
- if (is_spam) {
- summary_msginfo_change_flags(msginfo, MSG_SPAM, 0, MSG_NEW|MSG_UNREAD, 0);
- if (procmsg_spam_get_folder() != summaryview->folder_item) {
- summary_move_row_to(summaryview, row, procmsg_spam_get_folder());
- moved = TRUE;
- }
- } else {
- summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
- }
msgs = g_slist_prepend(msgs, msginfo);
}
- procmsg_spam_learner_learn(NULL, msgs, is_spam);
- g_slist_free(msgs);
+ if (procmsg_spam_learner_learn(NULL, msgs, is_spam) == 0) {
+ for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
+ GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
+ MsgInfo *msginfo = gtk_ctree_node_get_row_data(ctree, row);
+ if (is_spam) {
+ summary_msginfo_change_flags(msginfo, MSG_SPAM, 0, MSG_NEW|MSG_UNREAD, 0);
+ if (procmsg_spam_get_folder() != summaryview->folder_item) {
+ summary_move_row_to(summaryview, row, procmsg_spam_get_folder());
+ moved = TRUE;
+ }
+ } else {
+ summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
+ }
+ }
+ } else {
+ log_error(_("An error happened while learning.\n"));
+ }
+ g_slist_free(msgs);
+
prefs_common.immediate_exec = immediate_exec;
END_LONG_OPERATION(summaryview);
if (MSG_IS_MARKED(msginfo->flags)) {
summary_unmark_row(summaryview, row);
} else if (MSG_IS_SPAM(msginfo->flags)) {
- summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
- procmsg_spam_learner_learn(msginfo, NULL, FALSE);
+ if (procmsg_spam_learner_learn(msginfo, NULL, FALSE) == 0)
+ summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
+ else
+ log_error(_("An error happened while learning.\n"));
} else {
summary_mark_row(summaryview, row);
}