changeset 13416:e5570ee5d695

imapc: Connect to server immediately at startup and lookup hierarchy separator. If connecting to server fails, this makes it fail earlier. Also we don't have to worry about what to do later if hierarchy separator lookup fails.
author Timo Sirainen <tss@iki.fi>
date Wed, 07 Sep 2011 10:38:01 +0300
parents 0e1a65d30964
children 977dcd541f69
files src/lib-storage/index/imapc/imapc-list.c src/lib-storage/index/imapc/imapc-list.h src/lib-storage/index/imapc/imapc-storage.c
diffstat 3 files changed, 31 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-list.c	Wed Sep 07 10:24:11 2011 +0300
+++ b/src/lib-storage/index/imapc/imapc-list.c	Wed Sep 07 10:38:01 2011 +0300
@@ -165,20 +165,10 @@
 static char imapc_list_get_hierarchy_sep(struct mailbox_list *_list)
 {
 	struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
-	struct imapc_simple_context ctx;
 
-	if (list->sep == '\0') {
-		imapc_simple_context_init(&ctx, list->storage);
-		imapc_client_cmdf(list->storage->client,
-				  imapc_list_simple_callback, &ctx,
-				  "LIST \"\" \"\"");
-		imapc_simple_run(&ctx);
+	/* storage should have looked this up when it was created */
+	i_assert(list->sep != '\0');
 
-		if (ctx.ret < 0) {
-			list->broken = TRUE;
-			return '/';
-		}
-	}
 	return list->sep;
 }
 
--- a/src/lib-storage/index/imapc/imapc-list.h	Wed Sep 07 10:24:11 2011 +0300
+++ b/src/lib-storage/index/imapc/imapc-list.h	Wed Sep 07 10:38:01 2011 +0300
@@ -17,9 +17,6 @@
 
 	unsigned int iter_count;
 
-	/* we've returned wrong separator. all mailbox list operations must
-	   fail from now on. */
-	unsigned int broken:1;
 	unsigned int refreshed_subscriptions:1;
 	unsigned int refreshed_mailboxes:1;
 	unsigned int index_list_failed:1;
--- a/src/lib-storage/index/imapc/imapc-storage.c	Wed Sep 07 10:24:11 2011 +0300
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Wed Sep 07 10:38:01 2011 +0300
@@ -203,6 +203,30 @@
 }
 
 static int
+imapc_storage_get_hierarchy_sep(struct imapc_storage *storage,
+				const char **error_r)
+{
+	struct imapc_simple_context sctx;
+
+	imapc_simple_context_init(&sctx, storage);
+	imapc_client_cmdf(storage->client, imapc_simple_callback, &sctx,
+			  "LIST \"\" \"\"");
+	imapc_simple_run(&sctx);
+
+	if (sctx.ret < 0) {
+		*error_r = t_strdup_printf("LIST failed: %s",
+			mail_storage_get_last_error(&storage->storage, NULL));
+		return -1;
+	}
+
+	if (storage->list->sep == '\0') {
+		*error_r = "LIST didn't return hierarchy separator";
+		return -1;
+	}
+	return sctx.ret;
+}
+
+static int
 imapc_storage_create(struct mail_storage *_storage,
 		     struct mail_namespace *ns,
 		     const char **error_r)
@@ -253,6 +277,11 @@
 	imapc_list_register_callbacks(storage->list);
 	imapc_storage_register_untagged(storage, "STATUS",
 					imapc_untagged_status);
+	/* connect to imap server and get the hierarchy separator. */
+	if (imapc_storage_get_hierarchy_sep(storage, error_r) < 0) {
+		imapc_client_deinit(&storage->client);
+		return -1;
+	}
 	return 0;
 }