From e0053bce8e3e5e7f18bea009f3bbfb1e51234f65 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 17 Jan 2003 23:31:27 +0000 Subject: Updated. (request_password): Same. 2003-01-17 Jeffrey Stedfast * mail-session.c (do_get_pass): Updated. (request_password): Same. * mail-send-recv.c (mail_send): Fixed to use EAccountService. * mail-config-druid.c (make_account): Updated to use EAccount and friends. * mail-account-gui.c (service_check_supported): Updated to use EAccountService. (mail_account_gui_new): Ref the account passed in and also update to use EAccount objects. (save_service): Updated to use an EAccountService. (add_new_store): Updated to use an EAccount. (mail_account_gui_save): Updated to use EAccounts. (setup_signatures): Updated because the new account->id->def_sig is now an int and not a structure pointer. * mail-account-editor.c (construct): Updated. (mail_account_editor_new): Now takes an EAccount object as an argument instead of a MailConfigAccount. * mail-crypto.c (mail_crypto_get_pgp_cipher_context): Updated to use EAccounts. * subscribe-dialog.c (populate_store_foreach): Removed. (populate_store_list): Can't use populate_store_foreach here because of the change to EAccountList so do it manually. * mail-vfolder.c (uri_is_ignore): Rewrote to use EAccountList and EIterator and all that fun. * mail-send-recv.c (build_dialogue): Updated to use EAccountList and EAccount object stuff. *ugh* (mail_send_receive): Here too. (mail_autoreceive_setup): Same. * mail-callbacks.c (check_send_configuration): Updated. (composer_get_message): Updated. (compose_msg): " (list_add_addresses): " (guess_me): " (guess_me_from_accounts): Same. (forward_get_composer): Here too. (mail_generate_reply): Same. (redirect_get_composer): " (empty_trash): And finally here. * mail-accounts.c (account_edit_clicked): Updated. (account_delete_clicked): Same. (account_default_clicked): Here too. (account_able_clicked): " (account_cursor_change): " (mail_accounts_load): Again here. * folder-browser.c (folder_browser_is_drafts): Updated to use EAccountList and EAccount stuff. (folder_browser_is_sent): Same. * component-factory.c (mail_load_storages): Updated to use EAccount and EAccountList stuff. (owner_set_cb): Same. (send_receive_cb): Here too. * mail-config.c: Rewritten to use EAccount and EAccountList objects. svn path=/trunk/; revision=19509 --- mail/ChangeLog | 69 ++++ mail/component-factory.c | 33 +- mail/folder-browser.c | 50 ++- mail/mail-account-editor.c | 8 +- mail/mail-account-editor.h | 2 +- mail/mail-account-gui.c | 174 +++++---- mail/mail-account-gui.h | 4 +- mail/mail-accounts.c | 40 +- mail/mail-callbacks.c | 89 +++-- mail/mail-config-druid.c | 205 +++++----- mail/mail-config.c | 944 ++++++++++++++------------------------------- mail/mail-config.h | 112 ++---- mail/mail-crypto.c | 2 +- mail/mail-crypto.h | 2 +- mail/mail-ops.c | 2 +- mail/mail-send-recv.c | 83 ++-- mail/mail-session.c | 8 +- mail/mail-vfolder.c | 67 ++-- mail/mail.h | 2 +- mail/subscribe-dialog.c | 62 +-- 20 files changed, 833 insertions(+), 1125 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index ab971296ec..79dae4b8b6 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,72 @@ +2003-01-17 Jeffrey Stedfast + + * mail-session.c (do_get_pass): Updated. + (request_password): Same. + + * mail-send-recv.c (mail_send): Fixed to use EAccountService. + + * mail-config-druid.c (make_account): Updated to use EAccount and + friends. + + * mail-account-gui.c (service_check_supported): Updated to use + EAccountService. + (mail_account_gui_new): Ref the account passed in and also update + to use EAccount objects. + (save_service): Updated to use an EAccountService. + (add_new_store): Updated to use an EAccount. + (mail_account_gui_save): Updated to use EAccounts. + (setup_signatures): Updated because the new account->id->def_sig + is now an int and not a structure pointer. + + * mail-account-editor.c (construct): Updated. + (mail_account_editor_new): Now takes an EAccount object as an + argument instead of a MailConfigAccount. + + * mail-crypto.c (mail_crypto_get_pgp_cipher_context): Updated to + use EAccounts. + + * subscribe-dialog.c (populate_store_foreach): Removed. + (populate_store_list): Can't use populate_store_foreach here + because of the change to EAccountList so do it manually. + + * mail-vfolder.c (uri_is_ignore): Rewrote to use EAccountList and + EIterator and all that fun. + + * mail-send-recv.c (build_dialogue): Updated to use EAccountList + and EAccount object stuff. *ugh* + (mail_send_receive): Here too. + (mail_autoreceive_setup): Same. + + * mail-callbacks.c (check_send_configuration): Updated. + (composer_get_message): Updated. + (compose_msg): " + (list_add_addresses): " + (guess_me): " + (guess_me_from_accounts): Same. + (forward_get_composer): Here too. + (mail_generate_reply): Same. + (redirect_get_composer): " + (empty_trash): And finally here. + + * mail-accounts.c (account_edit_clicked): Updated. + (account_delete_clicked): Same. + (account_default_clicked): Here too. + (account_able_clicked): " + (account_cursor_change): " + (mail_accounts_load): Again here. + + * folder-browser.c (folder_browser_is_drafts): Updated to use + EAccountList and EAccount stuff. + (folder_browser_is_sent): Same. + + * component-factory.c (mail_load_storages): Updated to use + EAccount and EAccountList stuff. + (owner_set_cb): Same. + (send_receive_cb): Here too. + + * mail-config.c: Rewritten to use EAccount and EAccountList + objects. + 2003-01-16 Jeffrey Stedfast * mail-config-druid.c (get_fn): Connect to the toggled event on diff --git a/mail/component-factory.c b/mail/component-factory.c index b78465c6a5..353d0026f2 100644 --- a/mail/component-factory.c +++ b/mail/component-factory.c @@ -762,7 +762,7 @@ owner_set_cb (EvolutionShellComponent *shell_component, gpointer user_data) { GNOME_Evolution_Shell corba_shell; - const GSList *accounts; + EAccountList *accounts; int i; /* FIXME: should we ref this? */ @@ -773,7 +773,7 @@ owner_set_cb (EvolutionShellComponent *shell_component, mail_session_init (); async_event = mail_async_event_new(); - + storages_hash = g_hash_table_new (NULL, NULL); corba_shell = evolution_shell_client_corba_objref (shell_client); @@ -972,7 +972,7 @@ send_receive_cb (EvolutionShellComponent *shell_component, gboolean show_dialog, void *data) { - const MailConfigAccount *account; + EAccount *account; /* FIXME: configure_mail() should be changed to work without a FolderBrowser, and then we will be able to call configure_mail from @@ -981,7 +981,7 @@ send_receive_cb (EvolutionShellComponent *shell_component, return; account = mail_config_get_default_account (); - if (!account || !account->transport) { + if (!account || !account->transport->url) { GtkWidget *dialog; dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, @@ -1473,10 +1473,10 @@ mail_load_storage_by_uri (GNOME_Evolution_Shell shell, const char *uri, const ch } void -mail_load_storages (GNOME_Evolution_Shell shell, const GSList *sources) +mail_load_storages (GNOME_Evolution_Shell shell, EAccountList *accounts) { CamelException ex; - const GSList *iter; + EIterator *iter; camel_exception_init (&ex); @@ -1485,22 +1485,23 @@ mail_load_storages (GNOME_Evolution_Shell shell, const GSList *sources) * it. */ - for (iter = sources; iter; iter = iter->next) { - const MailConfigAccount *account = NULL; - const MailConfigService *service = NULL; - char *name; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + EAccountService *service; + EAccount *account; + const char *name; - account = iter->data; + account = (EAccount *) e_iterator_get (iter); service = account->source; name = account->name; - if (service == NULL || service->url == NULL || service->url[0] == '\0') - continue; - - /* don't auto-connect here; the shell will tell us to goOnline */ - if (account->enabled) + if (account->enabled && service->url != NULL) mail_load_storage_by_uri (shell, service->url, name); + + e_iterator_next (iter); } + + g_object_unref (iter); } void diff --git a/mail/folder-browser.c b/mail/folder-browser.c index f611f126f4..dc3aefde87 100644 --- a/mail/folder-browser.c +++ b/mail/folder-browser.c @@ -1016,8 +1016,10 @@ extern CamelFolder *drafts_folder, *sent_folder, *outbox_folder; gboolean folder_browser_is_drafts (FolderBrowser *fb) { - const GSList *accounts; - MailConfigAccount *account; + gboolean is_drafts = FALSE; + EAccountList *accounts; + EAccount *account; + EIterator *iter; g_return_val_if_fail (IS_FOLDER_BROWSER (fb), FALSE); @@ -1028,14 +1030,21 @@ folder_browser_is_drafts (FolderBrowser *fb) return TRUE; accounts = mail_config_get_accounts (); - while (accounts) { - account = accounts->data; - if (account->drafts_folder_uri && camel_store_uri_cmp(fb->folder->parent_store, account->drafts_folder_uri, fb->uri)) - return TRUE; - accounts = accounts->next; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + if (account->drafts_folder_uri && + camel_store_uri_cmp (fb->folder->parent_store, account->drafts_folder_uri, fb->uri)) { + is_drafts = TRUE; + break; + } + + e_iterator_next (iter); } - return FALSE; + g_object_unref (iter); + + return is_drafts; } /** @@ -1048,8 +1057,10 @@ folder_browser_is_drafts (FolderBrowser *fb) gboolean folder_browser_is_sent (FolderBrowser *fb) { - const GSList *accounts; - MailConfigAccount *account; + gboolean is_sent = FALSE; + EAccountList *accounts; + EAccount *account; + EIterator *iter; g_return_val_if_fail (IS_FOLDER_BROWSER (fb), FALSE); @@ -1060,14 +1071,21 @@ folder_browser_is_sent (FolderBrowser *fb) return TRUE; accounts = mail_config_get_accounts (); - while (accounts) { - account = accounts->data; - if (account->sent_folder_uri && camel_store_uri_cmp(fb->folder->parent_store, account->sent_folder_uri, fb->uri)) - return TRUE; - accounts = accounts->next; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + if (account->sent_folder_uri && + camel_store_uri_cmp (fb->folder->parent_store, account->sent_folder_uri, fb->uri)) { + is_sent = TRUE; + break; + } + + e_iterator_next (iter); } - return FALSE; + g_object_unref (iter); + + return is_sent; } /** diff --git a/mail/mail-account-editor.c b/mail/mail-account-editor.c index 848c1a7fd1..49fdba2ff8 100644 --- a/mail/mail-account-editor.c +++ b/mail/mail-account-editor.c @@ -132,9 +132,9 @@ editor_response_cb (GtkWidget *widget, int button, gpointer user_data) } static void -construct (MailAccountEditor *editor, MailConfigAccount *account, MailAccountsTab *dialog) +construct (MailAccountEditor *editor, EAccount *account, MailAccountsTab *dialog) { - MailConfigService *source = account->source; + EAccountService *source = account->source; editor->gui = mail_account_gui_new (account, dialog); @@ -162,11 +162,11 @@ construct (MailAccountEditor *editor, MailConfigAccount *account, MailAccountsTa } MailAccountEditor * -mail_account_editor_new (MailConfigAccount *account, GtkWindow *parent, MailAccountsTab *dialog) +mail_account_editor_new (EAccount *account, GtkWindow *parent, MailAccountsTab *dialog) { MailAccountEditor *new; - new = (MailAccountEditor *) g_object_new(mail_account_editor_get_type (), NULL); + new = (MailAccountEditor *) g_object_new (mail_account_editor_get_type (), NULL); gtk_window_set_transient_for ((GtkWindow *) new, parent); construct (new, account, dialog); diff --git a/mail/mail-account-editor.h b/mail/mail-account-editor.h index afb81513a9..2ee67f67cf 100644 --- a/mail/mail-account-editor.h +++ b/mail/mail-account-editor.h @@ -58,7 +58,7 @@ typedef struct { GtkType mail_account_editor_get_type (void); -MailAccountEditor *mail_account_editor_new (MailConfigAccount *account, GtkWindow *parent, MailAccountsTab *dialog); +MailAccountEditor *mail_account_editor_new (EAccount *account, GtkWindow *parent, MailAccountsTab *dialog); #ifdef __cplusplus } diff --git a/mail/mail-account-gui.c b/mail/mail-account-gui.c index da8b35074b..11587f886c 100644 --- a/mail/mail-account-gui.c +++ b/mail/mail-account-gui.c @@ -50,7 +50,7 @@ extern char *default_drafts_folder_uri, *default_sent_folder_uri; extern EvolutionShellClient *global_shell_client; -static void save_service (MailAccountGuiService *gsvc, GHashTable *extra_conf, MailConfigService *service); +static void save_service (MailAccountGuiService *gsvc, GHashTable *extra_conf, EAccountService *service); static void service_changed (GtkEntry *entry, gpointer user_data); struct { @@ -668,12 +668,12 @@ static void service_check_supported (GtkButton *button, gpointer user_data) { MailAccountGuiService *gsvc = user_data; - MailConfigService *service; + EAccountService *service; GList *authtypes = NULL; GtkWidget *authitem; GtkWidget *window; - service = g_new0 (MailConfigService, 1); + service = g_new0 (EAccountService, 1); /* This is sort of a hack, when checking for supported AUTH types we don't want to use whatever authtype is selected @@ -696,7 +696,8 @@ service_check_supported (GtkButton *button, gpointer user_data) g_list_free (authtypes); } - service_destroy (service); + g_free (service->url); + g_free (service); } @@ -1069,7 +1070,7 @@ mail_account_gui_folder_selector_button_new (char *widget_name, } static gboolean -setup_service (MailAccountGuiService *gsvc, MailConfigService *service) +setup_service (MailAccountGuiService *gsvc, EAccountService *service) { CamelURL *url = camel_url_new (service->url, NULL); gboolean has_auth = FALSE; @@ -1282,7 +1283,13 @@ sig_add_new_signature (GtkWidget *w, MailAccountGui *gui) static void setup_signatures (MailAccountGui *gui) { - gui->def_signature = gui->account->id->def_signature; + MailConfigSignature *sig; + GSList *signatures; + + signatures = mail_config_get_signature_list (); + sig = g_slist_nth_data (signatures, gui->account->id->def_signature); + + gui->def_signature = sig; gui->auto_signature = gui->account->id->auto_signature; gtk_option_menu_set_history (GTK_OPTION_MENU (gui->sig_option_menu), sig_gui_get_index (gui)); } @@ -1366,12 +1373,14 @@ prepare_signatures (MailAccountGui *gui) } MailAccountGui * -mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) +mail_account_gui_new (EAccount *account, MailAccountsTab *dialog) { const char *allowed_types[] = { "mail/*", NULL }; MailAccountGui *gui; GtkWidget *button; + g_object_ref (account); + gui = g_new0 (MailAccountGui, 1); gui->account = account; gui->dialog = dialog; @@ -1394,18 +1403,16 @@ mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog) prepare_signatures (gui); - if (account->id) { - if (account->id->name) - gtk_entry_set_text (gui->full_name, account->id->name); - if (account->id->address) - gtk_entry_set_text (gui->email_address, account->id->address); - if (account->id->reply_to) - gtk_entry_set_text (gui->reply_to, account->id->reply_to); - if (account->id->organization) - gtk_entry_set_text (gui->organization, account->id->organization); - - setup_signatures (gui); - } + if (account->id->name) + gtk_entry_set_text (gui->full_name, account->id->name); + if (account->id->address) + gtk_entry_set_text (gui->email_address, account->id->address); + if (account->id->reply_to) + gtk_entry_set_text (gui->reply_to, account->id->reply_to); + if (account->id->organization) + gtk_entry_set_text (gui->organization, account->id->organization); + + setup_signatures (gui); /* Source */ gui->source.provider_type = CAMEL_PROVIDER_STORE; @@ -1719,8 +1726,7 @@ mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top) } static void -save_service (MailAccountGuiService *gsvc, GHashTable *extra_config, - MailConfigService *service) +save_service (MailAccountGuiService *gsvc, GHashTable *extra_config, EAccountService *service) { CamelURL *url; const char *str; @@ -1798,7 +1804,7 @@ save_service (MailAccountGuiService *gsvc, GHashTable *extra_config, static void add_new_store (char *uri, CamelStore *store, void *user_data) { - const MailConfigAccount *account = user_data; + EAccount *account = user_data; EvolutionStorage *storage; if (store == NULL) @@ -1817,12 +1823,13 @@ add_new_store (char *uri, CamelStore *store, void *user_data) gboolean mail_account_gui_save (MailAccountGui *gui) { - MailConfigAccount *account = gui->account; - MailConfigAccount *old_account; + EAccount *account, *new; CamelProvider *provider = NULL; CamelURL *source_url = NULL, *url; + gboolean is_new = FALSE; const char *new_name; gboolean is_storage; + GSList *signatures; if (!mail_account_gui_identity_complete (gui, NULL) || !mail_account_gui_source_complete (gui, NULL) || @@ -1830,67 +1837,63 @@ mail_account_gui_save (MailAccountGui *gui) !mail_account_gui_management_complete (gui, NULL)) return FALSE; + new = gui->account; + /* this would happen at an inconvenient time in the druid, * but the druid performs its own check so this can't happen * here. */ new_name = gtk_entry_get_text (gui->account_name); - old_account = (MailConfigAccount *) mail_config_get_account_by_name (new_name); + account = mail_config_get_account_by_name (new_name); - if (old_account && old_account != account) { - e_notice (NULL, GTK_MESSAGE_ERROR, - _("You may not create two accounts with the same name.")); + if (account && account != new) { + e_notice (NULL, GTK_MESSAGE_ERROR, _("You may not create two accounts with the same name.")); return FALSE; } - /* make a copy of the old account for later use... */ - old_account = account_copy (account); + account = new; - g_free (account->name); - account->name = g_strdup (new_name); + new = e_account_new (); + new->name = g_strdup (new_name); + new->enabled = account->enabled; /* construct the identity */ - identity_destroy (account->id); - account->id = g_new0 (MailConfigIdentity, 1); - account->id->name = g_strdup (gtk_entry_get_text (gui->full_name)); - account->id->address = g_strdup (gtk_entry_get_text (gui->email_address)); - account->id->reply_to = g_strdup (gtk_entry_get_text (gui->reply_to)); - account->id->organization = g_strdup (gtk_entry_get_text (gui->organization)); + new->id->name = g_strdup (gtk_entry_get_text (gui->full_name)); + new->id->address = g_strdup (gtk_entry_get_text (gui->email_address)); + new->id->reply_to = g_strdup (gtk_entry_get_text (gui->reply_to)); + new->id->organization = g_strdup (gtk_entry_get_text (gui->organization)); /* signatures */ - account->id->def_signature = gui->def_signature; - account->id->auto_signature = gui->auto_signature; - - service_destroy (account->source); - account->source = g_new0 (MailConfigService, 1); - save_service (&gui->source, gui->extra_config, account->source); - if (account->source->url) { - provider = camel_session_get_provider (session, account->source->url, NULL); - source_url = provider ? camel_url_new (account->source->url, NULL) : NULL; + signatures = mail_config_get_signature_list (); + new->id->def_signature = g_slist_index (signatures, gui->def_signature); + new->id->auto_signature = gui->auto_signature; + + /* source */ + save_service (&gui->source, gui->extra_config, new->source); + if (new->source->url) { + provider = camel_session_get_provider (session, new->source->url, NULL); + source_url = provider ? camel_url_new (new->source->url, NULL) : NULL; } - account->source->auto_check = gtk_toggle_button_get_active (gui->source_auto_check); - if (account->source->auto_check) - account->source->auto_check_time = gtk_spin_button_get_value_as_int (gui->source_auto_check_min); + new->source->auto_check = gtk_toggle_button_get_active (gui->source_auto_check); + if (new->source->auto_check) + new->source->auto_check_time = gtk_spin_button_get_value_as_int (gui->source_auto_check_min); - service_destroy (account->transport); - account->transport = g_new0 (MailConfigService, 1); + /* transport */ if (CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (gui->transport.provider)) { /* The transport URI is the same as the source URI. */ - save_service (&gui->source, gui->extra_config, account->transport); + save_service (&gui->source, gui->extra_config, new->transport); } else - save_service (&gui->transport, NULL, account->transport); + save_service (&gui->transport, NULL, new->transport); /* Check to make sure that the Drafts folder uri is "valid" before assigning it */ url = source_url && gui->drafts_folder_uri ? camel_url_new (gui->drafts_folder_uri, NULL) : NULL; if (mail_config_get_account_by_source_url (gui->drafts_folder_uri) || (url && provider->url_equal (source_url, url))) { - g_free (account->drafts_folder_uri); - account->drafts_folder_uri = g_strdup (gui->drafts_folder_uri); + new->drafts_folder_uri = g_strdup (gui->drafts_folder_uri); } else { /* assign defaults - the uri is unknown to us (probably pointed to an old source url) */ - g_free (account->drafts_folder_uri); - account->drafts_folder_uri = g_strdup (default_drafts_folder_uri); + new->drafts_folder_uri = g_strdup (default_drafts_folder_uri); } if (url) @@ -1900,12 +1903,10 @@ mail_account_gui_save (MailAccountGui *gui) url = source_url && gui->sent_folder_uri ? camel_url_new (gui->sent_folder_uri, NULL) : NULL; if (mail_config_get_account_by_source_url (gui->sent_folder_uri) || (url && provider->url_equal (source_url, url))) { - g_free (account->sent_folder_uri); - account->sent_folder_uri = g_strdup (gui->sent_folder_uri); + new->sent_folder_uri = g_strdup (gui->sent_folder_uri); } else { /* assign defaults - the uri is unknown to us (probably pointed to an old source url) */ - g_free (account->sent_folder_uri); - account->sent_folder_uri = g_strdup (default_sent_folder_uri); + new->sent_folder_uri = g_strdup (default_sent_folder_uri); } if (url) @@ -1914,44 +1915,46 @@ mail_account_gui_save (MailAccountGui *gui) if (source_url) camel_url_free (source_url); - account->always_cc = gtk_toggle_button_get_active (gui->always_cc); - account->cc_addrs = g_strdup (gtk_entry_get_text (gui->cc_addrs)); - account->always_bcc = gtk_toggle_button_get_active (gui->always_bcc); - account->bcc_addrs = g_strdup (gtk_entry_get_text (gui->bcc_addrs)); + new->always_cc = gtk_toggle_button_get_active (gui->always_cc); + new->cc_addrs = g_strdup (gtk_entry_get_text (gui->cc_addrs)); + new->always_bcc = gtk_toggle_button_get_active (gui->always_bcc); + new->bcc_addrs = g_strdup (gtk_entry_get_text (gui->bcc_addrs)); - g_free (account->pgp_key); - account->pgp_key = g_strdup (gtk_entry_get_text (gui->pgp_key)); - account->pgp_encrypt_to_self = gtk_toggle_button_get_active (gui->pgp_encrypt_to_self); - account->pgp_always_sign = gtk_toggle_button_get_active (gui->pgp_always_sign); - account->pgp_no_imip_sign = gtk_toggle_button_get_active (gui->pgp_no_imip_sign); - account->pgp_always_trust = gtk_toggle_button_get_active (gui->pgp_always_trust); + new->pgp_key = g_strdup (gtk_entry_get_text (gui->pgp_key)); + new->pgp_encrypt_to_self = gtk_toggle_button_get_active (gui->pgp_encrypt_to_self); + new->pgp_always_sign = gtk_toggle_button_get_active (gui->pgp_always_sign); + new->pgp_no_imip_sign = gtk_toggle_button_get_active (gui->pgp_no_imip_sign); + new->pgp_always_trust = gtk_toggle_button_get_active (gui->pgp_always_trust); #if defined (HAVE_NSS) && defined (SMIME_SUPPORTED) - g_free (account->smime_key); - account->smime_key = g_strdup (gtk_entry_get_text (gui->smime_key)); - account->smime_encrypt_to_self = gtk_toggle_button_get_active (gui->smime_encrypt_to_self); - account->smime_always_sign = gtk_toggle_button_get_active (gui->smime_always_sign); + new->smime_key = g_strdup (gtk_entry_get_text (gui->smime_key)); + new->smime_encrypt_to_self = gtk_toggle_button_get_active (gui->smime_encrypt_to_self); + new->smime_always_sign = gtk_toggle_button_get_active (gui->smime_always_sign); #endif /* HAVE_NSS && SMIME_SUPPORTED */ is_storage = provider && (provider->flags & CAMEL_PROVIDER_IS_STORAGE) && !(provider->flags & CAMEL_PROVIDER_IS_EXTERNAL); if (!mail_config_find_account (account)) { - /* this is a new account so it it to our account-list */ - mail_config_add_account (account); - } else if (old_account->source && old_account->source->url) { + /* this is a new account so add it to our account-list */ + is_new = TRUE; + } else if (account->source->url) { /* this means the account was edited - if the old and new source urls are not identical, replace the old storage with the new storage */ #define sources_equal(old,new) (new->url && !strcmp (old->url, new->url)) - if (!sources_equal (old_account->source, account->source)) { + if (!sources_equal (account->source, new->source)) { /* Remove the old storage from the folder-tree */ - mail_remove_storage_by_uri (old_account->source->url); + mail_remove_storage_by_uri (account->source->url); } } - /* destroy the copy of the old account */ - account_destroy (old_account); + /* update the old account with the new settings */ + e_account_import (account, new); + g_object_unref (new); + + if (is_new) + mail_config_add_account (account); /* if the account provider is something we can stick in the folder-tree and not added by some other @@ -1976,10 +1979,13 @@ mail_account_gui_destroy (MailAccountGui *gui) { if (gui->dialog) mail_config_signature_unregister_client ((MailConfigSignatureClient) sig_event_client, gui); - + g_object_unref (gui->xml); + g_object_unref (gui->account); + if (gui->extra_config) g_hash_table_destroy (gui->extra_config); + g_free (gui->drafts_folder_uri); g_free (gui->sent_folder_uri); g_free (gui); diff --git a/mail/mail-account-gui.h b/mail/mail-account-gui.h index 451f16da3e..74c00d5dc0 100644 --- a/mail/mail-account-gui.h +++ b/mail/mail-account-gui.h @@ -59,7 +59,7 @@ typedef struct { typedef struct { GtkWidget *top; - MailConfigAccount *account; + EAccount *account; MailAccountsTab *dialog; GladeXML *xml; @@ -115,7 +115,7 @@ typedef struct { } MailAccountGui; -MailAccountGui *mail_account_gui_new (MailConfigAccount *account, MailAccountsTab *dialog); +MailAccountGui *mail_account_gui_new (EAccount *account, MailAccountsTab *dialog); void mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top); gboolean mail_account_gui_save (MailAccountGui *gui); void mail_account_gui_destroy (MailAccountGui *gui); diff --git a/mail/mail-accounts.c b/mail/mail-accounts.c index 21ce6dd6cc..afcc22f83b 100644 --- a/mail/mail-accounts.c +++ b/mail/mail-accounts.c @@ -168,8 +168,8 @@ account_edit_clicked (GtkButton *button, gpointer user_data) MailAccountsTab *prefs = (MailAccountsTab *) user_data; if (prefs->editor == NULL) { - MailConfigAccount *account = NULL; GtkTreeSelection *selection; + EAccount *account = NULL; GtkTreeModel *model; GtkTreeIter iter; @@ -195,11 +195,11 @@ static void account_delete_clicked (GtkButton *button, gpointer user_data) { MailAccountsTab *prefs = user_data; - const MailConfigAccount *account = NULL; GtkTreeSelection *selection; + EAccount *account = NULL; + EAccountList *accounts; GtkTreeModel *model; GtkWidget *confirm; - const GSList *list; GtkTreeIter iter; int ans; @@ -238,7 +238,8 @@ account_delete_clicked (GtkButton *button, gpointer user_data) mail_remove_storage_by_uri (account->source->url); /* remove it from the config file */ - list = mail_config_remove_account ((MailConfigAccount *) account); + mail_config_remove_account (account); + accounts = mail_config_get_accounts (); mail_config_write (); @@ -246,7 +247,7 @@ account_delete_clicked (GtkButton *button, gpointer user_data) gtk_list_store_remove ((GtkListStore *) model, &iter); - len = list ? g_slist_length ((GSList *) list) : 0; + len = e_list_length ((EList *) accounts); if (len > 0) { gtk_tree_selection_select_iter (selection, &iter); } else { @@ -262,8 +263,8 @@ static void account_default_clicked (GtkButton *button, gpointer user_data) { MailAccountsTab *prefs = user_data; - const MailConfigAccount *account = NULL; GtkTreeSelection *selection; + EAccount *account = NULL; GtkTreeModel *model; GtkTreeIter iter; int row; @@ -285,8 +286,8 @@ static void account_able_clicked (GtkButton *button, gpointer user_data) { MailAccountsTab *prefs = user_data; - MailConfigAccount *account = NULL; GtkTreeSelection *selection; + EAccount *account = NULL; GtkTreeModel *model; GtkTreeIter iter; @@ -295,8 +296,8 @@ account_able_clicked (GtkButton *button, gpointer user_data) gtk_tree_model_get (model, &iter, 3, &account, -1); account->enabled = !account->enabled; gtk_list_store_set ((GtkListStore *) model, &iter, 0, account->enabled, -1); - - gtk_button_set_label (prefs->mail_able, account->enabled?_("Disable"):_("Enable")); + + gtk_button_set_label (prefs->mail_able, account->enabled ? _("Disable") : _("Enable")); } if (account) { @@ -325,7 +326,7 @@ account_double_click (GtkTreeView *treeview, GtkTreePath *path, static void account_cursor_change (GtkTreeSelection *selection, MailAccountsTab *prefs) { - const MailConfigAccount *account; + EAccount *account = NULL; GtkTreeModel *model; GtkTreeIter iter; int state; @@ -350,11 +351,12 @@ account_cursor_change (GtkTreeSelection *selection, MailAccountsTab *prefs) static void mail_accounts_load (MailAccountsTab *prefs) { - const MailConfigAccount *default_account; + EAccount *default_account; + EAccountList *accounts; GtkListStore *model; - const GSList *node; GtkTreeIter iter; char *name, *val; + EIterator *node; int row = 0; model = (GtkListStore *) gtk_tree_view_get_model (prefs->table); @@ -362,12 +364,13 @@ mail_accounts_load (MailAccountsTab *prefs) default_account = mail_config_get_default_account (); - node = mail_config_get_accounts (); - while (node) { - const MailConfigAccount *account; + accounts = mail_config_get_accounts (); + node = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (node)) { + EAccount *account; CamelURL *url; - account = node->data; + account = (EAccount *) e_iterator_get (node); url = account->source && account->source->url ? camel_url_new (account->source->url, NULL) : NULL; @@ -391,9 +394,12 @@ mail_accounts_load (MailAccountsTab *prefs) if (url) camel_url_free (url); - node = node->next; row++; + + e_iterator_next (node); } + + g_object_unref (node); } diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 847e5bd39a..07ccf89000 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -205,7 +205,7 @@ configure_mail (FolderBrowser *fb) static gboolean check_send_configuration (FolderBrowser *fb) { - const MailConfigAccount *account; + EAccount *account; GtkWidget *dialog; if (!mail_config_is_configured ()) { @@ -230,7 +230,7 @@ check_send_configuration (FolderBrowser *fb) } /* Check for a transport */ - if (!account->transport || !account->transport->url) { + if (!account->transport->url) { e_notice (FB_WINDOW (fb), GTK_MESSAGE_WARNING, _("You need to configure a mail transport\n" "before you can compose mail.")); @@ -406,13 +406,13 @@ composer_send_queued_cb (CamelFolder *folder, CamelMimeMessage *msg, CamelMessag static CamelMimeMessage * composer_get_message (EMsgComposer *composer, gboolean post, gboolean save_html_object_data) { - const MailConfigAccount *account; CamelMimeMessage *message = NULL; EDestination **recipients, **recipients_bcc; gboolean send_html, confirm_html; int hidden = 0, shown = 0; int num = 0, num_bcc = 0; GConfClient *gconf; + EAccount *account; char *subject; int i; @@ -696,11 +696,11 @@ composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer user_data) { extern char *default_drafts_folder_uri; extern CamelFolder *drafts_folder; - CamelMimeMessage *msg; - CamelMessageInfo *info; - const MailConfigAccount *account; struct _save_draft_info *sdi; CamelFolder *folder = NULL; + CamelMimeMessage *msg; + CamelMessageInfo *info; + EAccount *account; account = e_msg_composer_get_preferred_account (composer); if (account && account->drafts_folder_uri && @@ -744,7 +744,7 @@ composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer user_data) } static GtkWidget * -create_msg_composer (const MailConfigAccount *account, gboolean post, const char *url) +create_msg_composer (EAccount *account, gboolean post, const char *url) { EMsgComposer *composer; GConfClient *gconf; @@ -779,10 +779,10 @@ create_msg_composer (const MailConfigAccount *account, gboolean post, const char void compose_msg (GtkWidget *widget, gpointer user_data) { - const MailConfigAccount *account; FolderBrowser *fb = FOLDER_BROWSER (user_data); struct _composer_callback_data *ccd; GtkWidget *composer; + EAccount *account; if (FOLDER_BROWSER_IS_DESTROYED (fb) || !check_send_configuration (fb)) return; @@ -833,10 +833,10 @@ send_to_url (const char *url) static GList * list_add_addresses (GList *list, const CamelInternetAddress *cia, GHashTable *account_hash, - GHashTable *rcpt_hash, const MailConfigAccount **me) + GHashTable *rcpt_hash, EAccount **me) { - const MailConfigAccount *account; const char *name, *addr; + EAccount *account; int i; for (i = 0; camel_internet_address_get (cia, i, &name, &addr); i++) { @@ -862,10 +862,10 @@ list_add_addresses (GList *list, const CamelInternetAddress *cia, GHashTable *ac return list; } -static const MailConfigAccount * +static EAccount * guess_me (const CamelInternetAddress *to, const CamelInternetAddress *cc, GHashTable *account_hash) { - const MailConfigAccount *account = NULL; + EAccount *account = NULL; const char *addr; int i; @@ -894,12 +894,12 @@ guess_me (const CamelInternetAddress *to, const CamelInternetAddress *cc, GHashT return account; } -static const MailConfigAccount * -guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddress *cc, const GSList *accounts) +static EAccount * +guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddress *cc, EAccountList *accounts) { - const MailConfigAccount *account, *def; + EAccount *account, *def; GHashTable *account_hash; - const GSList *l; + EIterator *iter; account_hash = g_hash_table_new (g_strcase_hash, g_strcase_equal); @@ -909,12 +909,12 @@ guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddre g_hash_table_insert (account_hash, (char *) def->id->address, (void *) def); } - l = accounts; - while (l) { - account = l->data; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); if (account->id->address) { - const MailConfigAccount *acnt; + EAccount *acnt; /* Accounts with identical email addresses that are enabled * take precedence over the accounts that aren't. If all @@ -932,9 +932,11 @@ guess_me_from_accounts (const CamelInternetAddress *to, const CamelInternetAddre g_hash_table_insert (account_hash, (char *) account->id->address, (void *) account); } - l = l->next; + e_iterator_next (iter); } + g_object_unref (iter); + account = guess_me (to, cc, account_hash); g_hash_table_destroy (account_hash); @@ -970,8 +972,8 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char const char *name = NULL, *address = NULL, *source = NULL; const char *message_id, *references, *mlist = NULL; char *text = NULL, *subject, format[256]; - const MailConfigAccount *def, *account, *me = NULL; - const GSList *l, *accounts = NULL; + EAccount *def, *account, *me = NULL; + EAccountList *accounts = NULL; GHashTable *account_hash = NULL; CamelMessageInfo *info = NULL; GList *to = NULL, *cc = NULL; @@ -979,6 +981,7 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char EMsgComposer *composer; CamelMimePart *part; GConfClient *gconf; + EIterator *iter; time_t date; char *url; @@ -1009,12 +1012,12 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char g_hash_table_insert (account_hash, (char *) def->id->address, (void *) def); } - l = accounts; - while (l) { - account = l->data; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); if (account->id->address) { - const MailConfigAccount *acnt; + EAccount *acnt; /* Accounts with identical email addresses that are enabled * take precedence over the accounts that aren't. If all @@ -1032,9 +1035,11 @@ mail_generate_reply (CamelFolder *folder, CamelMimeMessage *message, const char g_hash_table_insert (account_hash, (char *) account->id->address, (void *) account); } - l = l->next; + e_iterator_next (iter); } + g_object_unref (iter); + to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO); cc_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC); mail_ignore_address (composer, to_addrs); @@ -1337,13 +1342,13 @@ enumerate_msg (MessageList *ml, const char *uid, gpointer data) static EMsgComposer * forward_get_composer (CamelMimeMessage *message, const char *subject) { - const MailConfigAccount *account = NULL; struct _composer_callback_data *ccd; + EAccount *account = NULL; EMsgComposer *composer; if (message) { const CamelInternetAddress *to_addrs, *cc_addrs; - const GSList *accounts = NULL; + EAccountList *accounts; accounts = mail_config_get_accounts (); to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO); @@ -1544,10 +1549,10 @@ post_reply (GtkWidget *widget, gpointer user_data) static EMsgComposer * redirect_get_composer (CamelMimeMessage *message) { - const MailConfigAccount *account = NULL; const CamelInternetAddress *to_addrs, *cc_addrs; - const GSList *accounts = NULL; struct _composer_callback_data *ccd; + EAccountList *accounts = NULL; + EAccount *account = NULL; EMsgComposer *composer; g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); @@ -3151,12 +3156,13 @@ empty_trash_expunged_cb (CamelFolder *folder, void *data) void empty_trash (BonoboUIComponent *uih, void *user_data, const char *path) { - MailConfigAccount *account; CamelProvider *provider; - const GSList *accounts; + EAccountList *accounts; CamelFolder *vtrash; FolderBrowser *fb; CamelException ex; + EAccount *account; + EIterator *iter; fb = user_data ? FOLDER_BROWSER (user_data) : NULL; @@ -3167,11 +3173,12 @@ empty_trash (BonoboUIComponent *uih, void *user_data, const char *path) /* expunge all remote stores */ accounts = mail_config_get_accounts (); - while (accounts) { - account = accounts->data; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); /* make sure this is a valid source */ - if (account->source && account->enabled && account->source->url) { + if (account->enabled && account->source->url) { provider = camel_session_get_provider (session, account->source->url, &ex); if (provider) { /* make sure this store is a remote store */ @@ -3188,14 +3195,16 @@ empty_trash (BonoboUIComponent *uih, void *user_data, const char *path) /* clear the exception for the next round */ camel_exception_clear (&ex); } - accounts = accounts->next; + + e_iterator_next (iter); } + g_object_unref (iter); + /* Now empty the local trash folder */ vtrash = mail_tool_get_trash ("file:/", TRUE, &ex); - if (vtrash) { + if (vtrash) mail_expunge_folder (vtrash, empty_trash_expunged_cb, NULL); - } camel_exception_clear (&ex); } diff --git a/mail/mail-config-druid.c b/mail/mail-config-druid.c index 639d2e31d0..c7791e3646 100644 --- a/mail/mail-config-druid.c +++ b/mail/mail-config-druid.c @@ -74,7 +74,7 @@ typedef enum { typedef struct { MailAccountGui *gui; - MailConfigAccount *account; + EAccount *account; EvolutionWizard *wizard; gboolean identity_copied; @@ -135,7 +135,7 @@ mail_config_druid_destroy (GtkObject *obj) bonobo_object_unref (BONOBO_OBJECT (druid->listener)); } - ((GtkObjectClass *)(parent_class))->destroy(obj); + ((GtkObjectClass *)(parent_class))->destroy(obj); } @@ -460,26 +460,27 @@ management_changed (GtkWidget *widget, gpointer data) gtk_widget_grab_focus (GTK_WIDGET (gui->gui->account_name)); } -static MailConfigAccount * +static EAccount * make_account (void) { - MailConfigAccount *account; const char *name, *user; + EAccountService *xport; struct utsname uts; + EAccount *account; - account = g_new0 (MailConfigAccount, 1); + account = e_account_new (); account->enabled = TRUE; - account->uid = e_account_gen_uid (); - account->id = g_new0 (MailConfigIdentity, 1); name = g_get_real_name (); account->id->name = g_strdup (name); user = g_get_user_name (); if (user && !uname (&uts) && strchr (uts.nodename, '.')) account->id->address = g_strdup_printf ("%s@%s", user, uts.nodename); - if (mail_config_get_default_transport ()) - account->transport = service_copy (mail_config_get_default_transport ()); + if ((xport = mail_config_get_default_transport ())) { + account->transport->url = g_strdup (xport->url); + account->transport->save_passwd = xport->save_passwd; + } return account; } @@ -763,15 +764,15 @@ management_activate_cb (GtkEntry *ent, gpointer user_data) static BonoboControl * get_fn (EvolutionWizard *wizard, - int page_num, - void *closure) + int page_num, + void *closure) { - MailConfigWizard *gui = closure; - BonoboControl *control; - GtkWidget *vbox, *widget; + MailConfigWizard *gui = closure; + BonoboControl *control; + GtkWidget *vbox, *widget; static gboolean first_time = TRUE; - if (gui->gui == NULL) { + if (gui->gui == NULL) { if (gui->account == NULL) { gui->account = make_account (); g_object_set_data ((GObject *) wizard, "account-data", gui->account); @@ -784,7 +785,7 @@ get_fn (EvolutionWizard *wizard, G_CALLBACK (management_changed), gui); g_signal_connect (gui->gui->full_name, "changed", G_CALLBACK (identity_changed), gui); - g_signal_connect (gui->gui->email_address, "changed", + g_signal_connect (gui->gui->email_address, "changed", G_CALLBACK (identity_changed), gui); g_signal_connect (gui->gui->reply_to,"changed", G_CALLBACK (identity_changed), gui); @@ -806,11 +807,11 @@ get_fn (EvolutionWizard *wizard, g_signal_connect (gui->gui->full_name, "activate", G_CALLBACK (identity_activate_cb), gui); - g_signal_connect (gui->gui->email_address, "activate", + g_signal_connect (gui->gui->email_address, "activate", G_CALLBACK (identity_activate_cb), gui); - g_signal_connect (gui->gui->reply_to,"activate", + g_signal_connect (gui->gui->reply_to,"activate", G_CALLBACK (identity_activate_cb), gui); - g_signal_connect (gui->gui->organization, "activate", + g_signal_connect (gui->gui->organization, "activate", G_CALLBACK (identity_activate_cb), gui); g_signal_connect (gui->gui->source.hostname, "activate", @@ -825,12 +826,12 @@ get_fn (EvolutionWizard *wizard, g_signal_connect (gui->gui->transport.username, "activate", G_CALLBACK (transport_activate_cb), gui); first_time = TRUE; - } + } - /* Fill in the druid pages */ + /* Fill in the druid pages */ vbox = gtk_vbox_new (FALSE, 0); - switch (page_num) { - case 0: + switch (page_num) { + case 0: widget = create_label ("identity_html"); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); widget = glade_xml_get_widget (gui->gui->xml, "identity_required_frame"); @@ -839,89 +840,89 @@ get_fn (EvolutionWizard *wizard, widget = glade_xml_get_widget (gui->gui->xml, "identity_optional_frame"); gtk_widget_reparent (widget, vbox); gtk_box_set_child_packing (GTK_BOX (vbox), widget, FALSE, FALSE, 0, GTK_PACK_START); - break; - case 1: + break; + case 1: widget = create_label ("source_html"); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); widget = glade_xml_get_widget (gui->gui->xml, "source_vbox"); - gtk_widget_reparent (widget, vbox); + gtk_widget_reparent (widget, vbox); gtk_widget_show (widget); - break; - case 2: + break; + case 2: widget = create_label ("extra_html"); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); - widget = glade_xml_get_widget (gui->gui->xml, "extra_vbox"); - gtk_widget_reparent (widget, vbox); - break; - case 3: + widget = glade_xml_get_widget (gui->gui->xml, "extra_vbox"); + gtk_widget_reparent (widget, vbox); + break; + case 3: widget = create_label ("transport_html"); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); - widget = glade_xml_get_widget (gui->gui->xml, "transport_vbox"); - gtk_widget_reparent (widget, vbox); + widget = glade_xml_get_widget (gui->gui->xml, "transport_vbox"); + gtk_widget_reparent (widget, vbox); gtk_widget_show (widget); - break; - case 4: + break; + case 4: widget = glade_xml_get_widget (gui->gui->xml, "management_frame"); gtk_widget_reparent (widget, vbox); break; - default: - return NULL; - } + default: + return NULL; + } - gtk_widget_show (vbox); - control = bonobo_control_new (vbox); + gtk_widget_show (vbox); + control = bonobo_control_new (vbox); if (first_time) { mail_account_gui_setup (gui->gui, NULL); first_time = FALSE; } - return control; + return control; } typedef gboolean (*NextFunc)(EvolutionWizard *wizard, gpointer data); typedef void (*PrepFunc)(EvolutionWizard *wizard, gpointer data); static struct { - NextFunc next_func; - PrepFunc prepare_func; - NextFunc back_func; - GtkSignalFunc finish_func; - GtkSignalFunc help_func; + NextFunc next_func; + PrepFunc prepare_func; + NextFunc back_func; + GtkSignalFunc finish_func; + GtkSignalFunc help_func; } wizard_pages[] = { - { identity_next, - identity_prepare, - NULL, - G_CALLBACK (NULL), - G_CALLBACK (NULL) }, - { source_next, - source_prepare, - NULL, - G_CALLBACK (NULL), - G_CALLBACK (NULL) }, - { NULL, - extra_prepare, - NULL, - G_CALLBACK (NULL), - G_CALLBACK (NULL) }, - { transport_next, - transport_prepare, - transport_back, - G_CALLBACK (NULL), - G_CALLBACK (NULL) }, - { NULL, - management_prepare, - NULL, - G_CALLBACK (NULL), - G_CALLBACK (NULL) } + { identity_next, + identity_prepare, + NULL, + G_CALLBACK (NULL), + G_CALLBACK (NULL) }, + { source_next, + source_prepare, + NULL, + G_CALLBACK (NULL), + G_CALLBACK (NULL) }, + { NULL, + extra_prepare, + NULL, + G_CALLBACK (NULL), + G_CALLBACK (NULL) }, + { transport_next, + transport_prepare, + transport_back, + G_CALLBACK (NULL), + G_CALLBACK (NULL) }, + { NULL, + management_prepare, + NULL, + G_CALLBACK (NULL), + G_CALLBACK (NULL) } }; static void wizard_next_cb (EvolutionWizard *wizard, - int page_num, - MailConfigWizard *gui) + int page_num, + MailConfigWizard *gui) { - if (wizard_pages[page_num].next_func == NULL + if (wizard_pages[page_num].next_func == NULL || !(wizard_pages[page_num].next_func (wizard, gui))) { if (page_num < 5-1) { evolution_wizard_set_page(wizard, page_num+1, NULL); @@ -931,26 +932,26 @@ wizard_next_cb (EvolutionWizard *wizard, static void wizard_prepare_cb (EvolutionWizard *wizard, - int page_num, - MailConfigWizard *gui) + int page_num, + MailConfigWizard *gui) { - if (wizard_pages[page_num].prepare_func != NULL) { - wizard_pages[page_num].prepare_func (wizard, gui); - } + if (wizard_pages[page_num].prepare_func != NULL) { + wizard_pages[page_num].prepare_func (wizard, gui); + } } static void wizard_back_cb (EvolutionWizard *wizard, - int page_num, - MailConfigWizard *gui) + int page_num, + MailConfigWizard *gui) { if (page_num >= 5) evolution_wizard_set_page(wizard, 4, NULL); - else if (wizard_pages[page_num].back_func == NULL + else if (wizard_pages[page_num].back_func == NULL || !(wizard_pages[page_num].back_func (wizard, gui))) { if (page_num > 0) evolution_wizard_set_page(wizard, page_num-1, NULL); - } + } } static void @@ -974,8 +975,8 @@ wizard_finish_cb (EvolutionWizard *wizard, static void wizard_cancel_cb (EvolutionWizard *wizard, - int page_num, - MailConfigWizard *gui) + int page_num, + MailConfigWizard *gui) { mail_account_gui_destroy (gui->gui); gui->gui = NULL; @@ -983,8 +984,8 @@ wizard_cancel_cb (EvolutionWizard *wizard, static void wizard_help_cb (EvolutionWizard *wizard, - int page_num, - MailConfigWizard *gui) + int page_num, + MailConfigWizard *gui) { } @@ -1001,34 +1002,34 @@ wizard_free (MailConfigWizard *wizard) } BonoboObject * -evolution_mail_config_wizard_new(void) +evolution_mail_config_wizard_new (void) { EvolutionWizard *wizard; - MailConfigAccount *account; - MailConfigWizard *gui; + MailConfigWizard *gui; + EAccount *account; - account = make_account (); + account = make_account (); - gui = g_new (MailConfigWizard, 1); + gui = g_new (MailConfigWizard, 1); gui->gui = NULL; - gui->account = account; + gui->account = account; gui->identity_copied = FALSE; gui->last_source = NULL; gui->page = MAIL_CONFIG_WIZARD_PAGE_NONE; - wizard = evolution_wizard_new (get_fn, 5, gui); + wizard = evolution_wizard_new (get_fn, 5, gui); account_wizard = wizard; g_object_set_data_full ((GObject *) account_wizard, "account-data", gui, (GDestroyNotify) wizard_free); gui->wizard = wizard; - g_signal_connect (wizard, "next", G_CALLBACK (wizard_next_cb), gui); - g_signal_connect (wizard, "prepare", G_CALLBACK (wizard_prepare_cb), gui); - g_signal_connect (wizard, "back", G_CALLBACK (wizard_back_cb), gui); - g_signal_connect (wizard, "finish", G_CALLBACK (wizard_finish_cb), gui); - g_signal_connect (wizard, "cancel", G_CALLBACK (wizard_cancel_cb), gui); - g_signal_connect (wizard, "help", G_CALLBACK (wizard_help_cb), gui); + g_signal_connect (wizard, "next", G_CALLBACK (wizard_next_cb), gui); + g_signal_connect (wizard, "prepare", G_CALLBACK (wizard_prepare_cb), gui); + g_signal_connect (wizard, "back", G_CALLBACK (wizard_back_cb), gui); + g_signal_connect (wizard, "finish", G_CALLBACK (wizard_finish_cb), gui); + g_signal_connect (wizard, "cancel", G_CALLBACK (wizard_cancel_cb), gui); + g_signal_connect (wizard, "help", G_CALLBACK (wizard_help_cb), gui); - return BONOBO_OBJECT (wizard); + return BONOBO_OBJECT (wizard); } diff --git a/mail/mail-config.c b/mail/mail-config.c index 54ffbb1d31..b370c96932 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -54,7 +54,6 @@ #include #include -#include #include #include #include "mail.h" @@ -78,7 +77,7 @@ typedef struct { gboolean corrupt; - GSList *accounts; + EAccountList *accounts; guint accounts_notify_id; GHashTable *threaded_hash; @@ -99,9 +98,6 @@ static guint config_write_timeout = 0; #define MAIL_CONFIG_IID "OAFIID:GNOME_Evolution_MailConfig_Factory" -/* Prototypes */ -static void config_read (void); - /* signatures */ MailConfigSignature * signature_copy (const MailConfigSignature *sig) @@ -130,145 +126,6 @@ signature_destroy (MailConfigSignature *sig) g_free (sig); } -/* Identity */ -MailConfigIdentity * -identity_copy (const MailConfigIdentity *id) -{ - MailConfigIdentity *new; - - g_return_val_if_fail (id != NULL, NULL); - - new = g_new0 (MailConfigIdentity, 1); - new->name = g_strdup (id->name); - new->address = g_strdup (id->address); - new->reply_to = g_strdup (id->reply_to); - new->organization = g_strdup (id->organization); - new->def_signature = id->def_signature; - new->auto_signature = id->auto_signature; - - return new; -} - -void -identity_destroy (MailConfigIdentity *id) -{ - if (!id) - return; - - g_free (id->name); - g_free (id->address); - g_free (id->reply_to); - g_free (id->organization); - - g_free (id); -} - -/* Service */ -MailConfigService * -service_copy (const MailConfigService *source) -{ - MailConfigService *new; - - g_return_val_if_fail (source != NULL, NULL); - - new = g_new0 (MailConfigService, 1); - new->url = g_strdup (source->url); - new->keep_on_server = source->keep_on_server; - new->auto_check = source->auto_check; - new->auto_check_time = source->auto_check_time; - new->save_passwd = source->save_passwd; - - return new; -} - -void -service_destroy (MailConfigService *source) -{ - if (!source) - return; - - g_free (source->url); - - g_free (source); -} - -void -service_destroy_each (gpointer item, gpointer data) -{ - service_destroy ((MailConfigService *) item); -} - -/* Account */ -MailConfigAccount * -account_copy (const MailConfigAccount *account) -{ - MailConfigAccount *new; - - g_return_val_if_fail (account != NULL, NULL); - - new = g_new0 (MailConfigAccount, 1); - new->name = g_strdup (account->name); - new->uid = e_account_gen_uid (); - - new->enabled = account->enabled; - - new->id = identity_copy (account->id); - new->source = service_copy (account->source); - new->transport = service_copy (account->transport); - - new->drafts_folder_uri = g_strdup (account->drafts_folder_uri); - new->sent_folder_uri = g_strdup (account->sent_folder_uri); - - new->always_cc = account->always_cc; - new->cc_addrs = g_strdup (account->cc_addrs); - new->always_bcc = account->always_bcc; - new->bcc_addrs = g_strdup (account->bcc_addrs); - - new->pgp_key = g_strdup (account->pgp_key); - new->pgp_encrypt_to_self = account->pgp_encrypt_to_self; - new->pgp_always_sign = account->pgp_always_sign; - new->pgp_no_imip_sign = account->pgp_no_imip_sign; - new->pgp_always_trust = account->pgp_always_trust; - - new->smime_key = g_strdup (account->smime_key); - new->smime_encrypt_to_self = account->smime_encrypt_to_self; - new->smime_always_sign = account->smime_always_sign; - - return new; -} - -void -account_destroy (MailConfigAccount *account) -{ - if (!account) - return; - - g_free (account->name); - g_free (account->uid); - - identity_destroy (account->id); - service_destroy (account->source); - service_destroy (account->transport); - - g_free (account->drafts_folder_uri); - g_free (account->sent_folder_uri); - - g_free (account->cc_addrs); - g_free (account->bcc_addrs); - - g_free (account->pgp_key); - g_free (account->smime_key); - - g_free (account); -} - -void -account_destroy_each (gpointer item, gpointer data) -{ - account_destroy ((MailConfigAccount *) item); -} - - static gboolean xml_get_bool (xmlNodePtr node, const char *name) { @@ -342,363 +199,10 @@ lookup_signature (int id) return NULL; } -static MailConfigAccount * -account_new_from_xml (char *in) -{ - MailConfigAccount *account; - xmlNodePtr node, cur; - xmlDocPtr doc; - char *buf; - - if (!(doc = xmlParseDoc (in))) - return NULL; - - node = doc->children; - if (strcmp (node->name, "account") != 0) { - xmlFreeDoc (doc); - return NULL; - } - - account = g_new0 (MailConfigAccount, 1); - account->name = xml_get_prop (node, "name"); - account->uid = xml_get_prop (node, "uid"); - account->enabled = xml_get_bool (node, "enabled"); - - /* temporary pre-1.4 back compat */ - if (!account->uid) - account->uid = e_account_gen_uid (); - - node = node->children; - while (node != NULL) { - if (!strcmp (node->name, "identity")) { - account->id = g_new0 (MailConfigIdentity, 1); - - cur = node->children; - while (cur != NULL) { - if (!strcmp (cur->name, "name")) { - account->id->name = xml_get_content (cur); - } else if (!strcmp (cur->name, "addr-spec")) { - account->id->address = xml_get_content (cur); - } else if (!strcmp (cur->name, "reply-to")) { - account->id->reply_to = xml_get_content (cur); - } else if (!strcmp (cur->name, "organization")) { - account->id->organization = xml_get_content (cur); - } else if (!strcmp (cur->name, "signature")) { - account->id->auto_signature = xml_get_bool (cur, "auto"); - account->id->def_signature = lookup_signature (xml_get_int (cur, "default")); - } - - cur = cur->next; - } - } else if (!strcmp (node->name, "source")) { - int timeout; - - account->source = g_new0 (MailConfigService, 1); - account->source->save_passwd = xml_get_bool (node, "save-passwd"); - account->source->keep_on_server = xml_get_bool (node, "keep-on-server"); - account->source->auto_check = xml_get_bool (node, "auto-check"); - timeout = xml_get_int (node, "auto-check-timeout"); - if (account->source->auto_check && timeout <= 0) { - account->source->auto_check = FALSE; - account->source->auto_check_time = 0; - } else { - account->source->auto_check_time = timeout; - } - - cur = node->children; - while (cur != NULL) { - if (!strcmp (cur->name, "url")) { - account->source->url = xml_get_content (cur); - break; - } - cur = cur->next; - } - } else if (!strcmp (node->name, "transport")) { - account->transport = g_new0 (MailConfigService, 1); - account->transport->save_passwd = xml_get_bool (node, "save-passwd"); - - cur = node->children; - while (cur != NULL) { - if (!strcmp (cur->name, "url")) { - account->transport->url = xml_get_content (cur); - break; - } - cur = cur->next; - } - } else if (!strcmp (node->name, "drafts-folder")) { - account->drafts_folder_uri = xml_get_content (node); - } else if (!strcmp (node->name, "sent-folder")) { - account->sent_folder_uri = xml_get_content (node); - } else if (!strcmp (node->name, "auto-cc")) { - account->always_cc = xml_get_bool (node, "always"); - account->cc_addrs = xml_get_content (node); - } else if (!strcmp (node->name, "auto-bcc")) { - account->always_cc = xml_get_bool (node, "always"); - account->bcc_addrs = xml_get_content (node); - } else if (!strcmp (node->name, "pgp")) { - account->pgp_encrypt_to_self = xml_get_bool (node, "encrypt-to-self"); - account->pgp_always_trust = xml_get_bool (node, "always-trust"); - account->pgp_always_sign = xml_get_bool (node, "always-sign"); - account->pgp_no_imip_sign = xml_get_bool (node, "no-imip-sign"); - - if (node->children) { - cur = node->children; - while (cur != NULL) { - if (!strcmp (cur->name, "key-id")) { - account->pgp_key = xml_get_content (cur); - break; - } - - cur = cur->next; - } - } - } else if (!strcmp (node->name, "smime")) { - account->smime_encrypt_to_self = xml_get_bool (node, "encrypt-to-self"); - account->smime_always_sign = xml_get_bool (node, "always-sign"); - - if (node->children) { - cur = node->children; - while (cur != NULL) { - if (!strcmp (cur->name, "key-id")) { - account->smime_key = xml_get_content (cur); - break; - } - - cur = cur->next; - } - } - } - - node = node->next; - } - - xmlFreeDoc (doc); - - return account; -} - -static char * -account_to_xml (MailConfigAccount *account) -{ - xmlNodePtr root, node, id, src, xport; - char *xmlbuf, *tmp, buf[20]; - xmlDocPtr doc; - int n; - - doc = xmlNewDoc ("1.0"); - - root = xmlNewDocNode (doc, NULL, "account", NULL); - xmlDocSetRootElement (doc, root); - - xmlSetProp (root, "name", account->name); - xmlSetProp (root, "uid", account->uid); - xmlSetProp (root, "enabled", account->enabled ? "true" : "false"); - - id = xmlNewChild (root, NULL, "identity", NULL); - if (account->id->name) - xmlNewTextChild (id, NULL, "name", account->id->name); - if (account->id->address) - xmlNewTextChild (id, NULL, "addr-spec", account->id->address); - if (account->id->reply_to) - xmlNewTextChild (id, NULL, "reply-to", account->id->reply_to); - if (account->id->organization) - xmlNewTextChild (id, NULL, "organization", account->id->organization); - - node = xmlNewChild (id, NULL, "signature", NULL); - xmlSetProp (node, "auto", account->id->auto_signature ? "true" : "false"); - sprintf (buf, "%d", account->id->def_signature); - xmlSetProp (node, "default", buf); - - src = xmlNewChild (root, NULL, "source", NULL); - xmlSetProp (src, "save-passwd", account->source->save_passwd ? "true" : "false"); - xmlSetProp (src, "keep-on-server", account->source->keep_on_server ? "true" : "false"); - xmlSetProp (src, "auto-check", account->source->auto_check ? "true" : "false"); - sprintf (buf, "%d", account->source->auto_check_time); - xmlSetProp (src, "auto-check-timeout", buf); - if (account->source->url) - xmlNewTextChild (src, NULL, "url", account->source->url); - - xport = xmlNewChild (root, NULL, "transport", NULL); - xmlSetProp (xport, "save-passwd", account->transport->save_passwd ? "true" : "false"); - if (account->transport->url) - xmlNewTextChild (xport, NULL, "url", account->transport->url); - - xmlNewTextChild (root, NULL, "drafts-folder", account->drafts_folder_uri); - xmlNewTextChild (root, NULL, "sent-folder", account->sent_folder_uri); - - node = xmlNewChild (root, NULL, "auto-cc", NULL); - xmlSetProp (node, "always", account->always_cc ? "true" : "false"); - if (account->cc_addrs) - xmlNewTextChild (node, NULL, "recipients", account->cc_addrs); - - node = xmlNewChild (root, NULL, "auto-bcc", NULL); - xmlSetProp (node, "always", account->always_bcc ? "true" : "false"); - if (account->bcc_addrs) - xmlNewTextChild (node, NULL, "recipients", account->bcc_addrs); - - node = xmlNewChild (root, NULL, "pgp", NULL); - xmlSetProp (node, "encrypt-to-self", account->pgp_encrypt_to_self ? "true" : "false"); - xmlSetProp (node, "always-trust", account->pgp_always_trust ? "true" : "false"); - xmlSetProp (node, "always-sign", account->pgp_always_sign ? "true" : "false"); - xmlSetProp (node, "no-imip-sign", account->pgp_no_imip_sign ? "true" : "false"); - if (account->pgp_key) - xmlNewTextChild (node, NULL, "key-id", account->pgp_key); - - node = xmlNewChild (root, NULL, "smime", NULL); - xmlSetProp (node, "encrypt-to-self", account->smime_encrypt_to_self ? "true" : "false"); - xmlSetProp (node, "always-sign", account->smime_always_sign ? "true" : "false"); - if (account->smime_key) - xmlNewTextChild (node, NULL, "key-id", account->smime_key); - - xmlDocDumpMemory (doc, (xmlChar **) &xmlbuf, &n); - xmlFreeDoc (doc); - - /* remap to glib memory */ - tmp = g_malloc (n + 1); - memcpy (tmp, xmlbuf, n); - tmp[n] = '\0'; - xmlFree (xmlbuf); - - return tmp; -} - -static void -accounts_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data) -{ - GSList *list, *l, *tail, *n; - - if (config->accounts != NULL) { - l = config->accounts; - while (l != NULL) { - n = l->next; - account_destroy ((MailConfigAccount *) l->data); - g_slist_free_1 (l); - l = n; - } - - config->accounts = NULL; - } - - tail = NULL; - list = gconf_client_get_list (config->gconf, "/apps/evolution/mail/accounts", - GCONF_VALUE_STRING, NULL); - - l = list; - while (l != NULL) { - MailConfigAccount *account; - - if ((account = account_new_from_xml ((char *) l->data))) { - n = g_slist_alloc (); - n->data = account; - n->next = NULL; - - if (tail == NULL) - config->accounts = n; - else - tail->next = n; - tail = n; - } - - n = l->next; - g_slist_free_1 (l); - l = n; - } -} - -static void -accounts_save (void) -{ - GSList *list, *tail, *n, *l; - char *xmlbuf; - - list = NULL; - tail = NULL; - - l = config->accounts; - while (l != NULL) { - if ((xmlbuf = account_to_xml ((MailConfigAccount *) l->data))) { - n = g_slist_alloc (); - n->data = xmlbuf; - n->next = NULL; - - if (tail == NULL) - list = n; - else - tail->next = n; - tail = n; - } - - l = l->next; - } - - gconf_client_set_list (config->gconf, "/apps/evolution/mail/accounts", GCONF_VALUE_STRING, list, NULL); - - l = list; - while (l != NULL) { - n = l->next; - g_free (l->data); - g_slist_free_1 (l); - l = n; - } - - gconf_client_suggest_sync (config->gconf, NULL); -} - void mail_config_save_accounts (void) { - gconf_client_notify_remove (config->gconf, config->accounts_notify_id); - - accounts_save (); - - config->accounts_notify_id = gconf_client_notify_add (config->gconf, "/apps/evolution/mail/accounts", - accounts_changed, NULL, NULL, NULL); -} - -/* Config struct routines */ -void -mail_config_init (void) -{ - if (config) - return; - - config = g_new0 (MailConfig, 1); - config->gconf = gconf_client_get_default (); - - gconf_client_add_dir (config->gconf, "/apps/evolution/mail/accounts", - GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - - config->accounts_notify_id = gconf_client_notify_add (config->gconf, "/apps/evolution/mail/accounts", - accounts_changed, NULL, NULL, NULL); - - config_read (); -} - -void -mail_config_clear (void) -{ - GSList *list, *l, *n; - int i; - - if (!config) - return; - - l = config->accounts; - while (l != NULL) { - n = l->next; - account_destroy ((MailConfigAccount *) l->data); - g_slist_free_1 (l); - l = n; - } - - config->accounts = NULL; - - for (i = 0; i < 5; i++) { - g_free (config->labels[i].name); - config->labels[i].name = NULL; - g_free (config->labels[i].string); - config->labels[i].string = NULL; - } + e_account_list_save (config->accounts); } static MailConfigSignature * @@ -857,24 +361,49 @@ config_write_signatures (void) gconf_client_suggest_sync (config->gconf, NULL); } +/* Config struct routines */ void -mail_config_write_account_sig (MailConfigAccount *account, int id) +mail_config_init (void) { - /* FIXME: what is this supposed to do? */ - ; + if (config) + return; + + config = g_new0 (MailConfig, 1); + config->gconf = gconf_client_get_default (); + + mail_config_clear (); + + config_read_signatures (); + + config->accounts = e_account_list_new (config->gconf); } -static void -config_read (void) +void +mail_config_clear (void) { - int len, i, default_num; - char *path, *val, *p; + int i; - mail_config_clear (); + if (!config) + return; - config_read_signatures (); + if (config->accounts) { + g_object_unref (config->accounts); + config->accounts = NULL; + } - accounts_changed (config->gconf, 0, NULL, NULL); + for (i = 0; i < 5; i++) { + g_free (config->labels[i].name); + config->labels[i].name = NULL; + g_free (config->labels[i].string); + config->labels[i].string = NULL; + } +} + +void +mail_config_write_account_sig (EAccount *account, int id) +{ + /* FIXME: what is this supposed to do? */ + ; } void @@ -884,6 +413,7 @@ mail_config_write (void) return; config_write_signatures (); + e_account_list_save (config->accounts); gconf_client_suggest_sync (config->gconf, NULL); } @@ -909,8 +439,8 @@ hash_save_state (gpointer key, gpointer value, gpointer user_data) void mail_config_write_on_exit (void) { - MailConfigAccount *account; - const GSList *accounts; + EAccount *account; + EIterator *iter; char *path, *p; int i; @@ -928,10 +458,12 @@ mail_config_write_on_exit (void) /* then we make sure the ones we want to remember are in the session cache */ - accounts = config->accounts; - for ( ; accounts; accounts = accounts->next) { + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { char *passwd; - account = accounts->data; + + account = (EAccount *) e_iterator_get (iter); + if (account->source->save_passwd && account->source->url) { passwd = mail_session_get_password (account->source->url); mail_session_forget_password (account->source->url); @@ -945,20 +477,27 @@ mail_config_write_on_exit (void) mail_session_add_password (account->transport->url, passwd); g_free (passwd); } + + e_iterator_next (iter); } + g_object_unref (iter); + /* then we clear out our component passwords */ e_passwords_clear_component_passwords ("Mail"); /* then we remember them */ - accounts = config->accounts; - for ( ; accounts; accounts = accounts->next) { - account = accounts->data; + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + if (account->source->save_passwd && account->source->url) mail_session_remember_password (account->source->url); if (account->transport->save_passwd && account->transport->url) mail_session_remember_password (account->transport->url); + + e_iterator_next (iter); } /* now do cleanup */ @@ -969,7 +508,7 @@ mail_config_write_on_exit (void) gboolean mail_config_is_configured (void) { - return config->accounts != NULL; + return e_list_length ((EList *) config->accounts) > 0; } gboolean @@ -1117,16 +656,33 @@ mail_config_get_label_color_string (int label) } gboolean -mail_config_find_account (const MailConfigAccount *account) +mail_config_find_account (EAccount *account) { - return g_slist_find (config->accounts, (gpointer) account) != NULL; + EAccount *acnt; + EIterator *iter; + + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + acnt = (EAccount *) e_iterator_get (iter); + if (acnt == account) { + g_object_unref (iter); + return TRUE; + } + + e_iterator_next (iter); + } + + g_object_unref (iter); + + return FALSE; } -const MailConfigAccount * +EAccount * mail_config_get_default_account (void) { - MailConfigAccount *account; - int index; + EAccount *account = NULL; + EIterator *iter; + int index, n; if (config == NULL) mail_config_init (); @@ -1135,44 +691,63 @@ mail_config_get_default_account (void) return NULL; index = gconf_client_get_int (config->gconf, "/apps/evolution/mail/default_account", NULL); - account = g_slist_nth_data (config->accounts, index); - /* Looks like we have no default, so make the first account - the default */ + iter = e_list_get_iterator ((EList *) config->accounts); + n = 0; + + while (e_iterator_is_valid (iter)) { + if (n == index) { + account = (EAccount *) e_iterator_get (iter); + break; + } + + n++; + e_iterator_next (iter); + } + if (account == NULL) { + /* Looks like we have no default, so make the first account + the default */ + e_iterator_reset (iter); + account = (EAccount *) e_iterator_get (iter); + gconf_client_set_int (config->gconf, "/apps/evolution/mail/default_account", 0, NULL); - account = config->accounts->data; } + g_object_unref (iter); + return account; } -const MailConfigAccount * +EAccount * mail_config_get_account_by_name (const char *account_name) { - /* FIXME: this should really use a hash */ - const MailConfigAccount *account; - GSList *l; + EAccount *account; + EIterator *iter; - l = config->accounts; - while (l) { - account = l->data; - if (account && !strcmp (account->name, account_name)) + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + if (!strcmp (account->name, account_name)) { + g_object_unref (iter); return account; + } - l = l->next; + e_iterator_next (iter); } + g_object_unref (iter); + return NULL; } -const MailConfigAccount * +EAccount * mail_config_get_account_by_source_url (const char *source_url) { - const MailConfigAccount *account; CamelProvider *provider; + EAccount *account; CamelURL *source; - GSList *l; + EIterator *iter; g_return_val_if_fail (source_url != NULL, NULL); @@ -1184,17 +759,19 @@ mail_config_get_account_by_source_url (const char *source_url) if (!source) return NULL; - l = config->accounts; - while (l) { - account = l->data; + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); - if (account && account->source && account->source->url) { + if (account->source && account->source->url) { CamelURL *url; url = camel_url_new (account->source->url, NULL); if (url && provider->url_equal (url, source)) { camel_url_free (url); camel_url_free (source); + g_object_unref (iter); + return account; } @@ -1202,21 +779,23 @@ mail_config_get_account_by_source_url (const char *source_url) camel_url_free (url); } - l = l->next; + e_iterator_next (iter); } + g_object_unref (iter); + camel_url_free (source); return NULL; } -const MailConfigAccount * +EAccount * mail_config_get_account_by_transport_url (const char *transport_url) { - const MailConfigAccount *account; CamelProvider *provider; CamelURL *transport; - GSList *l; + EAccount *account; + EIterator *iter; g_return_val_if_fail (transport_url != NULL, NULL); @@ -1228,17 +807,19 @@ mail_config_get_account_by_transport_url (const char *transport_url) if (!transport) return NULL; - l = config->accounts; - while (l) { - account = l->data; + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); - if (account && account->transport && account->transport->url) { + if (account->transport && account->transport->url) { CamelURL *url; url = camel_url_new (account->transport->url, NULL); if (url && provider->url_equal (url, transport)) { camel_url_free (url); camel_url_free (transport); + g_object_unref (iter); + return account; } @@ -1246,15 +827,17 @@ mail_config_get_account_by_transport_url (const char *transport_url) camel_url_free (url); } - l = l->next; + e_iterator_next (iter); } + g_object_unref (iter); + camel_url_free (transport); return NULL; } -const GSList * +EAccountList * mail_config_get_accounts (void) { g_assert (config != NULL); @@ -1263,16 +846,18 @@ mail_config_get_accounts (void) } void -mail_config_add_account (MailConfigAccount *account) +mail_config_add_account (EAccount *account) { - config->accounts = g_slist_append (config->accounts, account); + e_list_append ((EList *) config->accounts, account); mail_config_save_accounts (); } -const GSList * -mail_config_remove_account (MailConfigAccount *account) +void +mail_config_remove_account (EAccount *account) { + EAccount *acnt = NULL; + EIterator *iter; int index, cur; cur = gconf_client_get_int (config->gconf, "/apps/evolution/mail/default_account", NULL); @@ -1283,35 +868,61 @@ mail_config_remove_account (MailConfigAccount *account) gconf_client_set_int (config->gconf, "/apps/evolution/mail/default_account", 0, NULL); } else { /* adjust the default to make sure it points to the same one */ - index = g_slist_index (config->accounts, account); + index = 0; + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + acnt = (EAccount *) e_iterator_get (iter); + if (acnt == account) + break; + + index++; + e_iterator_next (iter); + } + + g_object_unref (iter); + if (cur > index) gconf_client_set_int (config->gconf, "/apps/evolution/mail/default_account", cur - 1, NULL); } - config->accounts = g_slist_remove (config->accounts, account); - account_destroy (account); + e_list_remove ((EList *) config->accounts, account); + g_object_unref (account); mail_config_save_accounts (); - - return config->accounts; } void -mail_config_set_default_account (const MailConfigAccount *account) +mail_config_set_default_account (EAccount *account) { - int index; + EIterator *iter; + EAccount *acnt; + int index = -1; + int i = 0; + + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + acnt = (EAccount *) e_iterator_get (iter); + if (acnt == account) { + index = i; + break; + } + + i++; + e_iterator_next (iter); + } + + g_object_unref (iter); - index = g_slist_index (config->accounts, (void *) account); if (index == -1) return; gconf_client_set_int (config->gconf, "/apps/evolution/mail/default_account", index, NULL); } -const MailConfigIdentity * +EAccountIdentity * mail_config_get_default_identity (void) { - const MailConfigAccount *account; + EAccount *account; account = mail_config_get_default_account (); if (account) @@ -1320,27 +931,32 @@ mail_config_get_default_identity (void) return NULL; } -const MailConfigService * +EAccountService * mail_config_get_default_transport (void) { - const MailConfigAccount *account; - const GSList *accounts; + EAccount *account; + EIterator *iter; account = mail_config_get_default_account (); if (account && account->transport && account->transport->url) return account->transport; /* return the first account with a transport? */ - accounts = config->accounts; - while (accounts) { - account = accounts->data; + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); - if (account->transport && account->transport->url) + if (account->transport && account->transport->url) { + g_object_unref (iter); + return account->transport; + } - accounts = accounts->next; + e_iterator_next (iter); } + g_object_unref (iter); + return NULL; } @@ -1362,11 +978,11 @@ uri_to_evname (const char *uri, const char *prefix) } void -mail_config_uri_renamed(GCompareFunc uri_cmp, const char *old, const char *new) +mail_config_uri_renamed (GCompareFunc uri_cmp, const char *old, const char *new) { - MailConfigAccount *ac; - const GSList *l; - int work = 0; + EAccount *account; + EIterator *iter; + int i, work = 0; gpointer oldkey, newkey, hashkey; gpointer val; char *oldname, *newname; @@ -1376,42 +992,46 @@ mail_config_uri_renamed(GCompareFunc uri_cmp, const char *old, const char *new) "*views/mail/current_view-", "*views/mail/custom_view-", NULL }; - int i; - - l = mail_config_get_accounts(); - while (l) { - ac = l->data; - if (ac->sent_folder_uri && uri_cmp(ac->sent_folder_uri, old)) { - g_free(ac->sent_folder_uri); - ac->sent_folder_uri = g_strdup(new); + + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + + if (account->sent_folder_uri && uri_cmp (account->sent_folder_uri, old)) { + g_free (account->sent_folder_uri); + account->sent_folder_uri = g_strdup (new); work = 1; } - if (ac->drafts_folder_uri && uri_cmp(ac->drafts_folder_uri, old)) { - g_free(ac->drafts_folder_uri); - ac->drafts_folder_uri = g_strdup(new); + + if (account->drafts_folder_uri && uri_cmp (account->drafts_folder_uri, old)) { + g_free (account->drafts_folder_uri); + account->drafts_folder_uri = g_strdup (new); work = 1; } - l = l->next; + + e_iterator_next (iter); } - + + g_object_unref (iter); + oldkey = uri_to_key (old); newkey = uri_to_key (new); - + /* call this to load the hash table and the key */ mail_config_get_thread_list (old); if (g_hash_table_lookup_extended (config->threaded_hash, oldkey, &hashkey, &val)) { /*printf ("changing key in threaded_hash\n");*/ g_hash_table_remove (config->threaded_hash, hashkey); - g_hash_table_insert (config->threaded_hash, g_strdup(newkey), val); + g_hash_table_insert (config->threaded_hash, g_strdup (newkey), val); work = 2; } g_free (oldkey); g_free (newkey); - + /* ignore return values or if the files exist or * not, doesn't matter */ - + for (i = 0; cachenames[i]; i++) { oldname = uri_to_evname (old, cachenames[i]); newname = uri_to_evname (new, cachenames[i]); @@ -1420,44 +1040,47 @@ mail_config_uri_renamed(GCompareFunc uri_cmp, const char *old, const char *new) g_free (oldname); g_free (newname); } - + /* nasty ... */ if (work) - mail_config_write(); + mail_config_write (); } void -mail_config_uri_deleted(GCompareFunc uri_cmp, const char *uri) +mail_config_uri_deleted (GCompareFunc uri_cmp, const char *uri) { - MailConfigAccount *ac; - const GSList *l; + EAccount *account; + EIterator *iter; int work = 0; /* assumes these can't be removed ... */ extern char *default_sent_folder_uri, *default_drafts_folder_uri; - - l = mail_config_get_accounts(); - while (l) { - ac = l->data; - if (ac->sent_folder_uri && uri_cmp(ac->sent_folder_uri, uri)) { - g_free(ac->sent_folder_uri); - ac->sent_folder_uri = g_strdup(default_sent_folder_uri); + + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + + if (account->sent_folder_uri && uri_cmp (account->sent_folder_uri, uri)) { + g_free (account->sent_folder_uri); + account->sent_folder_uri = g_strdup (default_sent_folder_uri); work = 1; } - if (ac->drafts_folder_uri && uri_cmp(ac->drafts_folder_uri, uri)) { - g_free(ac->drafts_folder_uri); - ac->drafts_folder_uri = g_strdup(default_drafts_folder_uri); + + if (account->drafts_folder_uri && uri_cmp (account->drafts_folder_uri, uri)) { + g_free (account->drafts_folder_uri); + account->drafts_folder_uri = g_strdup (default_drafts_folder_uri); work = 1; } - l = l->next; + + e_iterator_next (iter); } - + /* nasty again */ if (work) - mail_config_write(); + mail_config_write (); } void -mail_config_service_set_save_passwd (MailConfigService *service, gboolean save_passwd) +mail_config_service_set_save_passwd (EAccountService *service, gboolean save_passwd) { service->save_passwd = save_passwd; } @@ -1628,62 +1251,44 @@ impl_GNOME_Evolution_MailConfig_addAccount (PortableServer_Servant servant, { GNOME_Evolution_MailConfig_Service source, transport; GNOME_Evolution_MailConfig_Identity id; - MailConfigAccount *mail_account; - MailConfigService *mail_service; - MailConfigIdentity *mail_id; + EAccount *new; if (mail_config_get_account_by_name (account->name)) { /* FIXME: we need an exception. */ return; } - mail_account = g_new0 (MailConfigAccount, 1); - mail_account->name = g_strdup (account->name); - mail_account->enabled = source.enabled; + new = e_account_new (); + new->name = g_strdup (account->name); + new->enabled = source.enabled; /* Copy ID */ id = account->id; - mail_id = g_new0 (MailConfigIdentity, 1); - mail_id->name = g_strdup (id.name); - mail_id->address = g_strdup (id.address); - mail_id->reply_to = g_strdup (id.reply_to); - mail_id->organization = g_strdup (id.organization); - - mail_account->id = mail_id; + new->id->name = g_strdup (id.name); + new->id->address = g_strdup (id.address); + new->id->reply_to = g_strdup (id.reply_to); + new->id->organization = g_strdup (id.organization); /* Copy source */ source = account->source; - mail_service = g_new0 (MailConfigService, 1); - if (source.url == NULL || strcmp (source.url, "none://") == 0) { - mail_service->url = NULL; - } else { - mail_service->url = g_strdup (source.url); - } - mail_service->keep_on_server = source.keep_on_server; - mail_service->auto_check = source.auto_check; - mail_service->auto_check_time = source.auto_check_time; - mail_service->save_passwd = source.save_passwd; + if (!(source.url == NULL || strcmp (source.url, "none://") == 0)) + new->source->url = g_strdup (source.url); - mail_account->source = mail_service; + new->source->keep_on_server = source.keep_on_server; + new->source->auto_check = source.auto_check; + new->source->auto_check_time = source.auto_check_time; + new->source->save_passwd = source.save_passwd; /* Copy transport */ transport = account->transport; - mail_service = g_new0 (MailConfigService, 1); - if (transport.url == NULL) { - mail_service->url = NULL; - } else { - mail_service->url = g_strdup (transport.url); - } - mail_service->url = g_strdup (transport.url); - mail_service->keep_on_server = transport.keep_on_server; - mail_service->auto_check = transport.auto_check; - mail_service->auto_check_time = transport.auto_check_time; - mail_service->save_passwd = transport.save_passwd; + if (transport.url != NULL) + new->transport->url = g_strdup (transport.url); - mail_account->transport = mail_service; + new->transport->url = g_strdup (transport.url); + new->transport->save_passwd = transport.save_passwd; /* Add new account */ - mail_config_add_account (mail_account); + mail_config_add_account (new); /* Don't write out the config right away in case the remote * component is creating or removing multiple accounts. @@ -1697,12 +1302,11 @@ impl_GNOME_Evolution_MailConfig_removeAccount (PortableServer_Servant servant, const CORBA_char *name, CORBA_Environment *ev) { - MailConfigAccount *account; - - account = (MailConfigAccount *)mail_config_get_account_by_name (name); - if (account) + EAccount *account; + + if ((account = mail_config_get_account_by_name (name))) mail_config_remove_account (account); - + /* Don't write out the config right away in case the remote * component is creating or removing multiple accounts. */ @@ -1714,7 +1318,7 @@ static void evolution_mail_config_class_init (EvolutionMailConfigClass *klass) { POA_GNOME_Evolution_MailConfig__epv *epv = &klass->epv; - + parent_class = g_type_class_ref(PARENT_TYPE); epv->addAccount = impl_GNOME_Evolution_MailConfig_addAccount; epv->removeAccount = impl_GNOME_Evolution_MailConfig_removeAccount; @@ -1723,6 +1327,7 @@ evolution_mail_config_class_init (EvolutionMailConfigClass *klass) static void evolution_mail_config_init (EvolutionMailConfig *config) { + ; } BONOBO_TYPE_FUNC_FULL (EvolutionMailConfig, @@ -1736,9 +1341,9 @@ evolution_mail_config_factory_fn (BonoboGenericFactory *factory, void *closure) { EvolutionMailConfig *config; - + config = g_object_new (evolution_mail_config_get_type (), NULL); - + return BONOBO_OBJECT (config); } @@ -1866,19 +1471,28 @@ delete_unused_signature_file (const char *filename) void mail_config_signature_delete (MailConfigSignature *sig) { + EAccount *account; + EIterator *iter; GSList *node, *next; gboolean after = FALSE; + int index; - node = config->accounts; - while (node != NULL) { - MailConfigAccount *account = node->data; + index = g_slist_index (config->signatures, sig); + + iter = e_list_get_iterator ((EList *) config->accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); - if (account->id->def_signature == sig) - account->id->def_signature = NULL; + if (account->id->def_signature == index) + account->id->def_signature = -1; + else if (account->id->def_signature > index) + account->id->def_signature--; - node = node->next; + e_iterator_next (iter); } + g_object_unref (iter); + node = config->signatures; while (node != NULL) { next = node->next; diff --git a/mail/mail-config.h b/mail/mail-config.h index 239a6d2feb..6f990b7a6d 100644 --- a/mail/mail-config.h +++ b/mail/mail-config.h @@ -26,6 +26,9 @@ #include #include +#include "e-util/e-account.h" +#include "e-util/e-account-list.h" + #ifdef __cplusplus extern "C" { #pragma } @@ -39,51 +42,6 @@ typedef struct { gboolean html; } MailConfigSignature; -typedef struct { - char *name; - char *address; - char *reply_to; - char *organization; - - MailConfigSignature *def_signature; - gboolean auto_signature; -} MailConfigIdentity; - -typedef struct { - char *url; - gboolean keep_on_server; - gboolean auto_check; - int auto_check_time; - gboolean save_passwd; -} MailConfigService; - -typedef struct { - char *name; - char *uid; - - gboolean enabled; - - MailConfigIdentity *id; - MailConfigService *source; - MailConfigService *transport; - - char *drafts_folder_uri, *sent_folder_uri; - - gboolean always_cc; - char *cc_addrs; - gboolean always_bcc; - char *bcc_addrs; - - char *pgp_key; - gboolean pgp_encrypt_to_self; - gboolean pgp_always_sign; - gboolean pgp_no_imip_sign; - gboolean pgp_always_trust; - - char *smime_key; - gboolean smime_encrypt_to_self; - gboolean smime_always_sign; -} MailConfigAccount; typedef enum { MAIL_CONFIG_HTTP_NEVER, @@ -135,20 +93,6 @@ extern MailConfigLabel label_defaults[5]; MailConfigSignature *signature_copy (const MailConfigSignature *sig); void signature_destroy (MailConfigSignature *sig); -/* Identities */ -MailConfigIdentity *identity_copy (const MailConfigIdentity *id); -void identity_destroy (MailConfigIdentity *id); - -/* Services */ -MailConfigService *service_copy (const MailConfigService *source); -void service_destroy (MailConfigService *source); -void service_destroy_each (gpointer item, gpointer data); - -/* Accounts */ -MailConfigAccount *account_copy (const MailConfigAccount *account); -void account_destroy (MailConfigAccount *account); -void account_destroy_each (gpointer item, gpointer data); - /* Configuration */ void mail_config_init (void); void mail_config_clear (void); @@ -168,30 +112,37 @@ guint32 mail_config_get_label_color (int label); void mail_config_set_label_color (int label, guint32 color); const char *mail_config_get_label_color_string (int label); -void mail_config_service_set_save_passwd (MailConfigService *service, gboolean save_passwd); +void mail_config_service_set_save_passwd (EAccountService *service, gboolean save_passwd); -gboolean mail_config_find_account (const MailConfigAccount *account); -const MailConfigAccount *mail_config_get_default_account (void); -const MailConfigAccount *mail_config_get_account_by_name (const char *account_name); -const MailConfigAccount *mail_config_get_account_by_source_url (const char *url); -const MailConfigAccount *mail_config_get_account_by_transport_url (const char *url); -const GSList *mail_config_get_accounts (void); -void mail_config_add_account (MailConfigAccount *account); -const GSList *mail_config_remove_account (MailConfigAccount *account); +gboolean mail_config_find_account (EAccount *account); +EAccount *mail_config_get_default_account (void); +EAccount *mail_config_get_account_by_name (const char *account_name); +EAccount *mail_config_get_account_by_source_url (const char *url); +EAccount *mail_config_get_account_by_transport_url (const char *url); +EAccountList *mail_config_get_accounts (void); +void mail_config_add_account (EAccount *account); +void mail_config_remove_account (EAccount *account); -void mail_config_set_default_account (const MailConfigAccount *account); +void mail_config_set_default_account (EAccount *account); -const MailConfigIdentity *mail_config_get_default_identity (void); -const MailConfigService *mail_config_get_default_transport (void); +EAccountIdentity *mail_config_get_default_identity (void); +EAccountService *mail_config_get_default_transport (void); void mail_config_save_accounts (void); -/* uri's got changed by the store, etc */ -void mail_config_uri_renamed(GCompareFunc uri_cmp, const char *old, const char *new); -void mail_config_uri_deleted(GCompareFunc uri_cmp, const char *uri); +GSList *mail_config_get_signature_list (void); +MailConfigSignature *mail_config_signature_add (gboolean html, const char *script); +void mail_config_signature_delete (MailConfigSignature *sig); +void mail_config_signature_write (MailConfigSignature *sig); +void mail_config_signature_set_name (MailConfigSignature *sig, const char *name); +void mail_config_signature_set_html (MailConfigSignature *sig, gboolean html); +void mail_config_signature_set_filename (MailConfigSignature *sig, const char *filename); -GtkType evolution_mail_config_get_type (void); +/* uri's got changed by the store, etc */ +void mail_config_uri_renamed (GCompareFunc uri_cmp, const char *old, const char *new); +void mail_config_uri_deleted (GCompareFunc uri_cmp, const char *uri); + /* static utility functions */ char *mail_config_folder_to_cachename (CamelFolder *folder, const char *prefix); @@ -201,15 +152,10 @@ gboolean mail_config_check_service (const char *url, CamelProviderType type, GLi +GtkType evolution_mail_config_get_type (void); + gboolean evolution_mail_config_factory_init (void); -GSList *mail_config_get_signature_list (void); -MailConfigSignature *mail_config_signature_add (gboolean html, const gchar *script); -void mail_config_signature_delete (MailConfigSignature *sig); -void mail_config_signature_write (MailConfigSignature *sig); -void mail_config_signature_set_name (MailConfigSignature *sig, const gchar *name); -void mail_config_signature_set_html (MailConfigSignature *sig, gboolean html); -void mail_config_signature_set_filename (MailConfigSignature *sig, const gchar *filename); typedef enum { MAIL_CONFIG_SIG_EVENT_NAME_CHANGED, @@ -225,7 +171,7 @@ void mail_config_signature_register_client (MailConfigSignatureClient client, gp void mail_config_signature_unregister_client (MailConfigSignatureClient client, gpointer data); void mail_config_signature_emit_event (MailConfigSigEvent event, MailConfigSignature *sig); -void mail_config_write_account_sig (MailConfigAccount *account, int i); +void mail_config_write_account_sig (EAccount *account, int i); char *mail_config_signature_run_script (char *script); #ifdef __cplusplus diff --git a/mail/mail-crypto.c b/mail/mail-crypto.c index 629bc8b845..68f91b35de 100644 --- a/mail/mail-crypto.c +++ b/mail/mail-crypto.c @@ -40,7 +40,7 @@ * options set based on the account provided. **/ CamelCipherContext * -mail_crypto_get_pgp_cipher_context (const MailConfigAccount *account) +mail_crypto_get_pgp_cipher_context (EAccount *account) { CamelCipherContext *cipher; diff --git a/mail/mail-crypto.h b/mail/mail-crypto.h index bc92e2a74b..1aebb286c8 100644 --- a/mail/mail-crypto.h +++ b/mail/mail-crypto.h @@ -36,7 +36,7 @@ extern "C" { /* PGP/MIME convenience wrappers */ -CamelCipherContext *mail_crypto_get_pgp_cipher_context (const MailConfigAccount *account); +CamelCipherContext *mail_crypto_get_pgp_cipher_context (EAccount *account); /* S/MIME v3 convenience wrappers */ diff --git a/mail/mail-ops.c b/mail/mail-ops.c index c9de994aaa..c7f12dd8a3 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -451,7 +451,7 @@ static void mail_send_message (CamelMimeMessage *message, const char *destination, CamelFilterDriver *driver, CamelException *ex) { - const MailConfigAccount *account = NULL; + EAccount *account = NULL; const CamelInternetAddress *iaddr; CamelAddress *from, *recipients; CamelMessageInfo *info; diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c index 532faa9866..64d9118a4a 100644 --- a/mail/mail-send-recv.c +++ b/mail/mail-send-recv.c @@ -277,7 +277,7 @@ static send_info_t get_receive_type(const char *url) } static struct _send_data * -build_dialogue (const GSList *accounts, CamelFolder *outbox, const char *destination) +build_dialogue (EAccountList *accounts, CamelFolder *outbox, const char *destination) { GtkDialog *gd; GtkTable *table; @@ -290,8 +290,9 @@ build_dialogue (const GSList *accounts, CamelFolder *outbox, const char *destina GtkButton *stop; GtkHSeparator *line; struct _send_info *info; - char *pretty_url; - const GSList *l; + char *pretty_url; + EAccount *account; + EIterator *iter; gd = (GtkDialog *)send_recv_dialogue = gtk_dialog_new_with_buttons(_("Send & Receive Mail"), NULL, 0, NULL); stop = (GtkButton *)gtk_button_new_from_stock(GTK_STOCK_CANCEL); @@ -302,30 +303,35 @@ build_dialogue (const GSList *accounts, CamelFolder *outbox, const char *destina gnome_window_icon_set_from_file (GTK_WINDOW (gd), EVOLUTION_ICONSDIR "/send-receive.xpm"); num_sources = 0; - l = accounts; - while (l != NULL) { - MailConfigAccount *account = l->data; + + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); - if (account->source && account->source->url) + if (account->source->url) num_sources++; - l = l->next; + e_iterator_next (iter); } - table = (GtkTable *)gtk_table_new (num_sources, 4, FALSE); + g_object_unref (iter); + + table = (GtkTable *) gtk_table_new (num_sources, 4, FALSE); gtk_box_pack_start (GTK_BOX (gd->vbox), GTK_WIDGET (table), TRUE, TRUE, 0); /* must bet setup after send_recv_dialogue as it may re-trigger send-recv button */ data = setup_send_data (); row = 0; - while (accounts) { - MailConfigAccount *account = accounts->data; - MailConfigService *source; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + EAccountService *source; + + account = (EAccount *) e_iterator_get (iter); source = account->source; - if (!account->enabled || !source || !source->url) { - accounts = accounts->next; + if (!account->enabled || !source->url) { + e_iterator_next (iter); continue; } @@ -336,7 +342,7 @@ build_dialogue (const GSList *accounts, CamelFolder *outbox, const char *destina type = get_receive_type (source->url); if (type == SEND_INVALID) { - accounts = accounts->next; + e_iterator_next (iter); continue; } @@ -355,7 +361,7 @@ build_dialogue (const GSList *accounts, CamelFolder *outbox, const char *destina list = g_list_prepend (list, info); } else if (info->bar != NULL) { /* incase we get the same source pop up again */ - accounts = accounts->next; + e_iterator_next (iter); continue; } else if (info->timeout_id == 0) info->timeout_id = gtk_timeout_add (STATUS_TIMEOUT, operation_status_timeout, info); @@ -387,11 +393,13 @@ build_dialogue (const GSList *accounts, CamelFolder *outbox, const char *destina info->stop = stop; info->data = data; - g_signal_connect(stop, "clicked", G_CALLBACK(receive_cancel), info); - accounts = accounts->next; + g_signal_connect (stop, "clicked", G_CALLBACK(receive_cancel), info); + e_iterator_next (iter); row = row + 2; } + g_object_unref (iter); + line = (GtkHSeparator *)gtk_hseparator_new (); gtk_table_attach (table, GTK_WIDGET (line), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 3, 3); row++; @@ -663,11 +671,11 @@ receive_update_got_store (char *uri, CamelStore *store, void *data) void mail_send_receive (void) { - const GSList *accounts; - GList *scan; - struct _send_data *data; extern CamelFolder *outbox_folder; - const MailConfigAccount *account; + struct _send_data *data; + EAccountList *accounts; + EAccount *account; + GList *scan; if (send_recv_dialogue != NULL) { if (GTK_WIDGET_REALIZED(send_recv_dialogue)) { @@ -680,13 +688,12 @@ void mail_send_receive (void) if (!camel_session_is_online (session)) return; - if (!(accounts = mail_config_get_accounts ())) - return; - account = mail_config_get_default_account (); - if (!account || !account->transport) + if (!account || !account->transport->url) return; + accounts = mail_config_get_accounts (); + data = build_dialogue (accounts, outbox_folder, account->transport->url); scan = data->infos; while (scan) { @@ -760,11 +767,11 @@ static void auto_clean_set(void *key, struct _auto_data *info, GHashTable *set) void mail_autoreceive_setup (void) { + EAccountList *accounts; GHashTable *set_hash; - const GSList *accounts; + EIterator *iter; - if (!(accounts = mail_config_get_accounts ())) - return; + accounts = mail_config_get_accounts (); if (auto_active == NULL) auto_active = g_hash_table_new(g_str_hash, g_str_equal); @@ -772,13 +779,15 @@ mail_autoreceive_setup (void) set_hash = g_hash_table_new(g_str_hash, g_str_equal); g_hash_table_foreach(auto_active, (GHFunc)auto_setup_set, set_hash); - while (accounts) { - MailConfigAccount *account = accounts->data; - MailConfigService *source; + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + EAccountService *source; + EAccount *account; + account = (EAccount *) e_iterator_get (iter); source = account->source; - if (account->enabled && source && source->url && source->auto_check) { + if (account->enabled && source->url && source->auto_check) { struct _auto_data *info; d(printf("setting up auto-receive mail for : %s\n", source->url)); @@ -805,9 +814,11 @@ mail_autoreceive_setup (void) } } - accounts = accounts->next; + e_iterator_next (iter); } - + + g_object_unref (iter); + g_hash_table_foreach(set_hash, (GHFunc)auto_clean_set, auto_active); g_hash_table_destroy(set_hash); } @@ -884,7 +895,7 @@ void mail_send (void) { extern CamelFolder *outbox_folder; - const MailConfigService *transport; + EAccountService *transport; struct _send_info *info; struct _send_data *data; send_info_t type; diff --git a/mail/mail-session.c b/mail/mail-session.c index 8bc1f89ef3..00402fa5b5 100644 --- a/mail/mail-session.c +++ b/mail/mail-session.c @@ -166,7 +166,7 @@ struct _pass_msg { char *service_url; char *key; - MailConfigService *config_service; + EAccountService *config_service; GtkWidget *check; GtkWidget *entry; char *result; @@ -227,7 +227,7 @@ pass_response (GtkDialog *dialog, int button, void *data) static void request_password (struct _pass_msg *m) { - const MailConfigAccount *mca = NULL; + EAccount *mca = NULL; char *title; /* If we already have a password_dialog up, save this request till later */ @@ -281,8 +281,8 @@ do_get_pass(struct _mail_msg *mm) MailSession *mail_session = MAIL_SESSION (m->session); if (!strcmp (m->item, "popb4smtp_uri")) { - char *url = camel_url_to_string(m->service->url, 0); - const MailConfigAccount *account = mail_config_get_account_by_transport_url(url); + char *url = camel_url_to_string (m->service->url, 0); + EAccount *account = mail_config_get_account_by_transport_url (url); g_free(url); if (account) diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index 43b47032a9..ec1eee12d7 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -1,12 +1,24 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - Copyright 2000, 2001 Ximian Inc. - - Author: Michael Zucchi - - code for managing vfolders - - NOTE: dont run this through fucking indent. -*/ + * Authors: Michael Zucchi + * + * Copyright 2000-2003 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ #ifdef HAVE_CONFIG_H #include @@ -287,26 +299,37 @@ my_list_find(GList *l, const char *uri, GCompareFunc cmp) static int uri_is_ignore(const char *uri, GCompareFunc uri_cmp) { - int found = FALSE; - const GSList *l; - MailConfigAccount *ac; extern char *default_outbox_folder_uri, *default_sent_folder_uri, *default_drafts_folder_uri; - + EAccountList *accounts; + EAccount *account; + EIterator *iter; + int found = FALSE; + d(printf("checking '%s' against:\n %s\n %s\n %s\n", uri, default_outbox_folder_uri, default_sent_folder_uri, default_drafts_folder_uri)); - + found = (default_outbox_folder_uri && uri_cmp(default_outbox_folder_uri, uri)) || (default_sent_folder_uri && uri_cmp(default_sent_folder_uri, uri)) || (default_drafts_folder_uri && uri_cmp(default_drafts_folder_uri, uri)); - - l = mail_config_get_accounts(); - while (!found && l) { - ac = l->data; - d(printf("checkint sent_folder_uri '%s' == '%s'\n", ac->sent_folder_uri?ac->sent_folder_uri:"empty", uri)); - found = (ac->sent_folder_uri && uri_cmp(ac->sent_folder_uri, uri)) - || (ac->drafts_folder_uri && uri_cmp(ac->drafts_folder_uri, uri)); - l = l->next; + + accounts = mail_config_get_accounts (); + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + account = (EAccount *) e_iterator_get (iter); + + d(printf("checking sent_folder_uri '%s' == '%s'\n", + account->sent_folder_uri ? account->sent_folder_uri : "empty", uri)); + + found = (account->sent_folder_uri && uri_cmp (account->sent_folder_uri, uri)) + || (account->drafts_folder_uri && uri_cmp (account->drafts_folder_uri, uri)); + + if (found) + break; + + e_iterator_next (iter); } - + + g_object_unref (iter); + return found; } diff --git a/mail/mail.h b/mail/mail.h index 082403d173..1c40b52107 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -42,7 +42,7 @@ char *mail_identify_mime_part (CamelMimePart *part, MailDisplay *md); void mail_add_storage (CamelStore *store, const char *name, const char *uri); void mail_load_storage_by_uri (GNOME_Evolution_Shell shell, const char *uri, const char *name); /*takes a GSList of MailConfigServices */ -void mail_load_storages (GNOME_Evolution_Shell shell, const GSList *sources); +void mail_load_storages (GNOME_Evolution_Shell shell, EAccountList *sources); void mail_hash_storage (CamelService *store, EvolutionStorage *storage); EvolutionStorage *mail_lookup_storage (CamelStore *store); diff --git a/mail/subscribe-dialog.c b/mail/subscribe-dialog.c index ba53617715..7500b4a7ca 100644 --- a/mail/subscribe-dialog.c +++ b/mail/subscribe-dialog.c @@ -1365,7 +1365,7 @@ static void sc_filter_toggled (GtkWidget *widget, gpointer user_data) { SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *store = sc->priv->current_store; + StoreData *store = sc->priv->current_store; if (!store) return; @@ -1376,18 +1376,6 @@ sc_filter_toggled (GtkWidget *widget, gpointer user_data) } } -static void -populate_store_foreach (MailConfigAccount *account, SubscribeDialog *sc) -{ - StoreData *sd; - - if (!account->enabled || !account->source || !account->source->url) - return; - - sd = store_data_new (account->source->url); - sc->priv->store_list = g_list_prepend (sc->priv->store_list, sd); -} - static void kill_default_view (SubscribeDialog *sc) { @@ -1515,40 +1503,56 @@ got_sd_store (StoreData *sd, CamelStore *store, gpointer data) static void populate_store_list (SubscribeDialog *sc) { - const GSList *accounts; - GList *iter; + EAccountList *accounts; + EAccount *account; + EIterator *iter; GtkWidget *menu; GtkWidget *omenu; + GList *l; accounts = mail_config_get_accounts (); - g_slist_foreach ((GSList *) accounts, (GFunc) populate_store_foreach, sc); + iter = e_list_get_iterator ((EList *) accounts); + while (e_iterator_is_valid (iter)) { + StoreData *sd; + + account = (EAccount *) e_iterator_get (iter); + + if (account->enabled && account->source->url) { + sd = store_data_new (account->source->url); + sc->priv->store_list = g_list_prepend (sc->priv->store_list, sd); + } + + e_iterator_next (iter); + } + + g_object_unref (iter); menu = gtk_menu_new (); - - for (iter = sc->priv->store_list; iter; iter = iter->next) { + + for (l = sc->priv->store_list; l; l = l->next) { GtkWidget *item; CamelURL *url; char *string; - - url = camel_url_new (((StoreData *) iter->data)->uri, NULL); + + url = camel_url_new (((StoreData *) l->data)->uri, NULL); string = camel_url_to_string (url, CAMEL_URL_HIDE_ALL); camel_url_free (url); item = gtk_menu_item_new_with_label (string); - store_data_async_get_store (iter->data, got_sd_store, item); - g_object_set_data (G_OBJECT (item), STORE_DATA_KEY, iter->data); - g_signal_connect(item, "activate", G_CALLBACK(menu_item_selected), sc); + store_data_async_get_store (l->data, got_sd_store, item); + g_object_set_data (G_OBJECT (item), STORE_DATA_KEY, l->data); + g_signal_connect (item, "activate", G_CALLBACK (menu_item_selected), sc); g_free (string); - + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); } - + sc->priv->none_item = gtk_menu_item_new_with_label (_("No server has been selected")); - g_signal_connect(sc->priv->none_item, "activate", G_CALLBACK(dummy_item_selected), sc); + g_signal_connect (sc->priv->none_item, "activate", G_CALLBACK (dummy_item_selected), sc); gtk_widget_show (sc->priv->none_item); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), sc->priv->none_item); - + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), sc->priv->none_item); + gtk_widget_show (menu); - + omenu = glade_xml_get_widget (sc->priv->xml, "store_menu"); gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); } -- cgit