/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2001 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "automaton.h"
#include "folder.h"
+#include "pixmaps/continue.xpm"
+#include "pixmaps/complete.xpm"
+#include "pixmaps/error.xpm"
+
+GdkPixmap *currentxpm;
+GdkBitmap *currentxpmmask;
+GdkPixmap *errorxpm;
+GdkBitmap *errorxpmmask;
+GdkPixmap *okxpm;
+GdkBitmap *okxpmmask;
+
#define MSGBUFSIZE 8192
static void inc_finished (MainWindow *mainwin);
static void inc_pop3_state_destroy (Pop3State *state);
static void inc_start (IncProgressDialog *inc_dialog);
static IncState inc_pop3_session_do (IncSession *session);
-static gint pop3_automaton_terminate (gint source,
+static gint pop3_automaton_terminate (SockInfo *source,
Automaton *atm);
static GHashTable *inc_get_uidl_table (PrefsAccount *ac_prefs);
static gint connection_check_cb (Automaton *atm);
#endif
+static void inc_pop3_recv_func (SockInfo *sock,
+ gint read_len,
+ gpointer data);
+
static void inc_put_error (IncState istate);
static void inc_cancel (GtkWidget *widget,
static gint get_spool (FolderItem *dest,
const gchar *mbox);
+static void inc_all_spool(void);
+
static void inc_finished(MainWindow *mainwin)
{
FolderItem *item;
waitpid(pid, NULL, 0);
if (prefs_common.inc_local) inc_spool();
+ inc_all_spool();
} else {
if (prefs_common.inc_local) inc_spool();
+ inc_all_spool();
inc_account_mail(cur_account, mainwin);
}
{
IncProgressDialog *inc_dialog;
IncSession *session;
+ gchar *text[3];
session = inc_session_new(account);
if (!session) return;
inc_dialog->mainwin = mainwin;
session->data = inc_dialog;
+ text[0] = NULL;
+ text[1] = account->account_name;
+ text[2] = _("Standby");
+ gtk_clist_append(GTK_CLIST(inc_dialog->dialog->clist), text);
+
inc_start(inc_dialog);
}
inc_dialog->mainwin = mainwin;
for (list = queue_list; list != NULL; list = list->next) {
IncSession *session = list->data;
+ gchar *text[3];
+
session->data = inc_dialog;
+
+ text[0] = NULL;
+ text[1] = session->pop3_state->ac_prefs->account_name;
+ text[2] = _("Standby");
+ gtk_clist_append(GTK_CLIST(inc_dialog->dialog->clist), text);
}
inc_start(inc_dialog);
progress_dialog_set_value(progress, 0.0);
+ gtk_widget_show(progress->window);
+
+ PIXMAP_CREATE(progress->clist, okxpm, okxpmmask, complete_xpm);
+ PIXMAP_CREATE(progress->clist,
+ currentxpm, currentxpmmask, continue_xpm);
+ PIXMAP_CREATE(progress->clist, errorxpm, errorxpmmask, error_xpm);
+
gtk_widget_show_now(progress->window);
dialog->dialog = progress;
static void inc_pop3_state_destroy(Pop3State *state)
{
g_hash_table_destroy(state->folder_table);
+ g_free(state->sizes);
+
if (state->id_table) {
hash_free_strings(state->id_table);
g_hash_table_destroy(state->id_table);
static void inc_start(IncProgressDialog *inc_dialog)
{
IncSession *session;
+ GtkCList *clist = GTK_CLIST(inc_dialog->dialog->clist);
Pop3State *pop3_state;
IncState inc_state;
+ gint num = 0;
while (inc_dialog->queue_list != NULL) {
session = inc_dialog->queue_list->data;
}
}
+ gtk_clist_set_pixmap(clist, num, 0, currentxpm, currentxpmmask);
+ gtk_clist_set_text(clist, num, 2, _("Retrieving"));
+
/* begin POP3 session */
inc_state = inc_pop3_session_do(session);
+ if (inc_state == INC_SUCCESS || inc_state == INC_CANCEL) {
+ gtk_clist_set_pixmap(clist, num, 0, okxpm, okxpmmask);
+ gtk_clist_set_text(clist, num, 2, _("Done"));
+ } else {
+ gtk_clist_set_pixmap(clist, num, 0, errorxpm, errorxpmmask);
+ gtk_clist_set_text(clist, num, 2, _("Error"));
+ }
+
if (pop3_state->error_val == PS_AUTHFAIL) {
manage_window_focus_in(inc_dialog->dialog->window, NULL, NULL);
alertpanel_error
inc_session_destroy(session);
inc_dialog->queue_list =
g_list_remove(inc_dialog->queue_list, session);
+
+ num++;
}
while (inc_dialog->queue_list != NULL) {
inc_progress_dialog_destroy(inc_dialog);
}
+
static IncState inc_pop3_session_do(IncSession *session)
{
Pop3State *pop3_state = session->pop3_state;
gchar *server;
gushort port;
gchar *buf;
- AtmHandler handlers[] = {
+ static AtmHandler handlers[] = {
pop3_greeting_recv ,
pop3_getauth_user_send , pop3_getauth_user_recv,
pop3_getauth_pass_send , pop3_getauth_pass_recv,
pop3_getrange_stat_send , pop3_getrange_stat_recv,
pop3_getrange_last_send , pop3_getrange_last_recv,
pop3_getrange_uidl_send , pop3_getrange_uidl_recv,
+ pop3_getsize_list_send , pop3_getsize_list_recv,
pop3_retr_send , pop3_retr_recv,
pop3_delete_send , pop3_delete_recv,
pop3_logout_send , pop3_logout_recv
alertpanel_error(_("Can't connect to POP3 server: %s:%d"),
server, port);
manage_window_focus_out(inc_dialog->dialog->window, NULL, NULL);
- pop3_automaton_terminate(-1, atm);
+ pop3_automaton_terminate(NULL, atm);
automaton_destroy(atm);
- return pop3_state->inc_state;
+ return INC_ERROR;
}
+ /* :WK: Hmmm, with the later sock_gdk_input, we have 2 references
+ * to the sock structure - implement a reference counter?? */
pop3_state->sockinfo = sockinfo;
+ atm->help_sock = sockinfo;
+
+ recv_set_ui_func(inc_pop3_recv_func, session);
#if USE_THREADS
atm->timeout_tag = gtk_timeout_add
(TIMEOUT_ITV, (GtkFunction)connection_check_cb, atm);
#else
- atm->tag = gdk_input_add(sockinfo->sock,
- atm->state[atm->num].condition,
- automaton_input_cb, atm);
+ atm->tag = sock_gdk_input_add(sockinfo,
+ atm->state[atm->num].condition,
+ automaton_input_cb, atm);
#endif
gtk_main();
+ recv_set_ui_func(NULL, NULL);
+
#if USE_THREADS
//pthread_join(sockinfo->connect_thr, NULL);
#endif
- sock_sockinfo_free(sockinfo);
automaton_destroy(atm);
return pop3_state->inc_state;
}
-static gint pop3_automaton_terminate(gint source, Automaton *atm)
+static gint pop3_automaton_terminate(SockInfo *source, Automaton *atm)
{
if (atm->tag > 0) {
gdk_input_remove(atm->tag);
gtk_timeout_remove(atm->timeout_tag);
atm->timeout_tag = 0;
}
- if (source > 0) {
+ if (source) {
sock_close(source);
gtk_main_quit();
}
}
#endif
+static void inc_pop3_recv_func(SockInfo *sock, gint read_len, gpointer data)
+{
+ gchar buf[MSGBUFSIZE];
+ IncSession *session = (IncSession *)data;
+ Pop3State *state = session->pop3_state;
+ IncProgressDialog *inc_dialog = session->data;
+ ProgressDialog *dialog = inc_dialog->dialog;
+ gint cur_total;
+
+ state->cur_msg_bytes += read_len;
+ cur_total = state->cur_total_bytes + state->cur_msg_bytes;
+ if (cur_total > state->total_bytes)
+ cur_total = state->total_bytes;
+
+ g_snprintf(buf, sizeof(buf),
+ _("Retrieving message (%d / %d) (%d / %d bytes)"),
+ state->cur_msg, state->count,
+ cur_total, state->total_bytes);
+ progress_dialog_set_label(dialog, buf);
+
+ progress_dialog_set_percentage
+ (dialog, (gfloat)cur_total / (gfloat)state->total_bytes);
+ GTK_EVENTS_FLUSH();
+}
+
void inc_progress_update(Pop3State *state, Pop3Phase phase)
{
gchar buf[MSGBUFSIZE];
case POP3_RETR_SEND:
case POP3_RETR_RECV:
g_snprintf(buf, sizeof(buf),
- _("Retrieving message (%d / %d)"),
- state->cur_msg, state->count);
+ _("Retrieving message (%d / %d) (%d / %d bytes)"),
+ state->cur_msg, state->count,
+ state->cur_total_bytes, state->total_bytes);
progress_dialog_set_label(dialog, buf);
progress_dialog_set_percentage
- (dialog, (gfloat)state->cur_msg / state->count);
+ (dialog,
+ (gfloat)(state->cur_total_bytes) /
+ (gfloat)(state->total_bytes));
break;
case POP3_DELETE_SEND:
case POP3_DELETE_RECV:
#endif
session->pop3_state->inc_state = INC_CANCEL;
- pop3_automaton_terminate(sockinfo->sock, session->atm);
+ pop3_automaton_terminate(sockinfo, session->atm);
}
static gint inc_spool(void)
return msgs;
}
+static void inc_spool_account(PrefsAccount *account)
+{
+ FolderItem *inbox;
+ FolderItem *dropfolder;
+ gint val;
+
+ if (account->inbox) {
+ inbox = folder_find_item_from_path(account->inbox);
+ if (!inbox)
+ inbox = folder_get_default_inbox();
+ } else
+ inbox = folder_get_default_inbox();
+
+ get_spool(inbox, account->local_mbox);
+}
+
+static void inc_all_spool(void)
+{
+ GList *list = NULL;
+
+ list = account_get_list();
+ if (!list) return;
+
+ for (; list != NULL; list = list->next) {
+ IncSession *session;
+ PrefsAccount *account = list->data;
+
+ if (account->protocol == A_LOCAL)
+ inc_spool_account(account);
+ }
+}
+
static gint get_spool(FolderItem *dest, const gchar *mbox)
{
gint msgs, size;
gint lockfd;
- gchar *tmp_mbox = "/tmp/tmpmbox";
+ gchar tmp_mbox[256] = "/tmp/tmpmboxXXXXXX";
GHashTable *folder_table = NULL;
g_return_val_if_fail(dest != NULL, -1);
if ((lockfd = lock_mbox(mbox, LOCK_FLOCK)) < 0)
return -1;
+ if (mktemp(tmp_mbox) == NULL)
+ return -1;
+
if (copy_mbox(mbox, tmp_mbox) < 0)
return -1;