2006-03-17 [wwp] 2.0.0cvs146
[claws.git] / src / procmsg.c
index c1c877fcd236d893a3f8b3b56f2d954620e476b3..72ef6c81f4ba75731ca71f6a3a72810bfed91a02 100644 (file)
@@ -340,31 +340,38 @@ gint procmsg_move_messages(GSList *mlist)
        MsgInfo *msginfo;
        FolderItem *dest = NULL;
        gint retval = 0;
-
+       gboolean finished = TRUE;
        if (!mlist) return 0;
 
        folder_item_update_freeze();
 
+next_folder:
        for (cur = mlist; cur != NULL; cur = cur->next) {
                msginfo = (MsgInfo *)cur->data;
+               if (!msginfo->to_folder) {
+                       continue;
+               } else {
+                       finished = FALSE;
+               }
                if (!dest) {
                        dest = msginfo->to_folder;
                        movelist = g_slist_append(movelist, msginfo);
                } else if (dest == msginfo->to_folder) {
                        movelist = g_slist_append(movelist, msginfo);
                } else {
-                       folder_item_move_msgs(dest, movelist);
-                       g_slist_free(movelist);
-                       movelist = NULL;
-                       dest = msginfo->to_folder;
-                       movelist = g_slist_append(movelist, msginfo);
+                       continue;
                }
                procmsg_msginfo_set_to_folder(msginfo, NULL);
        }
-
        if (movelist) {
-               retval = folder_item_move_msgs(dest, movelist);
+               retval |= folder_item_move_msgs(dest, movelist);
                g_slist_free(movelist);
+               movelist = NULL;
+       }
+       if (finished == FALSE) {
+               finished = TRUE;
+               dest = NULL;
+               goto next_folder;
        }
 
        folder_item_update_thaw();
@@ -376,31 +383,38 @@ void procmsg_copy_messages(GSList *mlist)
        GSList *cur, *copylist = NULL;
        MsgInfo *msginfo;
        FolderItem *dest = NULL;
-
+       gboolean finished = TRUE;
        if (!mlist) return;
 
        folder_item_update_freeze();
 
+next_folder:
        for (cur = mlist; cur != NULL; cur = cur->next) {
                msginfo = (MsgInfo *)cur->data;
+               if (!msginfo->to_folder) {
+                       continue;
+               } else {
+                       finished = FALSE;
+               }
                if (!dest) {
                        dest = msginfo->to_folder;
                        copylist = g_slist_append(copylist, msginfo);
                } else if (dest == msginfo->to_folder) {
                        copylist = g_slist_append(copylist, msginfo);
                } else {
-                       folder_item_copy_msgs(dest, copylist);
-                       g_slist_free(copylist);
-                       copylist = NULL;
-                       dest = msginfo->to_folder;
-                       copylist = g_slist_append(copylist, msginfo);
+                       continue;
                }
                procmsg_msginfo_set_to_folder(msginfo, NULL);
        }
-
        if (copylist) {
                folder_item_copy_msgs(dest, copylist);
                g_slist_free(copylist);
+               copylist = NULL;
+       }
+       if (finished == FALSE) {
+               finished = TRUE;
+               dest = NULL;
+               goto next_folder;
        }
 
        folder_item_update_thaw();
@@ -983,53 +997,7 @@ gint procmsg_remove_special_headers(const gchar *in, const gchar *out)
        fclose(fp);
        return 0;
 }
-#if 0
-gchar *procmsg_add_special_headers(const gchar *in, FolderItem *item)
-{
-       gchar *out = get_tmp_file();
-       FILE *fp = NULL;
-       PrefsAccount *account = NULL;
-       if (out == NULL)
-               return NULL;
 
-       fp = fopen(out, "wb");
-       if (fp == NULL) {
-               g_free(out);
-               return NULL;
-       }
-
-       if (item && item->prefs && item->prefs->enable_default_account)
-               account = account_find_from_id(item->prefs->default_account);
-
-       if (!account) account = cur_account;
-
-       if (!account) {
-               fclose(fp);
-               g_free(out);
-               return NULL;
-       }
-
-       fprintf(fp, "X-Sylpheed-Account-Id:%d\n", account->account_id);
-       fprintf(fp, "S:%s\n", account->address);
-       if (item && item->prefs && item->prefs->save_copy_to_folder) {
-               gchar *folderidentifier;
-
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
-               folderidentifier = folder_item_get_identifier(item);
-               fprintf(fp, "SCF:%s\n", folderidentifier);
-               g_free(folderidentifier);
-       } else if (account_get_special_folder(account, F_OUTBOX)) {
-               gchar *folderidentifier = folder_item_get_identifier(account_get_special_folder
-                                 (compose->account, F_OUTBOX));
-               fprintf(fp, "SCF:%s\n", folderidentifier);
-               g_free(folderidentifier);
-       }
-
-       fprintf(fp, "\n");
-       fclose(fp);
-       return out;
-}
-#endif
 gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
                            gboolean is_queued)
 {
@@ -1621,9 +1589,9 @@ static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_ses
                FolderItem *item;
                
                if (replymessageid != NULL)
-                       tokens = g_strsplit(replymessageid, "\x7f", 0);
+                       tokens = g_strsplit(replymessageid, "\t", 0);
                else
-                       tokens = g_strsplit(fwdmessageid, "\x7f", 0);
+                       tokens = g_strsplit(fwdmessageid, "\t", 0);
                item = folder_find_item_from_identifier(tokens[0]);
 
                /* check if queued message has valid folder and message id */
@@ -2015,18 +1983,15 @@ gboolean procmsg_msginfo_filter(MsgInfo *msginfo)
                        
        mail_filtering_data.msginfo = msginfo;                  
        if (hooks_invoke(MAIL_FILTERING_HOOKLIST, &mail_filtering_data)) {
-               hooks_invoke(MAIL_POSTFILTERING_HOOKLIST, msginfo);
                return TRUE;
        }
 
        /* filter if enabled in prefs or move to inbox if not */
        if((filtering_rules != NULL) &&
           filter_message_by_msginfo(filtering_rules, msginfo)) {
-               hooks_invoke(MAIL_POSTFILTERING_HOOKLIST, msginfo);
                return TRUE;
        }
                
-       hooks_invoke(MAIL_POSTFILTERING_HOOKLIST, msginfo);
        return FALSE;
 }
 
@@ -2071,7 +2036,7 @@ MsgInfo *procmsg_msginfo_new_from_mimeinfo(MsgInfo *src_msginfo, MimeInfo *mimei
 
 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);
@@ -2079,16 +2044,18 @@ void procmsg_register_spam_learner (void (*learn_func)(MsgInfo *info, GSList *li
                main_window_set_menu_sensitive(mainwindow_get_mainwindow());
                summary_set_menu_sensitive(
                        mainwindow_get_mainwindow()->summaryview);
+               toolbar_main_set_sensitive(mainwindow_get_mainwindow());
        }
 }
 
-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()) {
                main_window_set_menu_sensitive(mainwindow_get_mainwindow());
                summary_set_menu_sensitive(
                        mainwindow_get_mainwindow()->summaryview);
+               toolbar_main_set_sensitive(mainwindow_get_mainwindow());
        }
 }
 
@@ -2097,13 +2064,15 @@ gboolean procmsg_spam_can_learn(void)
        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;