diff options
Diffstat (limited to 'src/rpop3.c')
-rw-r--r-- | src/rpop3.c | 73 |
1 files changed, 54 insertions, 19 deletions
diff --git a/src/rpop3.c b/src/rpop3.c index e14adec7..93e8edf6 100644 --- a/src/rpop3.c +++ b/src/rpop3.c @@ -82,9 +82,11 @@ static struct RPop3Window { GtkWidget *recv_btn; GtkWidget *open_btn; GtkWidget *delete_btn; + GtkWidget *stop_btn; GtkWidget *close_btn; Pop3Session *session; + gboolean stop_load; gboolean cancelled; gboolean finished; GArray *delete_array; @@ -178,6 +180,8 @@ static void rpop3_open (GtkButton *button, gpointer data); static void rpop3_delete (GtkButton *button, gpointer data); +static void rpop3_stop (GtkButton *button, + gpointer data); static void rpop3_close (GtkButton *button, gpointer data); @@ -191,6 +195,8 @@ gint rpop3_account(PrefsAccount *account) return -1; if (inc_is_active()) return -1; + if (rpop3_window.window) + return -1; inc_lock(); @@ -198,6 +204,7 @@ gint rpop3_account(PrefsAccount *account) session = pop3_session_new(account); rpop3_window.session = POP3_SESSION(session); + rpop3_window.stop_load = FALSE; rpop3_window.cancelled = FALSE; rpop3_window.finished = FALSE; @@ -252,6 +259,7 @@ static void rpop3_window_create(PrefsAccount *account) GtkWidget *recv_btn; GtkWidget *open_btn; GtkWidget *delete_btn; + GtkWidget *stop_btn; GtkWidget *close_btn; gchar buf[BUFFSIZE]; @@ -340,6 +348,10 @@ static void rpop3_window_create(PrefsAccount *account) gtk_box_pack_start(GTK_BOX(hbbox), delete_btn, FALSE, FALSE, 0); gtk_widget_set_sensitive(delete_btn, FALSE); + stop_btn = gtk_button_new_from_stock(GTK_STOCK_STOP); + gtk_box_pack_start(GTK_BOX(hbbox), stop_btn, FALSE, FALSE, 0); + gtk_widget_set_sensitive(stop_btn, FALSE); + close_btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); gtk_box_pack_start(GTK_BOX(hbbox), close_btn, FALSE, FALSE, 0); @@ -349,6 +361,8 @@ static void rpop3_window_create(PrefsAccount *account) G_CALLBACK(rpop3_open), NULL); g_signal_connect(G_OBJECT(delete_btn), "clicked", G_CALLBACK(rpop3_delete), NULL); + g_signal_connect(G_OBJECT(stop_btn), "clicked", + G_CALLBACK(rpop3_stop), NULL); g_signal_connect(G_OBJECT(close_btn), "clicked", G_CALLBACK(rpop3_close), NULL); @@ -361,11 +375,14 @@ static void rpop3_window_create(PrefsAccount *account) rpop3_window.recv_btn = recv_btn; rpop3_window.open_btn = open_btn; rpop3_window.delete_btn = delete_btn; + rpop3_window.stop_btn = stop_btn; rpop3_window.close_btn = close_btn; } static gint rpop3_start(Session *session) { + SessionState state; + g_return_val_if_fail(session != NULL, -1); rpop3_status_label_set(_("Connecting to %s:%d ..."), @@ -384,10 +401,13 @@ static gint rpop3_start(Session *session) gtk_main_iteration(); } + state = session->state; + session_disconnect(session); + switch (POP3_SESSION(session)->error_val) { case PS_AUTHFAIL: - session_disconnect(session); manage_window_focus_in(rpop3_window.window, NULL, NULL); + rpop3_status_label_set(_("Authentication failed.")); if (POP3_SESSION(session)->error_msg) alertpanel_error(_("Authentication failed:\n%s"), POP3_SESSION(session)->error_msg); @@ -397,8 +417,8 @@ static gint rpop3_start(Session *session) case PS_SUCCESS: break; default: - session_disconnect(session); manage_window_focus_in(rpop3_window.window, NULL, NULL); + rpop3_status_label_set(_("Error occurred during POP3 session.")); if (POP3_SESSION(session)->error_msg) alertpanel_error (_("Error occurred during POP3 session:\n%s"), @@ -408,34 +428,38 @@ static gint rpop3_start(Session *session) return -1; } - switch (session->state) { + switch (state) { case SESSION_EOF: - session_disconnect(session); manage_window_focus_in(rpop3_window.window, NULL, NULL); + rpop3_status_label_set + (_("Connection closed by the remote host.")); alertpanel_error(_("Connection closed by the remote host.")); return -1; case SESSION_TIMEOUT: - session_disconnect(session); manage_window_focus_in(rpop3_window.window, NULL, NULL); + rpop3_status_label_set(_("Session timed out.")); alertpanel_error(_("Session timed out.")); return -1; case SESSION_ERROR: - session_disconnect(session); manage_window_focus_in(rpop3_window.window, NULL, NULL); - if (POP3_SESSION(session)->state == POP3_READY) - alertpanel_error(_("Can't connect to POP3 server: %s:%d"), - session->server, session->port); - else - alertpanel_error(_("Error occurred during POP3 session.")); + if (POP3_SESSION(session)->state == POP3_READY) { + rpop3_status_label_set + (_("Can't connect to POP3 server: %s:%d"), + session->server, session->port); + alertpanel_error + (_("Can't connect to POP3 server: %s:%d"), + session->server, session->port); + } else { + rpop3_status_label_set + (_("Error occurred during POP3 session.")); + alertpanel_error + (_("Error occurred during POP3 session.")); + } return -1; case SESSION_READY: - session_disconnect(session); debug_print("Session cancelled.\n"); return -1; - case SESSION_DISCONNECTED: - break; default: - session_disconnect(session); break; } @@ -515,7 +539,7 @@ static gint rpop3_top_recv(Pop3Session *session, FILE *fp, guint len) COL_DELETED, FALSE, -1); - rpop3_status_label_set(_("Retrieving message headers (%d / %d)"), + rpop3_status_label_set(_("Retrieving message headers (%d / %d) ..."), session->cur_msg, session->count); return PS_SUCCESS; @@ -774,8 +798,11 @@ static gint rpop3_session_recv_data_finished(Session *session, guchar *data, pop3_session->cur_msg = 1; if (rpop3_window.cancelled || pop3_session->count == 0) pop3_logout_send(rpop3_window.session); - else + else { + gtk_widget_set_sensitive(rpop3_window.stop_btn, + TRUE); rpop3_top_send(pop3_session); + } } else return -1; break; @@ -818,19 +845,22 @@ static gint rpop3_session_recv_data_as_file_finished(Session *session, if (rpop3_top_recv(pop3_session, fp, len) == PS_SUCCESS) { if (rpop3_window.cancelled) pop3_logout_send(rpop3_window.session); - else if (pop3_session->cur_msg < pop3_session->count) { + else if (!rpop3_window.stop_load && + (pop3_session->cur_msg < pop3_session->count)) { pop3_session->cur_msg++; rpop3_top_send(pop3_session); } else { rpop3_status_label_set (_("Retrieved %d message headers"), - pop3_session->count); + pop3_session->cur_msg); gtk_widget_set_sensitive (rpop3_window.recv_btn, TRUE); gtk_widget_set_sensitive (rpop3_window.open_btn, TRUE); gtk_widget_set_sensitive (rpop3_window.delete_btn, TRUE); + gtk_widget_set_sensitive + (rpop3_window.stop_btn, FALSE); pop3_session->state = POP3_IDLE; } } else @@ -990,6 +1020,11 @@ static void rpop3_delete(GtkButton *button, gpointer data) g_array_free(array, TRUE); } +static void rpop3_stop(GtkButton *button, gpointer data) +{ + rpop3_window.stop_load = TRUE; +} + static void rpop3_close(GtkButton *button, gpointer data) { rpop3_window.finished = TRUE; |