2005-01-07 [colin] 0.9.13cvs28.3
[claws.git] / src / send_message.c
index 5a2a6baef5bed31743eb974df3618052833b7f00..4e5883db241c52b49cedb059d52a4e5978d36bda 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);
                }
        }
 
@@ -287,8 +288,6 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
        SMTPSession *smtp_session;
        gushort port;
        SendProgressDialog *dialog;
-       GtkCList *clist;
-       const gchar *text[3];
        gchar buf[BUFFSIZE];
        gint ret = 0;
 
@@ -306,8 +305,7 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
 
        if (ac_prefs->use_smtp_auth) {
                smtp_session->forced_auth_type = ac_prefs->smtp_auth_type;
-
-               if (ac_prefs->smtp_userid) {
+               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 =
@@ -358,6 +356,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
@@ -365,11 +365,9 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
        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)
@@ -377,7 +375,7 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
                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);
        }
@@ -398,10 +396,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,15 +408,24 @@ gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp)
                }
                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;
 }
@@ -440,10 +446,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..."));
@@ -467,7 +475,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:
@@ -475,7 +482,7 @@ static gint send_recv_message(Session *session, const gchar *msg, gpointer data)
        }
 
        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;
 }
@@ -488,10 +495,14 @@ static gint send_send_data_progressive(Session *session, guint cur_len,
 
        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;
@@ -517,14 +528,14 @@ static SendProgressDialog *send_progress_dialog_create(void)
        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);
@@ -547,8 +558,63 @@ 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:
+               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);
+       }
+}
+