+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
+ <colin@colino.net>
+
2002-02-19 [paul] 0.7.4claws23
* sync with sylpheed 0.7.4cvs8
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
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;
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);
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);
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,
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;
+ }
+
}
}
Pop3MsgInfo *msg;
GHashTable *uidl_table;
-
+ GSList *uidl_todelete_list;
+
gboolean uidl_is_valid;
gint error_val;
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) {
}
}
}
+
+ 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;
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)
{
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)
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;
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");
static struct Receive {
GtkWidget *pop3_frame;
GtkWidget *rmmail_chkbtn;
+ GtkWidget *leave_time_entry;
GtkWidget *getall_chkbtn;
GtkWidget *size_limit_chkbtn;
GtkWidget *size_limit_entry;
{"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,
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;
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"));
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;
/* Receive */
gboolean rmmail;
+ gchar *leave_time;
gboolean getall;
gboolean recv_at_getall;
gboolean enable_size_limit;