diff options
-rw-r--r-- | mail/ChangeLog | 18 | ||||
-rw-r--r-- | mail/mail-account-editor.c | 197 | ||||
-rw-r--r-- | mail/mail-account-editor.h | 1 | ||||
-rw-r--r-- | mail/mail-config-druid.c | 71 |
4 files changed, 203 insertions, 84 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 8a8cfc050f..21f1cae416 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,21 @@ +2001-01-07 Jeffrey Stedfast <fejj@helixcode.com> + + * mail-account-editor.c (apply_clicked): Implemented. + (ok_clicked): Implemented. + (cancel_clicked): Implemented. + (source_auth_type_changed): Implemented. + (source_auth_init): Implemented. + (transport_construct_authmenu): Implemented. + (transport_type_changed): Updated to change regenerate the auth + option menu. + (construct): Attached callbacks to OK, Apply and Cancel buttons. + + * mail-account-editor.c (source_auth_init): Use the new + mail_config_check_service(). + + * mail-config-druid.c: Remove check_service() as it will be moved + into mail-config. + 2001-01-06 Christopher James Lahey <clahey@helixcode.com> * message-list.c (message_list_select): Made it so that going to diff --git a/mail/mail-account-editor.c b/mail/mail-account-editor.c index 1146485758..ec36a8fcab 100644 --- a/mail/mail-account-editor.c +++ b/mail/mail-account-editor.c @@ -86,6 +86,107 @@ mail_account_editor_finalise (GtkObject *obj) } static void +apply_clicked (GtkWidget *widget, gpointer data) +{ + MailAccountEditor *editor = data; + const MailConfigAccount *account; + char *host, *pport; + CamelURL *url; + int port; + + account = editor->account; + + /* account name */ + g_free (account->name); + account->name = g_strdup (gtk_entry_get_text (editor->account_name)); + + /* identity info */ + g_free (account->id->name); + account->id->name = g_strdup (gtk_entry_get_text (editor->name)); + + g_free (account->id->address); + account->id->address = g_strdup (gtk_entry_get_text (editor->email)); + + g_free (account->id->reply_to); + account->id->reply_to = g_strdup (gtk_entry_get_text (editor->reply_to)); + + g_free (account->id->organization); + account->id->organization = g_strdup (gtk_entry_get_text (editor->organization)); + + g_free (account->id->signature); + account->id->signature = gnome_file_entry_get_full_path (editor->signature, TRUE); + + /* source */ + url = camel_url_new (account->source->url, NULL); + + g_free (url->user); + url->user = g_strdup (gtk_entry_get_text (editor->source_user)); + + g_free (url->passwd); + url->passwd = g_strdup (gtk_entry_get_text (editor->source_passwd)); + + g_free (url->authmech); + url->authmech = g_strdup (gtk_object_get_data (GTK_OBJECT (editor), "source_authmech")); + + g_free (url->host); + host = g_strdup (gtk_entry_get_text (editor->source_host)); + if (host && (pport = strchr (host, ':'))) { + *pport = '\0'; + port = atoi (pport + 1); + } else { + port = 0; + } + url->host = host; + url->port = port; + + g_free (account->source->url); + account->source->url = camel_url_to_string (url); + camel_url_free (url); + + account->source->save_passwd = GTK_TOGGLE_BUTTON (editor->save_passwd)->active; + account->source->keep_on_server = GTK_TOGGLE_BUTTON (editor->keep_on_server)->active; + + /* transport */ + url = camel_url_new (account->transport->url, NULL); + + g_free (url->authmech); + url->authmech = g_strdup (gtk_object_get_data (GTK_OBJECT (editor), "transport_authmech")); + + g_free (url->host); + host = g_strdup (gtk_entry_get_text (editor->transport_host)); + if (host && (pport = strchr (host, ':'))) { + *pport = '\0'; + port = atoi (pport + 1); + } else { + port = 0; + } + url->host = host; + url->port = port; + + g_free (account->transport->url); + account->transport->url = camel_url_to_string (url); + camel_url_free (url); +} + +static void +ok_clicked (GtkWidget *widget, gpointer data) +{ + MailAccountEditor *editor = data; + + apply_clicked (widget, data); + + gtk_widget_destroy (GTK_WIDGET (editor)); +} + +static void +cancel_clicked (GtkWidget *widget, gpointer data) +{ + MailAccountEditor *editor = data; + + gtk_widget_destroy (GTK_WIDGET (editor)); +} + +static void source_auth_type_changed (GtkWidget *widget, gpointer user_data) { MailAccountEditor *editor = user_data; @@ -116,7 +217,7 @@ source_auth_init (MailAccountEditor *editor, CamelURL *url) gtk_option_menu_set_menu (editor->source_auth, menu); /* If we can't connect, don't let them continue. */ - if (!check_service (url, CAMEL_PROVIDER_STORE, &authtypes)) { + if (!mail_config_check_service (url, CAMEL_PROVIDER_STORE, &authtypes)) { return; } @@ -136,7 +237,7 @@ source_auth_init (MailAccountEditor *editor, CamelURL *url) gtk_menu_append (GTK_MENU (menu), item); - if (!g_strcasecmp (authtype->authproto, url->authmech)) + if (url->authmech && !g_strcasecmp (authtype->authproto, url->authmech)) authmech = item; } @@ -146,6 +247,64 @@ source_auth_init (MailAccountEditor *editor, CamelURL *url) } static void +transport_auth_type_changed (GtkWidget *widget, gpointer user_data) +{ + MailAccountEditor *editor = user_data; + CamelServiceAuthType *authtype; + gboolean sensitive; + + authtype = gtk_object_get_data (GTK_OBJECT (widget), "authtype"); + + gtk_object_set_data (GTK_OBJECT (editor), "transport_authmech", authtype->authproto); +} + +static void +transport_construct_authmenu (MailAccountEditor *editor, CamelURL *url) +{ + GtkWidget *first = NULL, *preferred = NULL; + GtkWidget *menu, *item; + CamelServiceAuthType *authtype; + GList *authtypes = NULL; + + menu = gtk_menu_new (); + gtk_option_menu_set_menu (editor->transport_auth, menu); + + /* If we can't connect, don't let them continue. */ + if (!mail_config_check_service (url, CAMEL_PROVIDER_TRANSPORT, &authtypes)) { + return; + } + + if (authtypes) { + GList *l; + + menu = gtk_menu_new (); + l = authtypes; + while (l) { + authtype = l->data; + + item = gtk_menu_item_new_with_label (authtype->name); + gtk_object_set_data (GTK_OBJECT (item), "authtype", authtype); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (transport_auth_type_changed), + editor); + + gtk_menu_append (GTK_MENU (menu), item); + + if (!first) + first = item; + + if (url->authmech && !g_strcasecmp (authtype->authproto, url->authmech)) + preferred = item; + } + } + + if (preferred) + gtk_signal_emit_by_name (GTK_OBJECT (preferred), "activate", editor); + else if (first) + gtk_signal_emit_by_name (GTK_OBJECT (first), "activate", editor); +} + +static void transport_type_changed (GtkWidget *widget, gpointer user_data) { MailAccountEditor *editor = user_data; @@ -161,12 +320,20 @@ transport_type_changed (GtkWidget *widget, gpointer user_data) gtk_widget_set_sensitive (GTK_WIDGET (editor->transport_host), FALSE); /* auth */ - if (provider->url_flags & CAMEL_URL_ALLOW_AUTH) + if (provider->url_flags & CAMEL_URL_ALLOW_AUTH) { + CamelURL *url; + gtk_widget_set_sensitive (GTK_WIDGET (editor->transport_auth_type), TRUE); - else + + /* regen the auth list */ + url = g_new0 (CamelURL, 1); + url->protocol = g_strdup (provider->protocol); + url->host = g_strdup (gtk_entry_get_text (editor->transport_host)); + transport_contstruct_authmenu (editor, url); + camel_url_free (url); + } else { gtk_widget_set_sensitive (GTK_WIDGET (editor->transport_auth_type), FALSE); - - /* FIXME: regen the auth list */ + } } static void @@ -211,13 +378,6 @@ transport_type_init (MailAccountEditor *editor, CamelURL *url) } static void -transport_auth_init (MailAccountEditor *editor, CamelURL *url) -{ - /* FIXME: look through the options and select the prefered authmech */ - ; -} - -static void construct (MailAccountEditor *editor, const MailConfigAccount *account) { GladeXML *gui; @@ -238,6 +398,16 @@ construct (MailAccountEditor *editor, const MailConfigAccount *account) GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_APPLY, GNOME_STOCK_BUTTON_CANCEL); + gnome_dialog_button_connect (GNOME_DIALOG (editor), 0 /* OK */, + GTK_SIGNAL_FUNC (ok_clicked), + editor); + gnome_dialog_button_connect (GNOME_DIALOG (editor), 1 /* APPLY */, + GTK_SIGNAL_FUNC (apply_clicked), + editor); + gnome_dialog_button_connect (GNOME_DIALOG (editor), 2 /* CANCEL */, + GTK_SIGNAL_FUNC (cancel_clicked), + editor); + /* General */ editor->account_name = GTK_ENTRY (glade_xml_get_widget (gui, "txtAccountName")); gtk_entry_set_text (editor->account_name, account->name); @@ -296,7 +466,6 @@ construct (MailAccountEditor *editor, const MailConfigAccount *account) editor->transport_ssl = GTK_CHECK_BUTTON (glade_xml_get_widget (gui, "chkTransportSSL")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->transport_ssl), account->transport->use_ssl); transport_type_init (editor, url); - transport_auth_init (editor, url); camel_url_free (url); editor->account = account; diff --git a/mail/mail-account-editor.h b/mail/mail-account-editor.h index f439275901..5694e5320d 100644 --- a/mail/mail-account-editor.h +++ b/mail/mail-account-editor.h @@ -66,7 +66,6 @@ struct _MailAccountEditor { GtkOptionMenu *transport_auth; GtkCheckButton *transport_ssl; - GtkSpinButton *auto_mail_check; GtkCheckButton *keep_on_server; const CamelProvider *transport; diff --git a/mail/mail-config-druid.c b/mail/mail-config-druid.c index 4c8ada2aa5..511e162bd6 100644 --- a/mail/mail-config-druid.c +++ b/mail/mail-config-druid.c @@ -36,8 +36,6 @@ static void mail_config_druid_finalise (GtkObject *obj); static void construct_auth_menu (MailConfigDruid *druid, GList *authtypes); -static gboolean check_service (CamelURL *url, CamelProviderType type, GList **authtypes); - static GtkWindowClass *parent_class; GtkType @@ -324,7 +322,7 @@ incoming_next (GnomeDruidPage *page, GnomeDruid *druid, gpointer data) url->path = mail_config_druid_get_incoming_path (config); /* If we can't connect, don't let them continue. */ - if (!check_service (url, CAMEL_PROVIDER_STORE, &authtypes)) { + if (!mail_config_check_service (url, CAMEL_PROVIDER_STORE, &authtypes)) { camel_url_free (url); return TRUE; } @@ -509,7 +507,7 @@ transport_next (GnomeDruidPage *page, GnomeDruid *druid, gpointer data) url->host = mail_config_druid_get_outgoing_hostname (config); /* If we can't connect, don't let them continue. */ - if (!check_service (url, CAMEL_PROVIDER_TRANSPORT, NULL)) { + if (!mail_config_check_service (url, CAMEL_PROVIDER_TRANSPORT, NULL)) { camel_url_free (url); return TRUE; } @@ -736,71 +734,6 @@ construct (MailConfigDruid *druid) gnome_druid_set_buttons_sensitive (druid->druid, FALSE, TRUE, TRUE); } -/* Async service-checking/authtype-lookup code. */ - -typedef struct { - char *url; - CamelProviderType type; - GList **authtypes; - gboolean success; -} check_service_input_t; - -static char * -describe_check_service (gpointer in_data, gboolean gerund) -{ - if (gerund) - return g_strdup (_("Connecting to server")); - else - return g_strdup (_("Connect to server")); -} - -static void -do_check_service (gpointer in_data, gpointer op_data, CamelException *ex) -{ - check_service_input_t *input = in_data; - CamelService *service; - - if (input->authtypes) { - service = camel_session_get_service ( - session, input->url, input->type, ex); - if (!service) - return; - *input->authtypes = camel_service_query_auth_types (service, ex); - } else { - service = camel_session_get_service_connected ( - session, input->url, input->type, ex); - } - if (service) - camel_object_unref (CAMEL_OBJECT (service)); - if (!camel_exception_is_set (ex)) - input->success = TRUE; -} - -static const mail_operation_spec op_check_service = { - describe_check_service, - 0, - NULL, - do_check_service, - NULL -}; - -static gboolean -check_service (CamelURL *url, CamelProviderType type, GList **authtypes) -{ - check_service_input_t input; - - input.url = camel_url_to_string (url, TRUE); - input.type = type; - input.authtypes = authtypes; - input.success = FALSE; - - mail_operation_queue (&op_check_service, &input, FALSE); - mail_operation_wait_for_finish (); - g_free (input.url); - - return input.success; -} - MailConfigDruid * mail_config_druid_new () { |