more revision of filtering system
[claws.git] / src / inc.c
index 1ef527171ab6f863e233ad508465f9f50dd8cf9f..58de021ea9762b0f439f1e196c90a035b77c3928 100644 (file)
--- a/src/inc.c
+++ b/src/inc.c
@@ -136,22 +136,6 @@ static void inc_finished(MainWindow *mainwin, gboolean new_messages)
 
        if (prefs_common.scan_all_after_inc)
                folderview_update_all_node();
-       /* XXX: major problems right here. if we change marks after
-        * incorporation of mail, folderview_select() rewrites it
-        * right under our nose. folderview_select() eventually
-        * calls summary_show(), which rewrites the cache twice:
-        * one for the previously selected FolderItem*, and one
-        * for the newly selected FolderItem* 
-        *
-        * since filtering also allows changing mark files, 
-        * i've solved this by using a global variable (in 
-        * SummmaryView*). a better solution is to use the folder
-        * hash table, and see whether the newly and currently 
-        * selected FolderItem* where updated by the filtering. */
-
-       mainwin->summaryview->filtering_happened = TRUE;
-
-       /* XXX: filtering_happened is reset by summary_show() */
 
        if (!new_messages && !prefs_common.scan_all_after_inc) return;
 
@@ -414,9 +398,6 @@ static gint inc_start(IncProgressDialog *inc_dialog)
        gint error_num = 0;
        gint new_msgs = 0;
 
-       /* gtk_label_set_text(GTK_LABEL(inc_dialog->mainwin->statuslabel),
-                          _("Receiving"));  */
-
        while (inc_dialog->queue_list != NULL) {
                session = inc_dialog->queue_list->data;
                pop3_state = session->pop3_state;
@@ -529,8 +510,6 @@ static gint inc_start(IncProgressDialog *inc_dialog)
                num++;
        }
 
-       /* gtk_label_set_text(GTK_LABEL(inc_dialog->mainwin->statuslabel), "");  */
-
        if (error_num && !prefs_common.noerrorpanel) {
                if (inc_dialog->show_dialog)
                        manage_window_focus_in(inc_dialog->dialog->window,
@@ -665,13 +644,14 @@ static IncState inc_pop3_session_do(IncSession *session)
                                      automaton_input_cb, atm);
 #endif
 
-       gtk_main();
+       while (!atm->terminated)
+               gtk_main_iteration();
 
        log_verbosity_set(FALSE);
        recv_set_ui_func(NULL, NULL);
 
 #if USE_THREADS
-       //pthread_join(sockinfo->connect_thr, NULL);
+       /* pthread_join(sockinfo->connect_thr, NULL); */
 #endif
        automaton_destroy(atm);
 
@@ -680,6 +660,8 @@ static IncState inc_pop3_session_do(IncSession *session)
 
 static gint pop3_automaton_terminate(SockInfo *source, Automaton *atm)
 {
+       if (atm->terminated) return 0;
+
        if (atm->tag > 0) {
                gdk_input_remove(atm->tag);
                atm->tag = 0;
@@ -688,10 +670,8 @@ static gint pop3_automaton_terminate(SockInfo *source, Automaton *atm)
                gtk_timeout_remove(atm->timeout_tag);
                atm->timeout_tag = 0;
        }
-       if (source) {
+       if (source)
                sock_close(source);
-               gtk_main_quit();
-       }
 
        atm->terminated = TRUE;
 
@@ -783,6 +763,7 @@ static gint connection_check_cb(Automaton *atm)
                        manage_window_focus_out(inc_dialog->dialog->window, NULL, NULL);
                }
                pop3_automaton_terminate(sockinfo, atm);
+               state->sockinfo = NULL;
                return FALSE;
        } else if (sockinfo->state == CONN_ESTABLISHED) {
                atm->timeout_tag = 0;
@@ -901,7 +882,8 @@ gint inc_drop_message(const gchar *file, Pop3State *state)
        FolderItem *dropfolder;
        gint val;
        gint msgnum;
-       
+       FolderItem *filtering_folder = folder_get_default_processing();
+
        if (state->ac_prefs->inbox) {
                inbox = folder_find_item_from_path(state->ac_prefs->inbox);
                if (!inbox)
@@ -913,7 +895,7 @@ gint inc_drop_message(const gchar *file, Pop3State *state)
                return -1;
        }
 
-       if (prefs_filtering == NULL) {
+       if (global_processing == NULL) {
                /* old filtering */
                if (state->ac_prefs->filter_on_recv) {
                        dropfolder =
@@ -927,7 +909,7 @@ gint inc_drop_message(const gchar *file, Pop3State *state)
                        dropfolder = inbox;
        } else {
                /* new filtering */
-               dropfolder = inbox;
+               dropfolder = filtering_folder;
        }
 
        val = GPOINTER_TO_INT(g_hash_table_lookup
@@ -937,16 +919,18 @@ gint inc_drop_message(const gchar *file, Pop3State *state)
                g_hash_table_insert(state->folder_table, dropfolder,
                                    GINT_TO_POINTER(1));
        }
+       
+       if ((msgnum = folder_item_add_msg(dropfolder, file, TRUE)) < 0) {
+               unlink(file);
+               return -1;
+       }
 
-       if (prefs_filtering == NULL || !state->ac_prefs->filter_on_recv) {
-               if ((msgnum = folder_item_add_msg(dropfolder, file, TRUE)) < 0) {
-                       unlink(file);
-                       return -1;
-               }
+       if (global_processing != NULL) { 
+               /* new filtering */
+               if (state->ac_prefs->filter_on_recv)
+                       filter_message(global_processing, dropfolder, msgnum,
+                                      state->folder_table);
        }
-       else {
-               filter_incoming_message(dropfolder, file, state->folder_table);
-        }              
 
        return 0;
 }
@@ -973,6 +957,8 @@ static void inc_cancel(GtkWidget *widget, gpointer data)
        IncSession *session = dialog->queue_list->data;
        SockInfo *sockinfo = session->pop3_state->sockinfo;
 
+       if (!sockinfo || session->atm->terminated == TRUE) return;
+
 #if USE_THREADS
        if (sockinfo->state == CONN_READY ||
            sockinfo->state == CONN_LOOKUPSUCCESS) {
@@ -984,6 +970,7 @@ static void inc_cancel(GtkWidget *widget, gpointer data)
 
        session->pop3_state->inc_state = INC_CANCEL;
        pop3_automaton_terminate(sockinfo, session->atm);
+       session->pop3_state->sockinfo = NULL;
 }
 
 static gint inc_spool(void)