aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog28
-rw-r--r--mail/component-factory.c50
-rw-r--r--mail/mail-config.c59
-rw-r--r--mail/mail-local.c10
-rw-r--r--mail/mail-offline-handler.c3
-rw-r--r--mail/mail-send-recv.c9
6 files changed, 97 insertions, 62 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index c78a2251eb..8351b96703 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,5 +1,33 @@
2001-10-01 Dan Winship <danw@ximian.com>
+ * component-factory.c (mail_load_storage_by_uri): create storages
+ for providers that are STORAGE and aren't EXTERNAL, rather than
+ "(STORAGE and REMOTE) or spool, maildir, or vfolder".
+ (mail_remove_storage_by_uri): Use the same rule here (which makes
+ it possible now to remove maildir and spool stores now, which
+ weren't properly special-cased before). Remove some CamelException
+ misuse.
+
+ * mail-config.c (new_source_created): Fix up the broken INBOX-
+ shortcut-generating assumption a little by only assuming that if
+ you call camel_store_get_inbox(), that its full_name is the same
+ as its path. (This happens to always be true for inboxes now, and
+ will be always true by definition at some point in the future.)
+ Now maildir stores get working Inbox shortcuts.
+
+ * mail-send-recv.c (get_receive_type): If PROVIDER_IS_STORAGE
+ then use SEND_UPDATE, if not, use SEND_RECEIVE.
+
+ * mail-local.c (local_provider): The local provider is EXTERNAL.
+ (The shell creates it.)
+ (mail_local_reconfigure_folder): Allow reconfiguring between
+ IS_LOCAL providers.
+
+ * mail-accounts.c (news_delete): Don't need to check the provider
+ flags here... we know nntp is a STORAGE.
+
+2001-10-01 Dan Winship <danw@ximian.com>
+
* mail-local.c (mail_local_reconfigure_folder): Don't use
mail_tool_get_folder_name here since that function only existed to
be clever in a certain case that this is not.
diff --git a/mail/component-factory.c b/mail/component-factory.c
index 4bb72ff0ed..9cf5cf47e2 100644
--- a/mail/component-factory.c
+++ b/mail/component-factory.c
@@ -1056,20 +1056,9 @@ mail_load_storage_by_uri (GNOME_Evolution_Shell shell, const char *uri, const ch
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 ...
- * And vfolder, and maildir ...
- */
- if ((!(prov->flags & CAMEL_PROVIDER_IS_STORAGE) ||
- !(prov->flags & CAMEL_PROVIDER_IS_REMOTE))
- && !((strcmp (prov->protocol, "spool") == 0)
- || (strcmp (prov->protocol, "maildir") == 0)
- || (strcmp (prov->protocol, "vfolder") == 0)))
+
+ if (!(prov->flags & CAMEL_PROVIDER_IS_STORAGE) ||
+ (prov->flags & CAMEL_PROVIDER_IS_EXTERNAL))
return;
store = camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex);
@@ -1189,27 +1178,20 @@ 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 {
- /* why make the caller redundantly check this? */
- /*g_warning ("%s is not a remote storage.", uri);*/
- }
+ CamelService *store;
- camel_exception_clear (&ex);
+ prov = camel_session_get_provider (session, uri, NULL);
+ if (!prov)
+ return;
+ if (!(prov->flags & CAMEL_PROVIDER_IS_STORAGE) ||
+ (prov->flags & CAMEL_PROVIDER_IS_EXTERNAL))
+ return;
+
+ store = camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, NULL);
+ if (store != NULL) {
+ mail_remove_storage (CAMEL_STORE (store));
+ camel_object_unref (CAMEL_OBJECT (store));
+ }
}
int
diff --git a/mail/mail-config.c b/mail/mail-config.c
index 7372f664e3..e3240e8aac 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -46,12 +46,14 @@
#include <gal/util/e-util.h>
#include <gal/unicode/gunicode.h>
+#include <gal/widgets/e-gui-utils.h>
#include <e-util/e-html-utils.h>
#include <e-util/e-url.h>
#include <e-util/e-unicode-i18n.h>
#include "mail.h"
#include "mail-config.h"
#include "mail-mt.h"
+#include "mail-tools.h"
#include "Mail.h"
@@ -1520,10 +1522,9 @@ add_shortcut_entry (const char *name, const char *uri, const char *type)
extern EvolutionShellClient *global_shell_client;
CORBA_Environment ev;
GNOME_Evolution_Shortcuts shortcuts_interface;
- GNOME_Evolution_Shortcuts_GroupList *groups;
GNOME_Evolution_Shortcuts_Group *the_group;
GNOME_Evolution_Shortcuts_Shortcut *the_shortcut;
- int i, group_num;
+ int i;
if (!global_shell_client)
return;
@@ -1590,6 +1591,8 @@ static void
new_source_created (MailConfigAccount *account)
{
CamelProvider *prov;
+ CamelFolder *inbox;
+ CamelException ex;
gchar *name;
gchar *url;
@@ -1597,28 +1600,52 @@ new_source_created (MailConfigAccount *account)
if (!account->source || !account->source->url)
return;
- prov = camel_session_get_provider (session, account->source->url, NULL);
+ camel_exception_init (&ex);
+ prov = camel_session_get_provider (session, account->source->url, &ex);
+ if (camel_exception_is_set (&ex)) {
+ g_warning ("Configured provider that doesn't exist?");
+ camel_exception_clear (&ex);
+ return;
+ }
/* not a storage, don't bother. */
-
if (!(prov->flags & CAMEL_PROVIDER_IS_STORAGE))
return;
- /* right now, the URL always works basically as a matter of luck...
- * both IMAP and mbox spool stores have INBOX as their inbox folder
- * name. I don't think this will work with maildir. How can we figure out
- * what shortcut to insert?
- */
+ inbox = mail_tool_get_inbox (account->source->url, &ex);
+ if (camel_exception_is_set (&ex)) {
+ e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
+ _("Could not get inbox for new mail store:\n%s\n"
+ "No shortcut will be created."),
+ camel_exception_get_description (&ex));
+ camel_exception_clear (&ex);
+ return;
+ }
- name = g_strdup_printf (U_("%s: Inbox"), account->name);
- url = g_strdup_printf ("evolution:/%s/INBOX", account->name);
- add_shortcut_entry (name, url, "mail");
- g_free (name);
- g_free (url);
+ if (inbox) {
+ /* Create the shortcut. FIXME: This only works if the
+ * full name matches the path.
+ */
+ name = g_strdup_printf (U_("%s: Inbox"), account->name);
+ url = g_strdup_printf ("evolution:/%s/%s", account->name,
+ inbox->full_name);
+ add_shortcut_entry (name, url, "mail");
+ g_free (name);
+ g_free (url);
+
+ /* If we unref inbox here, it will disconnect from the
+ * store, but then add_new_storage will reconnect. So
+ * we'll keep holding the ref until after that.
+ */
+ }
- /* while we're here, add the storage to the folder tree */
+ if (!(prov->flags & CAMEL_PROVIDER_IS_EXTERNAL)) {
+ /* add the storage to the folder tree */
+ add_new_storage (account->source->url, account->name);
+ }
- add_new_storage (account->source->url, account->name);
+ if (inbox)
+ camel_object_unref (CAMEL_OBJECT (inbox));
}
void
diff --git a/mail/mail-local.c b/mail/mail-local.c
index 32a2ad6c60..759c464737 100644
--- a/mail/mail-local.c
+++ b/mail/mail-local.c
@@ -888,7 +888,8 @@ static void mail_local_store_remove_folder(MailLocalStore *mls, const char *path
static CamelProvider local_provider = {
"file", "Local mail", NULL, "mail",
- CAMEL_PROVIDER_IS_STORAGE, CAMEL_URL_NEED_PATH,
+ CAMEL_PROVIDER_IS_STORAGE | CAMEL_PROVIDER_IS_EXTERNAL,
+ CAMEL_URL_NEED_PATH,
/* ... */
};
@@ -1227,11 +1228,8 @@ mail_local_reconfigure_folder (FolderBrowser *fb)
while (p) {
CamelProvider *cp = p->data;
- /* we only want local storages */
- /* hack it so we also dont see file or spool stores, which aren't really meant for this */
- if ((cp->flags & (CAMEL_PROVIDER_IS_REMOTE|CAMEL_PROVIDER_IS_STORAGE)) == CAMEL_PROVIDER_IS_STORAGE
- && strcmp(cp->protocol, "file")
- && strcmp(cp->protocol, "spool")) {
+ /* we only want local providers */
+ if (cp->flags & CAMEL_PROVIDER_IS_LOCAL) {
GtkWidget *item;
char *label;
diff --git a/mail/mail-offline-handler.c b/mail/mail-offline-handler.c
index dfa3af7d53..e613bb394f 100644
--- a/mail/mail-offline-handler.c
+++ b/mail/mail-offline-handler.c
@@ -45,7 +45,8 @@ struct _MailOfflineHandlerPrivate {
static gboolean
service_is_relevant (CamelService *service, gboolean going_offline)
{
- if (!(service->provider->flags & CAMEL_PROVIDER_IS_REMOTE))
+ if (!(service->provider->flags & CAMEL_PROVIDER_IS_REMOTE) ||
+ (service->provider->flags & CAMEL_PROVIDER_IS_EXTERNAL))
return FALSE;
if (CAMEL_IS_DISCO_STORE (service) && going_offline &&
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index db5e23483a..d1d619b0dd 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -253,9 +253,10 @@ format_url(const char *internal_url)
static send_info_t get_receive_type(const char *url)
{
- if (!strncmp(url, "imap:", 5)
- || !strncmp(url, "spool:", 6)
- || !strncmp(url, "maildir:", 8))
+ CamelProvider *provider;
+
+ provider = camel_session_get_provider (session, url, NULL);
+ if (provider->flags & CAMEL_PROVIDER_IS_STORAGE)
return SEND_UPDATE;
else
return SEND_RECEIVE;
@@ -301,7 +302,6 @@ build_dialogue (GSList *sources, CamelFolder *outbox, const char *destination)
info = g_hash_table_lookup (data->active, source->url);
if (info == NULL) {
info = g_malloc0 (sizeof (*info));
- /* imap and spool are handled differently */
info->type = get_receive_type(source->url);
d(printf("adding source %s\n", source->url));
@@ -795,7 +795,6 @@ mail_receive_uri (const char *uri, int keep)
d(printf("starting non-interactive download of '%s'\n", uri));
info = g_malloc0 (sizeof (*info));
- /* imap is handled differently */
info->type = get_receive_type(uri);
info->bar = NULL;
info->status = NULL;