fixed local account
[claws.git] / src / inc.c
index 91903b8f35335de6d370710c7eaec58aa3779299..11e9e49685e8e3c1a976b150d4f66da123f55417 100644 (file)
--- a/src/inc.c
+++ b/src/inc.c
@@ -66,6 +66,8 @@
 #include "filtering.h"
 #include "selective_download.h"
 
+static GList *inc_dialog_list = NULL;
+
 static guint inc_lock_count = 0;
 
 static GdkPixmap *currentxpm;
@@ -104,17 +106,21 @@ static gboolean inc_pop3_recv_func        (SockInfo       *sock,
 
 static void inc_put_error              (IncState        istate);
 
-static void inc_cancel                 (GtkWidget      *widget,
+static void inc_cancel_cb              (GtkWidget      *widget,
                                         gpointer        data);
 
 static gint inc_spool                  (void);
 static gint get_spool                  (FolderItem     *dest,
                                         const gchar    *mbox);
 
+static void inc_spool_account(PrefsAccount *account);
 static void inc_all_spool(void);
 static void inc_autocheck_timer_set_interval   (guint           interval);
 static gint inc_autocheck_func                 (gpointer        data);
 
+static void inc_notify_cmd             (gint new_msgs, 
+                                        gboolean notify);
+
 #define FOLDER_SUMMARY_MISMATCH(f, s) \
        (f) && (s) ? ((s)->newmsgs != (f)->new) || ((f)->unread != (s)->unread) || ((f)->total != (s)->messages) \
        : FALSE
@@ -154,7 +160,7 @@ static void inc_finished(MainWindow *mainwin, gboolean new_messages)
        }
 }
 
-void inc_mail(MainWindow *mainwin)
+void inc_mail(MainWindow *mainwin, gboolean notify)
 {
        gint new_msgs = 0;
 
@@ -183,6 +189,7 @@ void inc_mail(MainWindow *mainwin)
 
        inc_finished(mainwin, new_msgs > 0);
        main_window_unlock(mainwin);
+       inc_notify_cmd(new_msgs, notify);
        inc_autocheck_timer_set();
 }
 
@@ -204,28 +211,40 @@ static gint inc_account_mail(PrefsAccount *account, MainWindow *mainwin)
        IncSession *session;
        gchar *text[3];
 
-       if (account->protocol == A_IMAP4 || account->protocol == A_NNTP) {
+       switch (account->protocol) {
+       case A_IMAP4:
+       case A_NNTP:
                folderview_check_new(FOLDER(account->folder));
                return 1;
-       }
 
-       session = inc_session_new(account);
-       if (!session) return 0;
-
-       inc_dialog = inc_progress_dialog_create();
-       inc_dialog->queue_list = g_list_append(inc_dialog->queue_list, session);
-       inc_dialog->mainwin = mainwin;
-       session->data = inc_dialog;
-
-       text[0] = NULL;
-       text[1] = account->account_name;
-       text[2] = _("Standby");
-       gtk_clist_append(GTK_CLIST(inc_dialog->dialog->clist), text);
-
-       return inc_start(inc_dialog);
+       case A_POP3:
+       case A_APOP:
+               session = inc_session_new(account);
+               if (!session) return 0;
+               
+               inc_dialog = inc_progress_dialog_create();
+               inc_dialog->queue_list = g_list_append(inc_dialog->queue_list,
+                                                      session);
+               inc_dialog->mainwin = mainwin;
+               session->data = inc_dialog;
+       
+               text[0] = NULL;
+               text[1] = account->account_name;
+               text[2] = _("Standby");
+               gtk_clist_append(GTK_CLIST(inc_dialog->dialog->clist), text);
+               
+               main_window_set_toolbar_sensitive(mainwin);
+               main_window_set_menu_sensitive(mainwin);
+               
+               return inc_start(inc_dialog);
+
+       case A_LOCAL:
+               inc_spool_account(account);
+               return 1;
+       }
 }
 
-void inc_all_account_mail(MainWindow *mainwin)
+void inc_all_account_mail(MainWindow *mainwin, gboolean notify)
 {
        GList *list, *queue_list = NULL;
        IncProgressDialog *inc_dialog;
@@ -244,10 +263,14 @@ void inc_all_account_mail(MainWindow *mainwin)
        if (!list) {
                inc_finished(mainwin, new_msgs > 0);
                main_window_unlock(mainwin);
+               inc_notify_cmd(new_msgs, notify);
                inc_autocheck_timer_set();
                return;
        }
 
+       /* check local folders */
+       inc_all_spool();
+
        /* check IMAP4 folders */
        for (; list != NULL; list = list->next) {
                PrefsAccount *account = list->data;
@@ -271,6 +294,7 @@ void inc_all_account_mail(MainWindow *mainwin)
        if (!queue_list) {
                inc_finished(mainwin, new_msgs > 0);
                main_window_unlock(mainwin);
+               inc_notify_cmd(new_msgs, notify);
                inc_autocheck_timer_set();
                return;
        }
@@ -290,10 +314,14 @@ void inc_all_account_mail(MainWindow *mainwin)
                gtk_clist_append(GTK_CLIST(inc_dialog->dialog->clist), text);
        }
 
+       main_window_set_toolbar_sensitive(mainwin);
+       main_window_set_menu_sensitive(mainwin);
+
        new_msgs += inc_start(inc_dialog);
 
        inc_finished(mainwin, new_msgs > 0);
        main_window_unlock(mainwin);
+       inc_notify_cmd(new_msgs, notify);
        inc_autocheck_timer_set();
 }
 
@@ -308,7 +336,7 @@ static IncProgressDialog *inc_progress_dialog_create(void)
        gtk_window_set_title(GTK_WINDOW(progress->window),
                             _("Retrieving new messages"));
        gtk_signal_connect(GTK_OBJECT(progress->cancel_btn), "clicked",
-                          GTK_SIGNAL_FUNC(inc_cancel), dialog);
+                          GTK_SIGNAL_FUNC(inc_cancel_cb), dialog);
        gtk_signal_connect(GTK_OBJECT(progress->window), "delete_event",
                           GTK_SIGNAL_FUNC(gtk_true), NULL);
        /* manage_window_set_transient(GTK_WINDOW(progress->window)); */
@@ -332,6 +360,8 @@ static IncProgressDialog *inc_progress_dialog_create(void)
        dialog->dialog = progress;
        dialog->queue_list = NULL;
 
+       inc_dialog_list = g_list_append(inc_dialog_list, dialog);
+
        return dialog;
 }
 
@@ -347,6 +377,8 @@ static void inc_progress_dialog_destroy(IncProgressDialog *inc_dialog)
 {
        g_return_if_fail(inc_dialog != NULL);
 
+       inc_dialog_list = g_list_remove(inc_dialog_list, inc_dialog);
+
        gtk_progress_bar_update
                (GTK_PROGRESS_BAR(inc_dialog->mainwin->progressbar), 0.0);
        progress_dialog_destroy(inc_dialog->dialog);
@@ -388,7 +420,7 @@ static Pop3State *inc_pop3_state_new(PrefsAccount *account)
 
        state->ac_prefs = account;
        state->folder_table = g_hash_table_new(NULL, NULL);
-       state->id_table = inc_get_uidl_table(account);
+       state->uidl_table = inc_get_uidl_table(account);
        state->inc_state = INC_SUCCESS;
 
        return state;
@@ -404,9 +436,9 @@ static void inc_pop3_state_destroy(Pop3State *state)
                g_free(state->msg[n].uidl);
        g_free(state->msg);
 
-       if (state->id_table) {
-               hash_free_strings(state->id_table);
-               g_hash_table_destroy(state->id_table);
+       if (state->uidl_table) {
+               hash_free_strings(state->uidl_table);
+               g_hash_table_destroy(state->uidl_table);
        }
 
        g_free(state->greeting);
@@ -767,6 +799,8 @@ static void inc_write_uidl_list(Pop3State *state)
        FILE *fp;
        gint n;
 
+       if (!state->uidl_is_valid) return;
+
        path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                           "uidl-", state->ac_prefs->recv_server,
                           "-", state->user, NULL);
@@ -983,11 +1017,15 @@ static void inc_put_error(IncState istate)
        }
 }
 
-static void inc_cancel(GtkWidget *widget, gpointer data)
+static void inc_cancel(IncProgressDialog *dialog)
 {
-       IncProgressDialog *dialog = data;
-       IncSession *session = dialog->queue_list->data;
-       SockInfo *sockinfo = session->pop3_state->sockinfo;
+       IncSession *session;
+       SockInfo *sockinfo;
+
+       g_return_if_fail(dialog != NULL);
+
+       session = dialog->queue_list->data;
+       sockinfo = session->pop3_state->sockinfo;
 
        if (!sockinfo || session->atm->terminated == TRUE) return;
 
@@ -996,6 +1034,24 @@ static void inc_cancel(GtkWidget *widget, gpointer data)
        session->pop3_state->sockinfo = NULL;
 }
 
+gboolean inc_is_active(void)
+{
+       return (inc_dialog_list != NULL);
+}
+
+void inc_cancel_all(void)
+{
+       GList *cur;
+
+       for (cur = inc_dialog_list; cur != NULL; cur = cur->next)
+               inc_cancel((IncProgressDialog *)cur->data);
+}
+
+static void inc_cancel_cb(GtkWidget *widget, gpointer data)
+{
+       inc_cancel((IncProgressDialog *)data);
+}
+
 static gint inc_spool(void)
 {
        gchar *mbox, *logname;
@@ -1038,7 +1094,8 @@ static void inc_all_spool(void)
                IncSession *session;
                PrefsAccount *account = list->data;
 
-               if (account->protocol == A_LOCAL)
+               if ((account->protocol == A_LOCAL) &&
+                   (account->recv_at_getall))
                        inc_spool_account(account);
        }
 }
@@ -1111,6 +1168,26 @@ void inc_unlock(void)
 static guint autocheck_timer = 0;
 static gpointer autocheck_data = NULL;
 
+static void inc_notify_cmd(gint new_msgs, gboolean notify)
+{
+
+       gchar *buf;
+
+       if (!(new_msgs && notify && prefs_common.newmail_notify_cmd &&
+           *prefs_common.newmail_notify_cmd))
+                    return;
+       if ((buf = strchr(prefs_common.newmail_notify_cmd, '%')) &&
+               buf[1] == 'd' && !strchr(&buf[1], '%'))
+               buf = g_strdup_printf(prefs_common.newmail_notify_cmd, 
+                                     new_msgs);
+       else
+               buf = g_strdup(prefs_common.newmail_notify_cmd);
+
+       system(buf);
+
+       g_free(buf);
+}
 void inc_autocheck_timer_init(MainWindow *mainwin)
 {
        autocheck_data = mainwin;
@@ -1152,7 +1229,7 @@ static gint inc_autocheck_func(gpointer data)
                return FALSE;
        }
 
-       inc_all_account_mail(mainwin);
+       inc_all_account_mail(mainwin, prefs_common.newmail_notify_auto);
 
        return FALSE;
 }