sync with 0.7.5cvs19
[claws.git] / src / pop.c
index c74573f1376ea9d13fcd476db04ee1e05e21b80e..f04046ed50eda7166adf7914019deb6f1af3ea8d 100644 (file)
--- a/src/pop.c
+++ b/src/pop.c
@@ -66,6 +66,7 @@ static gint pop3_ok(SockInfo *sock, gchar *argbuf);
 static void pop3_gen_send(SockInfo *sock, const gchar *format, ...);
 static gint pop3_gen_recv(SockInfo *sock, gchar *buf, gint size);
 static gboolean pop3_delete_header (Pop3State *state);
+static gboolean should_delete (const char *uidl, gpointer data); 
 
 gint pop3_greeting_recv(SockInfo *sock, gpointer data)
 {
@@ -88,8 +89,6 @@ gint pop3_getauth_user_send(SockInfo *sock, gpointer data)
 
        g_return_val_if_fail(state->user != NULL, -1);
 
-       inc_progress_update(state, POP3_GETAUTH_USER_SEND);
-
        pop3_gen_send(sock, "USER %s", state->user);
 
        return POP3_GETAUTH_USER_RECV;
@@ -149,8 +148,6 @@ gint pop3_getauth_apop_send(SockInfo *sock, gpointer data)
        g_return_val_if_fail(state->user != NULL, -1);
        g_return_val_if_fail(state->pass != NULL, -1);
 
-       inc_progress_update(state, POP3_GETAUTH_APOP_SEND);
-
        if ((start = strchr(state->greeting, '<')) == NULL) {
                log_warning(_("Required APOP timestamp not found "
                              "in greeting\n"));
@@ -195,10 +192,6 @@ gint pop3_getauth_apop_recv(SockInfo *sock, gpointer data)
 
 gint pop3_getrange_stat_send(SockInfo *sock, gpointer data)
 {
-       Pop3State *state = (Pop3State *)data;
-
-       inc_progress_update(state, POP3_GETRANGE_STAT_SEND);
-
        pop3_gen_send(sock, "STAT");
 
        return POP3_GETRANGE_STAT_RECV;
@@ -234,10 +227,6 @@ gint pop3_getrange_stat_recv(SockInfo *sock, gpointer data)
 
 gint pop3_getrange_last_send(SockInfo *sock, gpointer data)
 {
-       Pop3State *state = (Pop3State *)data;
-
-       inc_progress_update(state, POP3_GETRANGE_LAST_SEND);
-
        pop3_gen_send(sock, "LAST");
 
        return POP3_GETRANGE_LAST_RECV;
@@ -268,10 +257,6 @@ gint pop3_getrange_last_recv(SockInfo *sock, gpointer data)
 
 gint pop3_getrange_uidl_send(SockInfo *sock, gpointer data)
 {
-       Pop3State *state = (Pop3State *)data;
-
-       inc_progress_update(state, POP3_GETRANGE_UIDL_SEND);
-
        pop3_gen_send(sock, "UIDL");
 
        return POP3_GETRANGE_UIDL_RECV;
@@ -285,12 +270,18 @@ gint pop3_getrange_uidl_recv(SockInfo *sock, gpointer data)
        gchar buf[POPBUFSIZE];
        gchar id[IDLEN + 1];
 
-       if (pop3_ok(sock, NULL) != PS_SUCCESS) return POP3_GETRANGE_LAST_SEND;
-
        if (!state->uidl_table) new = TRUE;
        if (state->ac_prefs->getall)
                get_all = TRUE;
 
+       if (pop3_ok(sock, NULL) != PS_SUCCESS) {
+               /* UIDL is not supported */
+               if (!get_all)
+                       return POP3_GETRANGE_LAST_SEND;
+               else
+                       return POP3_GETSIZE_LIST_SEND;
+       }
+
        while (sock_gets(sock, buf, sizeof(buf)) >= 0) {
                gint num;
 
@@ -313,7 +304,7 @@ gint pop3_getrange_uidl_recv(SockInfo *sock, gpointer data)
                        }
                }
 
-               if(should_delete(buf, (Pop3State *)state))
+               if (should_delete(buf, (Pop3State *) state))
                        state->uidl_todelete_list = g_slist_append
                                        (state->uidl_todelete_list, g_strdup(buf));             
                
@@ -326,39 +317,49 @@ gint pop3_getrange_uidl_recv(SockInfo *sock, gpointer data)
        else
                return POP3_LOGOUT_SEND;
 }
-gboolean should_delete(char * uidl, gpointer data) {
-       Pop3State *state = (Pop3State *)data;
+
+static gboolean should_delete(const char *uidl, gpointer data) 
+{
        /* answer[0] will contain id
-          answer[0] will contain uidl */
+        * answer[0] will contain uidl */
+       Pop3State *state = (Pop3State *) data;
        gchar **answer;
-       GDate *curdate = g_date_new();
-       int id = 0;
-       g_date_set_time(curdate, time(NULL));
-       if( state->ac_prefs->rmmail && strchr(uidl,' ') ) {
-               /* remove \r\n */
-               uidl = g_strndup(uidl, strlen(uidl)-2);
-               answer = g_strsplit(uidl, " ", 2);
-               id = atoi(answer[0]);
-               if( g_hash_table_lookup(state->uidl_table, answer[1]) != NULL ) {
-                       gchar *sdate = g_hash_table_lookup(state->uidl_table, answer[1]);
-                       int tdate = atoi(sdate);
-                       int keep_for = atoi(state->ac_prefs->leave_time);
-                       int today = g_date_day_of_year(curdate);
-                       int nb_days = 365;
-                       if ( g_date_is_leap_year (g_date_year(curdate)) ) 
-                               nb_days = 366;
-                       return ( (tdate + keep_for)%nb_days <= today );
-               }
-       }
-       return FALSE;
+       int  id;
+       gboolean result;
+       int tdate, keep_for, today, nb_days;
+       const gchar *sdate;
+       GDate curdate;
+       gchar *tuidl;
+
+       if (!state->ac_prefs->rmmail || !strchr(uidl, ' '))
+               return FALSE;
+
+       /* remove \r\n */
+       tuidl  = g_strndup(uidl, strlen(uidl) - 2);
+       answer = g_strsplit(tuidl, " ", 2);
+       id     = atoi(answer[0]);
+
+       if (NULL != (sdate = g_hash_table_lookup(state->uidl_table, answer[1]))) {
+               tdate    = atoi(sdate);
+               keep_for = atoi(state->ac_prefs->leave_time); /* FIXME: leave time should be an int */
+
+               g_date_clear(&curdate, 1);
+               g_date_set_time(&curdate, time(NULL));
+               today = g_date_day_of_year(&curdate);
+               
+               nb_days = g_date_is_leap_year(g_date_year(&curdate)) ? 366 : 365;
+               result  = ((tdate + keep_for) % nb_days <= today);
+       } else
+               result = FALSE;
+
+       g_free(tuidl);
+       g_strfreev(answer);
+       
+       return result;
 }
 
 gint pop3_getsize_list_send(SockInfo *sock, gpointer data)
 {
-       Pop3State *state = (Pop3State *)data;
-
-       inc_progress_update(state, POP3_GETSIZE_LIST_SEND);
-
        pop3_gen_send(sock, "LIST");
 
        return POP3_GETSIZE_LIST_RECV;
@@ -436,6 +437,7 @@ gint pop3_top_recv(SockInfo *sock, gpointer data)
        
                if (change_file_mode_rw(fp, filename) == 0) 
                        fprintf(fp, "%s\n", buf);
+               g_free(buf);    
                fclose(fp);
        }
        
@@ -453,8 +455,6 @@ gint pop3_retr_send(SockInfo *sock, gpointer data)
 {
        Pop3State *state = (Pop3State *)data;
 
-       inc_progress_update(state, POP3_RETR_SEND);
-
        pop3_gen_send(sock, "RETR %d", state->cur_msg);
 
        return POP3_RETR_RECV;
@@ -465,7 +465,7 @@ gint pop3_retr_recv(SockInfo *sock, gpointer data)
        Pop3State *state = (Pop3State *)data;
        const gchar *file;
        gint ok, drop_ok;
-       int keep_for=atoi(g_strdup(state->ac_prefs->leave_time));
+       int keep_for;
        
        if ((ok = pop3_ok(sock, NULL)) == PS_SUCCESS) {
                if (recv_write_to_file(sock, (file = get_tmp_file())) < 0) {
@@ -482,9 +482,11 @@ gint pop3_retr_recv(SockInfo *sock, gpointer data)
                state->cur_total_bytes += state->msg[state->cur_msg].size;
                state->cur_total_num++;
 
-               if (drop_ok == 0 && state->ac_prefs->rmmail && keep_for == 0) {
+               keep_for = (state->ac_prefs && state->ac_prefs->leave_time) ? 
+                          atoi(state->ac_prefs->leave_time) : 0;
+
+               if (drop_ok == 0 && state->ac_prefs->rmmail && keep_for == 0)
                        return POP3_DELETE_SEND;
-               }
 
                state->msg[state->cur_msg].received = TRUE;
 
@@ -504,8 +506,6 @@ gint pop3_delete_send(SockInfo *sock, gpointer data)
 {
        Pop3State *state = (Pop3State *)data;
 
-       /* inc_progress_update(state, POP3_DELETE_SEND); */
-
        pop3_gen_send(sock, "DELE %d", state->cur_msg);
 
        return POP3_DELETE_RECV;
@@ -538,19 +538,21 @@ gint pop3_delete_recv(SockInfo *sock, gpointer data)
 gint pop3_logout_send(SockInfo *sock, gpointer data)
 {
        Pop3State *state = (Pop3State *)data;
+       gchar **parts;
+       
        while (state->uidl_todelete_list != NULL) {
-               gchar **parts;
-               gint ok;
-               parts=g_strsplit((gchar *)state->uidl_todelete_list->data," ",2);
-               state->uidl_todelete_list = g_slist_remove(
-                                       state->uidl_todelete_list, state->uidl_todelete_list->data);
-               pop3_gen_send(sock, "DELE %s",parts[0]);
-               if ((ok = pop3_ok(sock, NULL)) != PS_SUCCESS)
+               /*
+                * FIXME: doesn't feel right - no checks for parts
+                */
+               parts = g_strsplit((gchar *) state->uidl_todelete_list->data, " ", 2);
+               state->uidl_todelete_list = g_slist_remove
+                       (state->uidl_todelete_list, state->uidl_todelete_list->data);
+               pop3_gen_send(sock, "DELE %s", parts[0]);
+               if (pop3_ok(sock, NULL) != PS_SUCCESS)
                        log_warning(_("error occurred on DELE\n"));
+               g_strfreev(parts);      
        }
        
-       inc_progress_update(state, POP3_LOGOUT_SEND);
-
        pop3_gen_send(sock, "QUIT");
 
        return POP3_LOGOUT_RECV;