#include "procheader.h"
#include "account.h"
#include "progressdialog.h"
+#include "statusbar.h"
#include "inputdialog.h"
+#include "alertpanel.h"
#include "manage_window.h"
#include "utils.h"
#include "gtkutils.h"
-#include "statusbar.h"
#include "inc.h"
#include "log.h"
guint len,
gpointer data);
-static SendProgressDialog *send_progress_dialog_create (void);
-static void send_progress_dialog_destroy (SendProgressDialog *dialog);
+static SendProgressDialog *send_progress_dialog_create(void);
+static void send_progress_dialog_destroy(SendProgressDialog *dialog);
static void send_cancel_button_cb (GtkWidget *widget,
gpointer data);
+static void send_put_error (Session *session);
+
+
gint send_message(const gchar *file, PrefsAccount *ac_prefs, GSList *to_list)
{
FILE *fp;
val = send_message_local(ac_prefs->mail_command, fp);
fclose(fp);
return val;
- }
- else if (prefs_common.use_extsend && prefs_common.extsend_cmd) {
- val = send_message_local(prefs_common.extsend_cmd, fp);
- fclose(fp);
- return val;
- }
- else {
+ } else {
val = send_message_smtp(ac_prefs, to_list, fp);
fclose(fp);
if (val == 0 && newsac) {
fseek(fp, fpos, SEEK_SET);
val = news_post_stream(FOLDER(newsac->folder), fp);
+ if (val < 0)
+ alertpanel_error_log(_("Error occurred while posting the message to %s ."),
+ newsac->nntp_server);
}
}
SMTPSession *smtp_session;
gushort port;
SendProgressDialog *dialog;
- GtkCList *clist;
- const gchar *text[3];
gchar buf[BUFFSIZE];
gint ret = 0;
ac_prefs->set_domain ? g_strdup(ac_prefs->domain) : NULL;
if (ac_prefs->use_smtp_auth) {
- if (ac_prefs->smtp_userid) {
+ smtp_session->forced_auth_type = ac_prefs->smtp_auth_type;
+ if (ac_prefs->smtp_userid && strlen(ac_prefs->smtp_userid)) {
smtp_session->user = g_strdup(ac_prefs->smtp_userid);
if (ac_prefs->smtp_passwd)
smtp_session->pass =
port = ac_prefs->set_smtpport ? ac_prefs->smtpport :
ac_prefs->ssl_smtp == SSL_TUNNEL ? SSMTP_PORT : SMTP_PORT;
session->ssl_type = ac_prefs->ssl_smtp;
+ if (ac_prefs->ssl_smtp != SSL_NONE)
+ session->nonblocking = ac_prefs->use_nonblocking_ssl;
#else
port = ac_prefs->set_smtpport ? ac_prefs->smtpport : SMTP_PORT;
#endif
dialog = send_progress_dialog_create();
dialog->session = session;
- text[0] = NULL;
- text[1] = ac_prefs->smtp_server;
- text[2] = _("Connecting");
- clist = GTK_CLIST(dialog->dialog->clist);
- gtk_clist_append(clist, (gchar **)text);
+ progress_dialog_list_set(dialog->dialog, 0, NULL,
+ ac_prefs->smtp_server,
+ _("Connecting"));
if (ac_prefs->pop_before_smtp
&& (ac_prefs->protocol == A_APOP || ac_prefs->protocol == A_POP3)
g_snprintf(buf, sizeof(buf), _("Doing POP before SMTP..."));
log_message(buf);
progress_dialog_set_label(dialog->dialog, buf);
- gtk_clist_set_text(clist, 0, 2, _("POP before SMTP"));
+ progress_dialog_list_set_status(dialog->dialog, 0, _("POP before SMTP"));
GTK_EVENTS_FLUSH();
inc_pop_before_smtp(ac_prefs);
}
return -1;
}
- g_print("parent: begin event loop\n");
+ debug_print("send_message_smtp(): begin event loop\n");
- while (session->state != SESSION_DISCONNECTED &&
- session->state != SESSION_ERROR)
+ while (session_is_connected(session) && dialog->cancelled == FALSE)
gtk_main_iteration();
- if (session->state == SESSION_ERROR ||
- SMTP_SESSION(session)->state == SMTP_ERROR)
+ if (SMTP_SESSION(session)->error_val == SM_AUTHFAIL) {
+ if (ac_prefs->smtp_userid && ac_prefs->tmp_smtp_pass) {
+ g_free(ac_prefs->tmp_smtp_pass);
+ ac_prefs->tmp_smtp_pass = NULL;
+ }
+ ret = -1;
+ } else if (session->state == SESSION_ERROR ||
+ session->state == SESSION_EOF ||
+ session->state == SESSION_TIMEOUT ||
+ SMTP_SESSION(session)->state == SMTP_ERROR ||
+ SMTP_SESSION(session)->error_val != SM_OK)
ret = -1;
else if (dialog->cancelled == TRUE)
ret = -1;
+ if (ret == -1) {
+ manage_window_focus_in(dialog->dialog->window, NULL, NULL);
+ send_put_error(session);
+ manage_window_focus_out(dialog->dialog->window, NULL, NULL);
+ }
+
session_destroy(session);
send_progress_dialog_destroy(dialog);
+ statusbar_pop_all();
statusbar_verbosity_set(FALSE);
return ret;
}
static gint send_recv_message(Session *session, const gchar *msg, gpointer data)
{
+ gchar buf[BUFFSIZE];
SMTPSession *smtp_session = SMTP_SESSION(session);
SendProgressDialog *dialog = (SendProgressDialog *)data;
- gchar buf[BUFFSIZE];
gchar *state_str = NULL;
+ g_return_val_if_fail(dialog != NULL, -1);
+
switch (smtp_session->state) {
case SMTP_READY:
case SMTP_CONNECTED:
case SMTP_HELO:
g_snprintf(buf, sizeof(buf), _("Sending HELO..."));
state_str = _("Authenticating");
+ statusbar_print_all(_("Sending message..."));
break;
case SMTP_EHLO:
g_snprintf(buf, sizeof(buf), _("Sending EHLO..."));
state_str = _("Authenticating");
+ statusbar_print_all(_("Sending message..."));
break;
case SMTP_AUTH:
g_snprintf(buf, sizeof(buf), _("Authenticating..."));
}
progress_dialog_set_label(dialog->dialog, buf);
- gtk_clist_set_text(GTK_CLIST(dialog->dialog->clist), 0, 2, state_str);
+ progress_dialog_list_set_status(dialog->dialog, 0, state_str);
return 0;
}
static gint send_send_data_progressive(Session *session, guint cur_len,
guint total_len, gpointer data)
{
- SendProgressDialog *dialog = (SendProgressDialog *)data;
gchar buf[BUFFSIZE];
+ SendProgressDialog *dialog = (SendProgressDialog *)data;
+
+ g_return_val_if_fail(dialog != NULL, -1);
+
+ if (SMTP_SESSION(session)->state != SMTP_SEND_DATA &&
+ SMTP_SESSION(session)->state != SMTP_EOM)
+ return 0;
g_snprintf(buf, sizeof(buf), _("Sending message (%d / %d bytes)"),
cur_len, total_len);
progress_dialog_set_label(dialog->dialog, buf);
- progress_dialog_set_percentage
+ progress_dialog_set_fraction
(dialog->dialog, (gfloat)cur_len / (gfloat)total_len);
return 0;
static gint send_send_data_finished(Session *session, guint len, gpointer data)
{
- send_send_data_progressive(session, len, len, data);
+ SendProgressDialog *dialog = (SendProgressDialog *)data;
+
+ g_return_val_if_fail(dialog != NULL, -1);
+
+ send_send_data_progressive(session, len, len, dialog);
return 0;
}
progress = progress_dialog_create();
gtk_window_set_title(GTK_WINDOW(progress->window),
_("Sending message"));
- gtk_signal_connect(GTK_OBJECT(progress->cancel_btn), "clicked",
- GTK_SIGNAL_FUNC(send_cancel_button_cb), dialog);
- gtk_signal_connect(GTK_OBJECT(progress->window), "delete_event",
- GTK_SIGNAL_FUNC(gtk_true), NULL);
+ g_signal_connect(G_OBJECT(progress->cancel_btn), "clicked",
+ G_CALLBACK(send_cancel_button_cb), dialog);
+ g_signal_connect(G_OBJECT(progress->window), "delete_event",
+ G_CALLBACK(gtk_true), NULL);
gtk_window_set_modal(GTK_WINDOW(progress->window), TRUE);
manage_window_set_transient(GTK_WINDOW(progress->window));
- progress_dialog_set_value(progress, 0.0);
+ progress_dialog_get_fraction(progress);
if (prefs_common.send_dialog_mode == SEND_DIALOG_ALWAYS) {
gtk_widget_show_now(progress->window);
static void send_cancel_button_cb(GtkWidget *widget, gpointer data)
{
SendProgressDialog *dialog = (SendProgressDialog *)data;
- Session *session = dialog->session;
- session->state = SESSION_DISCONNECTED;
dialog->cancelled = TRUE;
}
+
+static void send_put_error(Session *session)
+{
+ gchar *msg;
+ gchar *log_msg = NULL;
+ gchar *err_msg = NULL;
+
+ msg = SMTP_SESSION(session)->error_msg;
+
+ switch (SMTP_SESSION(session)->error_val) {
+ case SM_ERROR:
+ case SM_UNRECOVERABLE:
+ log_msg = _("Error occurred while sending the message.");
+ if (msg)
+ err_msg = g_strdup_printf
+ (_("Error occurred while sending the message:\n%s"),
+ msg);
+ else
+ err_msg = g_strdup(log_msg);
+ break;
+ case SM_AUTHFAIL:
+ log_msg = _("Authentication failed.");
+ if (msg)
+ err_msg = g_strdup_printf
+ (_("Authentication failed:\n%s"), msg);
+ else
+ err_msg = g_strdup(log_msg);
+ break;
+ default:
+ switch (session->state) {
+ case SESSION_ERROR:
+ log_msg =
+ _("Error occurred while sending the message.");
+ err_msg = g_strdup(log_msg);
+ break;
+ case SESSION_EOF:
+ log_msg = _("Connection closed by the remote host.");
+ err_msg = g_strdup(log_msg);
+ break;
+ case SESSION_TIMEOUT:
+ log_msg = _("Session timed out.");
+ err_msg = g_strdup(log_msg);
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+
+ if (log_msg)
+ log_warning("%s\n", log_msg);
+ if (err_msg) {
+ alertpanel_error_log("%s", err_msg);
+ g_free(err_msg);
+ }
+}
+