#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);
}
}
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
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 (SMTP_SESSION(session)->error_val == SM_AUTHFAIL) {
}
ret = -1;
} else if (session->state == SESSION_ERROR ||
+ session->state == SESSION_EOF ||
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)
{
- SMTPSession *smtp_session;
- SendProgressDialog *dialog;
gchar buf[BUFFSIZE];
- gchar *state_str;
+ SMTPSession *smtp_session = SMTP_SESSION(session);
+ SendProgressDialog *dialog = (SendProgressDialog *)data;
+ gchar *state_str = NULL;
- dialog = (SendProgressDialog *) data;
- state_str = NULL;
- smtp_session = SMTP_SESSION(session);
+ g_return_val_if_fail(dialog != NULL, -1);
switch (smtp_session->state) {
case SMTP_READY:
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..."));
state_str = _("Quitting");
break;
case SMTP_ERROR:
- case SMTP_AUTH_FAILED:
g_warning("send: error: %s\n", msg);
return 0;
default:
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
(dialog->dialog, (gfloat)cur_len / (gfloat)total_len);
+
return 0;
}
static gint send_send_data_finished(Session *session, guint len, gpointer data)
{
SendProgressDialog *dialog = (SendProgressDialog *)data;
- gchar buf[BUFFSIZE];
-
- g_snprintf(buf, sizeof(buf), _("Sending message (%d / %d bytes)"),
- len, len);
- progress_dialog_set_label(dialog->dialog, buf);
- progress_dialog_set_percentage
- (dialog->dialog, (gfloat)len / (gfloat)len);
+
+ g_return_val_if_fail(dialog != NULL, -1);
+
+ send_send_data_progressive(session, len, len, dialog);
return 0;
}
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:
+ if (session->state == SESSION_ERROR) {
+ log_msg =
+ _("Error occurred while sending the message.");
+ err_msg = g_strdup(log_msg);
+ } else if (session->state == SESSION_EOF) {
+ log_msg = _("Connection closed by the remote host.");
+ err_msg = g_strdup(log_msg);
+ }
+ break;
+ }
+
+ if (log_msg)
+ log_warning("%s\n", log_msg);
+ if (err_msg) {
+ alertpanel_error_log("%s", err_msg);
+ g_free(err_msg);
+ }
+}
+