0.9.6claws3
[claws.git] / src / send_message.c
index 7d83c1dd1b51bb1e42e97dd93292a975fa4df49a..0327d3716eef271d1c3476077adc345c86d4d8a6 100644 (file)
 #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"
 
@@ -77,12 +78,15 @@ static gint send_send_data_finished (Session                *session,
                                         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;
@@ -102,13 +106,7 @@ gint send_message(const gchar *file, PrefsAccount *ac_prefs, GSList *to_list)
                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);
@@ -227,6 +225,9 @@ gint send_message_queue(const gchar *file)
                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);
                }
        }
 
@@ -358,6 +359,8 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
        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
@@ -398,10 +401,9 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
                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) {
@@ -411,26 +413,36 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
                }
                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)
 {
+       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:
@@ -438,10 +450,12 @@ static gint send_recv_message(Session *session, const gchar *msg, gpointer data)
        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..."));
@@ -465,7 +479,6 @@ static gint send_recv_message(Session *session, const gchar *msg, gpointer data)
                state_str = _("Quitting");
                break;
        case SMTP_ERROR:
-       case SMTP_AUTH_FAILED:
                g_warning("send: error: %s\n", msg);
                return 0;
        default:
@@ -481,27 +494,31 @@ static gint send_recv_message(Session *session, const gchar *msg, gpointer data)
 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;
 }
 
@@ -545,8 +562,54 @@ static void send_progress_dialog_destroy(SendProgressDialog *dialog)
 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);
+       }
+}
+