From 5ffaca0f8dc9d56783be9e8dd5c6661bde2269b2 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Fri, 10 Aug 2001 17:28:52 +0000 Subject: Don't load the storage if it isn't enabled. (mail_remove_storage_by_uri): 2001-08-08 Peter Williams * component-factory.c (mail_load_storages): Don't load the storage if it isn't enabled. (mail_remove_storage_by_uri): New function. Goes through the gymnastics of getting a CamelStore from the URI and calling mail_remove_storage. Copied from mail_delete(). (mail_load_storage_by_uri): Break out the storage-loading part of mail_load_storages into a single function. (mail_load_storages): Just call mail_load_storage_by_uri several times. * mail.h: Prototype our new _by_uri functions. * mail-accounts.c (news_add_destroyed): Instead of hacking around mail_load_storages, call mail_load_storage_by_uri. (mail_delete): Move this chunk of code into mail_remove_storage_by_uri. (mail_able): Add or remove the storage as necessary, with our new _by_uri functions. * mail-config-druid.c (druid_finish): See news_add_destroyed above. svn path=/trunk/; revision=11881 --- mail/ChangeLog | 23 ++++++++ mail/component-factory.c | 143 ++++++++++++++++++++++++++++++----------------- mail/mail-accounts.c | 35 +++--------- mail/mail-config-druid.c | 5 +- mail/mail.h | 2 + 5 files changed, 127 insertions(+), 81 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 778273d447..f28576dddc 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,26 @@ +2001-08-08 Peter Williams + + * component-factory.c (mail_load_storages): Don't load the storage + if it isn't enabled. + (mail_remove_storage_by_uri): New function. Goes through the + gymnastics of getting a CamelStore from the URI and calling + mail_remove_storage. Copied from mail_delete(). + (mail_load_storage_by_uri): Break out the storage-loading part of + mail_load_storages into a single function. + (mail_load_storages): Just call mail_load_storage_by_uri several + times. + + * mail.h: Prototype our new _by_uri functions. + + * mail-accounts.c (news_add_destroyed): Instead of hacking around + mail_load_storages, call mail_load_storage_by_uri. + (mail_delete): Move this chunk of code into + mail_remove_storage_by_uri. + (mail_able): Add or remove the storage as necessary, with our + new _by_uri functions. + + * mail-config-druid.c (druid_finish): See news_add_destroyed above. + 2001-08-10 Jeffrey Stedfast * mail-config.c (mail_config_get_show_preview): Free dbkey if we diff --git a/mail/component-factory.c b/mail/component-factory.c index 41cd6db365..0fd451be5f 100644 --- a/mail/component-factory.c +++ b/mail/component-factory.c @@ -896,6 +896,70 @@ add_storage (const char *name, const char *uri, CamelService *store, } } +void +mail_load_storage_by_uri (GNOME_Evolution_Shell shell, const char *uri, const char *name) +{ + CamelException ex; + CamelService *store; + CamelProvider *prov; + + camel_exception_init (&ex); + + /* Load the service (don't connect!). Check its provider and + * see if this belongs in the shell's folder list. If so, add + * it. + */ + + prov = camel_session_get_provider (session, uri, &ex); + if (prov == NULL) { + /* FIXME: real error dialog */ + g_warning ("couldn't get service %s: %s\n", uri, + camel_exception_get_description (&ex)); + camel_exception_clear (&ex); + return; + } + + /* FIXME: this case is ambiguous for things like the + * mbox provider, which can really be a spool + * (/var/spool/mail/user) or a storage (~/mail/, eg). + * That issue can't be resolved on the provider level + * -- it's a per-URL problem. + * MPZ Added a hack to let spool protocol through temporarily ... + */ + if ((!(prov->flags & CAMEL_PROVIDER_IS_STORAGE) || + !(prov->flags & CAMEL_PROVIDER_IS_REMOTE)) + && !((strcmp(prov->protocol, "spool") == 0) + || strcmp(prov->protocol, "maildir") == 0)) + return; + + store = camel_session_get_service (session, uri, + CAMEL_PROVIDER_STORE, &ex); + if (store == NULL) { + /* FIXME: real error dialog */ + g_warning ("couldn't get service %s: %s\n", uri, + camel_exception_get_description (&ex)); + camel_exception_clear (&ex); + return; + } + + if (name == NULL) { + char *service_name; + + service_name = camel_service_get_name (store, TRUE); + add_storage (service_name, uri, store, shell, &ex); + g_free (service_name); + } else + add_storage (name, uri, store, shell, &ex); + + if (camel_exception_is_set (&ex)) { + /* FIXME: real error dialog */ + g_warning ("Cannot load storage: %s", + camel_exception_get_description (&ex)); + camel_exception_clear (&ex); + } + + camel_object_unref (CAMEL_OBJECT (store)); +} /* FIXME: 'is_account_data' is an ugly hack, if we remove support for NNTP we can take it out -- fejj */ void @@ -914,68 +978,21 @@ mail_load_storages (GNOME_Evolution_Shell shell, const GSList *sources, gboolean for (iter = sources; iter; iter = iter->next) { const MailConfigAccount *account = NULL; const MailConfigService *service = NULL; - CamelService *store; - CamelProvider *prov; char *name; if (is_account_data) { account = iter->data; service = account->source; + name = account->name; } else { service = iter->data; + name = NULL; } - if (service->url == NULL || service->url[0] == '\0') + if (service->url == NULL || service->url[0] == '\0' || !service->enabled) continue; - prov = camel_session_get_provider (session, service->url, &ex); - if (prov == NULL) { - /* FIXME: real error dialog */ - g_warning ("couldn't get service %s: %s\n", service->url, - camel_exception_get_description (&ex)); - camel_exception_clear (&ex); - continue; - } - - /* FIXME: this case is ambiguous for things like the - * mbox provider, which can really be a spool - * (/var/spool/mail/user) or a storage (~/mail/, eg). - * That issue can't be resolved on the provider level - * -- it's a per-URL problem. - * MPZ Added a hack to let spool protocol through temporarily ... - */ - if ((!(prov->flags & CAMEL_PROVIDER_IS_STORAGE) || - !(prov->flags & CAMEL_PROVIDER_IS_REMOTE)) - && !((strcmp(prov->protocol, "spool") == 0) - || strcmp(prov->protocol, "maildir") == 0)) - continue; - - store = camel_session_get_service (session, service->url, - CAMEL_PROVIDER_STORE, &ex); - if (store == NULL) { - /* FIXME: real error dialog */ - g_warning ("couldn't get service %s: %s\n", service->url, - camel_exception_get_description (&ex)); - camel_exception_clear (&ex); - continue; - } - - if (is_account_data) - name = g_strdup (account->name); - else - name = camel_service_get_name (store, TRUE); - - add_storage (name, service->url, store, shell, &ex); - g_free (name); - - if (camel_exception_is_set (&ex)) { - /* FIXME: real error dialog */ - g_warning ("Cannot load storage: %s", - camel_exception_get_description (&ex)); - camel_exception_clear (&ex); - } - - camel_object_unref (CAMEL_OBJECT (store)); + mail_load_storage_by_uri (shell, service->url, name); } } @@ -1029,6 +1046,30 @@ mail_remove_storage (CamelStore *store) camel_object_unref (CAMEL_OBJECT (store)); } +void +mail_remove_storage_by_uri (const char *uri) +{ + CamelProvider *prov; + CamelException ex; + + camel_exception_init (&ex); + prov = camel_session_get_provider (session, uri, &ex); + if (prov != NULL && prov->flags & CAMEL_PROVIDER_IS_STORAGE && + prov->flags & CAMEL_PROVIDER_IS_REMOTE) { + CamelService *store; + + store = camel_session_get_service (session, uri, + CAMEL_PROVIDER_STORE, &ex); + if (store != NULL) { + g_warning ("removing storage: %s", uri); + mail_remove_storage (CAMEL_STORE (store)); + camel_object_unref (CAMEL_OBJECT (store)); + } + } else + g_warning ("%s is not a remote storage.", uri); + camel_exception_clear (&ex); +} + int mail_storages_count (void) { diff --git a/mail/mail-accounts.c b/mail/mail-accounts.c index 605b7e2eb9..69a75d9cb2 100644 --- a/mail/mail-accounts.c +++ b/mail/mail-accounts.c @@ -280,28 +280,8 @@ mail_delete (GtkButton *button, gpointer data) account = gtk_clist_get_row_data (dialog->mail_accounts, sel); /* remove it from the folder-tree in the shell */ - if (account->source && account->source->url) { - MailConfigService *service = account->source; - CamelProvider *prov; - CamelException ex; - - camel_exception_init (&ex); - prov = camel_session_get_provider (session, service->url, &ex); - if (prov != NULL && prov->flags & CAMEL_PROVIDER_IS_STORAGE && - prov->flags & CAMEL_PROVIDER_IS_REMOTE) { - CamelService *store; - - store = camel_session_get_service (session, service->url, - CAMEL_PROVIDER_STORE, &ex); - if (store != NULL) { - g_warning ("removing storage: %s", service->url); - mail_remove_storage (CAMEL_STORE (store)); - camel_object_unref (CAMEL_OBJECT (store)); - } - } else - g_warning ("%s is not a remote storage.", service->url); - camel_exception_clear (&ex); - } + if (account->source && account->source->url) + mail_remove_storage_by_uri (account->source->url); /* remove it from the config file */ dialog->accounts = mail_config_remove_account (account); @@ -355,6 +335,12 @@ mail_able (GtkButton *button, gpointer data) row = dialog->accounts_row; account = gtk_clist_get_row_data (dialog->mail_accounts, row); account->source->enabled = !account->source->enabled; + + if (account->source->enabled) + mail_load_storage_by_uri (dialog->shell, account->source->url, account->name); + else + mail_remove_storage_by_uri (account->source->url); + mail_autoreceive_setup (); mail_config_write (); load_accounts (dialog); @@ -457,7 +443,6 @@ news_add_destroyed (GtkWidget *widget, gpointer data) gpointer *send = data; MailAccountsDialog *dialog; MailConfigService *service; - GSList *mini; service = send[0]; dialog = send[1]; @@ -466,9 +451,7 @@ news_add_destroyed (GtkWidget *widget, gpointer data) dialog->news = mail_config_get_news (); load_news (dialog); - mini = g_slist_prepend(NULL, service); - mail_load_storages(dialog->shell, mini, FALSE); - g_slist_free(mini); + mail_load_storage_by_uri(dialog->shell, account->source->url, account->name); dialog->news = mail_config_get_news (); load_news (dialog); diff --git a/mail/mail-config-druid.c b/mail/mail-config-druid.c index 84730f3cf0..118fb76b43 100644 --- a/mail/mail-config-druid.c +++ b/mail/mail-config-druid.c @@ -174,7 +174,6 @@ druid_finish (GnomeDruidPage *page, gpointer arg1, gpointer user_data) { MailConfigDruid *druid = user_data; MailAccountGui *gui = druid->gui; - GSList *mini; /* Add the account to our list (do it first because future steps might want to access config->accounts) */ @@ -189,9 +188,7 @@ druid_finish (GnomeDruidPage *page, gpointer arg1, gpointer user_data) mail_config_write (); /* Load up this new account */ - mini = g_slist_prepend (NULL, gui->account); - mail_load_storages (druid->shell, mini, TRUE); - g_slist_free (mini); + mail_load_storages (druid->shell, gui->account->source->url, gui->account->name); gtk_widget_destroy (GTK_WIDGET (druid)); } diff --git a/mail/mail.h b/mail/mail.h index b8254591c9..c1dc0d5acf 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -67,11 +67,13 @@ char *mail_identify_mime_part (CamelMimePart *part, MailDisplay *md); GtkWidget *mail_view_create (CamelFolder *source, const char *uid, CamelMimeMessage *msg); /* component factory for lack of a better place */ +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, gboolean is_account_data); void mail_hash_storage (CamelService *store, EvolutionStorage *storage); EvolutionStorage *mail_lookup_storage (CamelStore *store); +void mail_remove_storage_by_uri (const char *uri); void mail_remove_storage (CamelStore *store); void mail_storages_foreach (GHFunc func, gpointer data); int mail_storages_count (void); -- cgit