diff options
Diffstat (limited to 'mail/mail-callbacks.c')
-rw-r--r-- | mail/mail-callbacks.c | 163 |
1 files changed, 91 insertions, 72 deletions
diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 2739c40c93..3942b86a41 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -58,14 +58,64 @@ struct post_send_data { }; static gboolean -check_configured (void) +check_configured (FolderBrowser *fb) { if (mail_config_is_configured ()) return TRUE; - mail_config_druid (); + if (fb) { + mail_config_druid (fb->shell); + return mail_config_is_configured (); + } else + return FALSE; +} + +static gboolean +check_send_configuration (FolderBrowser *fb) +{ + MailConfigService *xport = NULL; - return mail_config_is_configured (); + /* Check general */ + + if (!check_configured (fb)) { + GtkWidget *message; + + message = gnome_warning_dialog_parented (_("You need to configure the mail client\n" + "before you can compose mail."), + GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (fb), + GTK_TYPE_WINDOW))); + mail_dialog_run_and_close (GNOME_DIALOG (message)); + return FALSE; + } + + /* Check for an identity */ + + if (!mail_config_get_default_identity ()) { + GtkWidget *message; + + message = gnome_warning_dialog_parented (_("You need to configure an identity\n" + "before you can compose mail."), + GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (fb), + GTK_TYPE_WINDOW))); + mail_dialog_run_and_close (GNOME_DIALOG (message)); + return FALSE; + } + + /* Check for a transport */ + + xport = mail_config_get_transport (); + if (!xport || !xport->url) { + GtkWidget *message; + + message = gnome_warning_dialog_parented (_("You need to configure a mail transport\n" + "before you can compose mail."), + GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (fb), + GTK_TYPE_WINDOW))); + mail_dialog_run_and_close (GNOME_DIALOG (message)); + return FALSE; + } + + return TRUE; } static void @@ -89,7 +139,7 @@ fetch_mail (GtkWidget *button, gpointer user_data) { GSList *sources; - if (!check_configured ()) { + if (!check_configured (FOLDER_BROWSER (user_data))) { GtkWidget *win = gtk_widget_get_ancestor (GTK_WIDGET (user_data), GTK_TYPE_WINDOW); @@ -136,9 +186,7 @@ ask_confirm_for_empty_subject (EMsgComposer *composer) GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_NO, NULL); - /*GDK_THREADS_ENTER ();*/ - button = gnome_dialog_run_and_close (GNOME_DIALOG (message_box)); - /*GDK_THREADS_LEAVE ();*/ + button = mail_dialog_run_and_close (GNOME_DIALOG (message_box)); if (button == 0) return TRUE; @@ -146,6 +194,19 @@ ask_confirm_for_empty_subject (EMsgComposer *composer) return FALSE; } +static void +free_psd (struct post_send_data *psd) +{ + if (!psd) + return; + + if (psd->folder) + camel_object_unref (CAMEL_OBJECT (psd->folder)); + if (psd->uid) + g_free (psd->uid); + g_free (psd); +} + void composer_send_cb (EMsgComposer *composer, gpointer data) { @@ -157,37 +218,10 @@ composer_send_cb (EMsgComposer *composer, gpointer data) struct post_send_data *psd = data; - /* Check for an identity */ + /* Config info */ id = mail_config_get_default_identity (); - if (!check_configured () || !id) { - GtkWidget *message; - - message = gnome_warning_dialog_parented (_("You need to configure an identity\n" - "before you can send mail."), - GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (composer), - GTK_TYPE_WINDOW))); - GDK_THREADS_ENTER (); - gnome_dialog_run_and_close (GNOME_DIALOG (message)); - GDK_THREADS_LEAVE (); - return; - } - - /* Check for a transport */ - xport = mail_config_get_transport (); - if (!xport || !xport->url) { - GtkWidget *message; - - message = gnome_warning_dialog_parented (_("You need to configure a mail transport\n" - "before you can send mail."), - GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (composer), - GTK_TYPE_WINDOW))); - GDK_THREADS_ENTER (); - gnome_dialog_run_and_close (GNOME_DIALOG (message)); - GDK_THREADS_LEAVE (); - return; - } /* Generate our from address */ @@ -211,6 +245,7 @@ composer_send_cb (EMsgComposer *composer, gpointer data) if (subject == NULL || subject[0] == '\0') { if (! ask_confirm_for_empty_subject (composer)) { camel_object_unref (CAMEL_OBJECT (message)); + free_psd (psd); /* will take care of psd == NULL */ return; } } @@ -219,24 +254,15 @@ composer_send_cb (EMsgComposer *composer, gpointer data) mail_do_send_mail (xport->url, message, from, psd->folder, psd->uid, psd->flags, GTK_WIDGET (composer)); - g_free (psd->uid); } else { mail_do_send_mail (xport->url, message, from, NULL, NULL, 0, GTK_WIDGET (composer)); } -} -static void -free_psd (GtkWidget *composer, gpointer user_data) -{ - struct post_send_data *psd = user_data; - - camel_object_unref (CAMEL_OBJECT (psd->folder)); - g_free (psd); + free_psd (psd); } - static GtkWidget * create_msg_composer (const char *url) { @@ -267,7 +293,7 @@ compose_msg (GtkWidget *widget, gpointer user_data) { GtkWidget *composer; - if (!check_configured ()) + if (!check_send_configuration (FOLDER_BROWSER (user_data))) return; composer = create_msg_composer (NULL); @@ -283,7 +309,9 @@ send_to_url (const char *url) { GtkWidget *composer; - if (!check_configured ()) + /* FIXME: no way to get folder browser? Not without + * big pain in the ass, as far as I can tell */ + if (!check_send_configuration (NULL)) return; composer = create_msg_composer (url); @@ -299,7 +327,9 @@ mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, gboolea EMsgComposer *composer; struct post_send_data *psd; - if (!check_configured () || !folder || + /* FIXME: I just don't feel like implementing the folder-browser-passing + * garbage. */ + if (!check_send_configuration (NULL) || !folder || !msg || !uid) return; @@ -313,8 +343,6 @@ mail_reply (CamelFolder *folder, CamelMimeMessage *msg, const char *uid, gboolea gtk_signal_connect (GTK_OBJECT (composer), "send", GTK_SIGNAL_FUNC (composer_send_cb), psd); - gtk_signal_connect (GTK_OBJECT (composer), "destroy", - GTK_SIGNAL_FUNC (free_psd), psd); gtk_widget_show (GTK_WIDGET (composer)); } @@ -351,9 +379,9 @@ forward_msg (GtkWidget *widget, gpointer user_data) EMsgComposer *composer; CamelMimeMessage *cursor_msg; GPtrArray *uids; - + cursor_msg = fb->mail_display->current_message; - if (!check_configured () || !cursor_msg) + if (!check_send_configuration (fb) || !cursor_msg) return; composer = E_MSG_COMPOSER (e_msg_composer_new ()); @@ -447,14 +475,16 @@ edit_msg (GtkWidget *widget, gpointer user_data) message = gnome_warning_dialog (_("You may only edit messages saved\n" "in the Drafts folder.")); - GDK_THREADS_ENTER (); - gnome_dialog_run_and_close (GNOME_DIALOG (message)); - GDK_THREADS_LEAVE (); + mail_dialog_run_and_close (GNOME_DIALOG (message)); return; } + if (!check_send_configuration (fb)) + return; + uids = g_ptr_array_new(); message_list_foreach (fb->message_list, enumerate_msg, uids); + mail_do_edit_messages (fb->folder, uids, (GtkSignalFunc) composer_send_cb); } @@ -538,16 +568,7 @@ filter_edit (BonoboUIHandler *uih, void *user_data, const char *path) dialog = gnome_warning_dialog (err); g_free (err); - /* These are necessary because gtk_main, called by - * g_d_r_a_c, does a LEAVE/ENTER pair when running - * a main loop recursively. I don't know why the threads - * lock isn't being held at this point, as we're in a - * callback, but I don't ask questions. It works, and - * threads are enabled so we know that it works. - */ - GDK_THREADS_ENTER(); - gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); - GDK_THREADS_LEAVE(); + mail_dialog_run_and_close (GNOME_DIALOG (dialog)); return; } @@ -565,13 +586,11 @@ vfolder_edit_vfolders (BonoboUIHandler *uih, void *user_data, const char *path) vfolder_edit(); } -/* - *void - *providers_config (BonoboUIHandler *uih, void *user_data, const char *path) - *{ - * mail_config(); - *} - */ +void +providers_config (BonoboUIHandler *uih, void *user_data, const char *path) +{ + mail_config ((FOLDER_BROWSER (user_data))->shell); +} void mail_print_msg (MailDisplay *md) |