From: Paul Mangan Date: Tue, 19 Mar 2002 17:13:22 +0000 (+0000) Subject: add ability to leave downloaded mail on server for n days X-Git-Tag: rel_0_7_5~113 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=6d640dbecc965fefff9b68e215e9fb845b198151;hp=4e6edd2beaf4f411956be92848ca85f15ed60737 add ability to leave downloaded mail on server for n days --- diff --git a/ChangeLog.claws b/ChangeLog.claws index ffc44e910..a058a97eb 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -1,3 +1,12 @@ +2002-03-19 [paul] 0.7.4claws24 + + * src/inc.[ch] + src/pop.c + src/prefs_account.[ch] + allow the user to leave downloaded mail on the + server for n days. Patch submitted by Colin Leroy + + 2002-02-19 [paul] 0.7.4claws23 * sync with sylpheed 0.7.4cvs8 diff --git a/configure.in b/configure.in index 4f716f93a..8b888ae1c 100644 --- a/configure.in +++ b/configure.in @@ -8,7 +8,7 @@ MINOR_VERSION=7 MICRO_VERSION=4 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=claws23 +EXTRA_VERSION=claws24 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION dnl set $target diff --git a/src/inc.c b/src/inc.c index 37b535a35..9ef4d97dd 100644 --- a/src/inc.c +++ b/src/inc.c @@ -420,6 +420,7 @@ static Pop3State *inc_pop3_state_new(PrefsAccount *account) state->ac_prefs = account; state->folder_table = g_hash_table_new(NULL, NULL); + state->uidl_todelete_list = NULL; state->uidl_table = inc_get_uidl_table(account); state->inc_state = INC_SUCCESS; @@ -440,7 +441,7 @@ static void inc_pop3_state_destroy(Pop3State *state) hash_free_strings(state->uidl_table); g_hash_table_destroy(state->uidl_table); } - + g_slist_free(state->uidl_todelete_list); g_free(state->greeting); g_free(state->user); g_free(state->pass); @@ -784,8 +785,23 @@ static GHashTable *inc_get_uidl_table(PrefsAccount *ac_prefs) table = g_hash_table_new(g_str_hash, g_str_equal); while (fgets(buf, sizeof(buf), fp) != NULL) { + gchar **data = NULL; + GDate *curdate = g_date_new(); + + g_date_set_time(curdate, time(NULL)); strretchomp(buf); - g_hash_table_insert(table, g_strdup(buf), GINT_TO_POINTER(1)); + + /* data[0] will contain uidl + data[1] will contain day of retrieval */ + if( strchr(buf, '\t') ) { + data = g_strsplit(buf,"\t",2); + snprintf(data[1], sizeof(data[1]), "%d", g_date_day_of_year(curdate) ); + } + else { + data[0] = g_strdup(buf); + snprintf(data[1], sizeof(data[1]), "%d", g_date_day_of_year(curdate) ); + } + g_hash_table_insert(table, g_strdup(data[0]), g_strdup(data[1])); } fclose(fp); @@ -798,7 +814,8 @@ static void inc_write_uidl_list(Pop3State *state) gchar *path; FILE *fp; gint n; - + GDate *curdate = g_date_new(); + g_date_set_time(curdate, time(NULL)); if (!state->uidl_is_valid) return; path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, @@ -817,10 +834,33 @@ static void inc_write_uidl_list(Pop3State *state) FILE_OP_ERROR(path, "fputs"); break; } - if (fputc('\n', fp) == EOF) { + if (fputc('\t', fp) == EOF) { FILE_OP_ERROR(path, "fputc"); break; } + if(g_hash_table_lookup(state->uidl_table, state->msg[n].uidl ) != NULL) { + const char *sdate = g_hash_table_lookup(state->uidl_table, state->msg[n].uidl); + int tdate = g_date_day_of_year(curdate); + if(sdate != NULL) + tdate = atoi(sdate); + + if(fprintf(fp, "%3d", tdate) == EOF) { + FILE_OP_ERROR(path, "fprintf"); + break; + } + } else { + if(fprintf(fp, "%d", g_date_day_of_year(curdate)) == EOF) { + FILE_OP_ERROR(path, "fputs"); + break; + } + + } + + if (fputc('\n', fp) == EOF) { + FILE_OP_ERROR(path, "fputc"); + break; + } + } } diff --git a/src/inc.h b/src/inc.h index 6da9fc818..76f643c74 100644 --- a/src/inc.h +++ b/src/inc.h @@ -89,7 +89,8 @@ struct _Pop3State Pop3MsgInfo *msg; GHashTable *uidl_table; - + GSList *uidl_todelete_list; + gboolean uidl_is_valid; gint error_val; diff --git a/src/pop.c b/src/pop.c index 052c8a38f..c74573f13 100644 --- a/src/pop.c +++ b/src/pop.c @@ -288,7 +288,7 @@ gint pop3_getrange_uidl_recv(SockInfo *sock, gpointer data) if (pop3_ok(sock, NULL) != PS_SUCCESS) return POP3_GETRANGE_LAST_SEND; if (!state->uidl_table) new = TRUE; - if (state->ac_prefs->rmmail || state->ac_prefs->getall) + if (state->ac_prefs->getall) get_all = TRUE; while (sock_gets(sock, buf, sizeof(buf)) >= 0) { @@ -312,6 +312,11 @@ gint pop3_getrange_uidl_recv(SockInfo *sock, gpointer data) } } } + + if(should_delete(buf, (Pop3State *)state)) + state->uidl_todelete_list = g_slist_append + (state->uidl_todelete_list, g_strdup(buf)); + } state->uidl_is_valid = TRUE; @@ -321,6 +326,32 @@ 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; + /* answer[0] will contain id + answer[0] will contain uidl */ + 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; +} gint pop3_getsize_list_send(SockInfo *sock, gpointer data) { @@ -434,7 +465,8 @@ 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)); + if ((ok = pop3_ok(sock, NULL)) == PS_SUCCESS) { if (recv_write_to_file(sock, (file = get_tmp_file())) < 0) { if (state->inc_state == INC_SUCCESS) @@ -446,12 +478,13 @@ gint pop3_retr_recv(SockInfo *sock, gpointer data) state->inc_state = INC_ERROR; return -1; } - + state->cur_total_bytes += state->msg[state->cur_msg].size; state->cur_total_num++; - if (drop_ok == 0 && state->ac_prefs->rmmail) + if (drop_ok == 0 && state->ac_prefs->rmmail && keep_for == 0) { return POP3_DELETE_SEND; + } state->msg[state->cur_msg].received = TRUE; @@ -505,7 +538,17 @@ gint pop3_delete_recv(SockInfo *sock, gpointer data) gint pop3_logout_send(SockInfo *sock, gpointer data) { Pop3State *state = (Pop3State *)data; - + 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) + log_warning(_("error occurred on DELE\n")); + } + inc_progress_update(state, POP3_LOGOUT_SEND); pop3_gen_send(sock, "QUIT"); diff --git a/src/prefs_account.c b/src/prefs_account.c index 252322c88..25b62ce79 100644 --- a/src/prefs_account.c +++ b/src/prefs_account.c @@ -86,6 +86,7 @@ static struct Basic { static struct Receive { GtkWidget *pop3_frame; GtkWidget *rmmail_chkbtn; + GtkWidget *leave_time_entry; GtkWidget *getall_chkbtn; GtkWidget *size_limit_chkbtn; GtkWidget *size_limit_entry; @@ -248,6 +249,10 @@ static PrefParam param[] = { {"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL, &receive.rmmail_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle}, + + {"leave_mail_time", "0", &tmp_ac_prefs.leave_time, P_STRING, + &receive.leave_time_entry, + prefs_set_data_from_entry, prefs_set_entry}, {"get_all_mail", "FALSE", &tmp_ac_prefs.getall, P_BOOL, &receive.getall_chkbtn, @@ -988,8 +993,12 @@ static void prefs_account_receive_create(void) GtkWidget *label; GtkWidget *filter_on_recv_chkbtn; GtkWidget *vbox3; + GtkWidget *hbox2; GtkWidget *inbox_label; GtkWidget *inbox_entry; + GtkWidget *leave_time_entry; + GtkWidget *leave_time_label; + GtkWidget *leave_time_hint; GtkWidget *inbox_btn; GtkWidget *frame2; GtkWidget *imapdir_label; @@ -1008,8 +1017,26 @@ static void prefs_account_receive_create(void) gtk_container_add (GTK_CONTAINER (frame1), vbox2); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8); - PACK_CHECK_BUTTON (vbox2, rmmail_chkbtn, - _("Remove messages on server when received")); + hbox2 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox2); + gtk_container_add (GTK_CONTAINER (vbox2), hbox2); + gtk_container_set_border_width (GTK_CONTAINER (hbox2), 0); + + PACK_CHECK_BUTTON (hbox2, rmmail_chkbtn, + _("Remove messages on server when received for ")); + leave_time_entry = gtk_entry_new (); + gtk_widget_show (leave_time_entry); + gtk_widget_set_usize (leave_time_entry, DEFAULT_ENTRY_WIDTH, -1); + gtk_box_pack_start (GTK_BOX (hbox2), leave_time_entry, TRUE, TRUE, 0); + + leave_time_label = gtk_label_new (_(" days")); + gtk_widget_show (leave_time_label); + gtk_box_pack_start (GTK_BOX (hbox2), leave_time_label, FALSE, FALSE, 0); + + leave_time_hint=gtk_label_new (_("(Setting to 0 days will delete messages immediately)")); + gtk_widget_show(leave_time_hint); + gtk_box_pack_start (GTK_BOX (vbox2), leave_time_hint, FALSE, FALSE, 0); + PACK_CHECK_BUTTON (vbox2, getall_chkbtn, _("Download all messages on server")); @@ -1092,6 +1119,7 @@ static void prefs_account_receive_create(void) receive.pop3_frame = frame1; receive.rmmail_chkbtn = rmmail_chkbtn; + receive.leave_time_entry = leave_time_entry; receive.getall_chkbtn = getall_chkbtn; receive.size_limit_chkbtn = size_limit_chkbtn; receive.size_limit_entry = size_limit_entry; diff --git a/src/prefs_account.h b/src/prefs_account.h index 139f9bb80..45f1d7f65 100644 --- a/src/prefs_account.h +++ b/src/prefs_account.h @@ -102,6 +102,7 @@ struct _PrefsAccount /* Receive */ gboolean rmmail; + gchar *leave_time; gboolean getall; gboolean recv_at_getall; gboolean enable_size_limit;