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)
{
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;
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"));
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;
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;
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;
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;
}
}
- 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));
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;
if (change_file_mode_rw(fp, filename) == 0)
fprintf(fp, "%s\n", buf);
+ g_free(buf);
fclose(fp);
}
{
Pop3State *state = (Pop3State *)data;
- inc_progress_update(state, POP3_RETR_SEND);
-
pop3_gen_send(sock, "RETR %d", state->cur_msg);
return POP3_RETR_RECV;
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) {
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;
{
Pop3State *state = (Pop3State *)data;
- /* inc_progress_update(state, POP3_DELETE_SEND); */
-
pop3_gen_send(sock, "DELE %d", state->cur_msg);
return POP3_DELETE_RECV;
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;