summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Woodhouse <David.Woodhouse@intel.com>2010-06-25 00:01:36 +0100
committerDavid Woodhouse <David.Woodhouse@intel.com>2010-06-28 13:47:01 +0100
commit4e67e5e3af04dc450bcfcf773d82cea41a0aa1f4 (patch)
tree5fddc7a607c36c07d63879878c07248b4187c046
parentb446ab5b3a950959fb282acfc066f3c2094269a5 (diff)
downloadevolution-data-server-4e67e5e3af04dc450bcfcf773d82cea41a0aa1f4.tar.gz
Use LIST-EXTENDED to return subscribed status from LIST
If the server supports LIST-EXTENDED, we don't have to follow the initial LIST with an LSUB command to see which folders are subscribed -- we can just ask it to tell us the subscribed status in the LIST responses. (cherry picked from commit 9445941f962f42cc513903a12d3036d9607bae4c)
-rw-r--r--camel/providers/imapx/camel-imapx-server.c10
-rw-r--r--camel/providers/imapx/camel-imapx-server.h2
-rw-r--r--camel/providers/imapx/camel-imapx-store.c26
-rw-r--r--camel/providers/imapx/camel-imapx-utils.c1
4 files changed, 27 insertions, 12 deletions
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index a2527ee57..a17c6d150 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -289,6 +289,7 @@ struct _CamelIMAPXJob {
struct {
gchar *pattern;
guint32 flags;
+ const gchar *ext;
GHashTable *folders;
} list;
@@ -3683,6 +3684,11 @@ imapx_job_list_start(CamelIMAPXServer *is, CamelIMAPXJob *job)
ic = camel_imapx_command_new(is, "LIST", NULL, "%s \"\" %s",
(job->u.list.flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED)?"LSUB":"LIST",
job->u.list.pattern);
+ if (job->u.list.ext) {
+ /* Hm, we need a way to add atoms _without_ quoting or using literals */
+ camel_imapx_command_add(ic, " ");
+ camel_imapx_command_add(ic, job->u.list.ext);
+ }
ic->pri = job->pri;
ic->job = job;
ic->complete = imapx_command_list_done;
@@ -4911,7 +4917,8 @@ imapx_list_cmp(gconstpointer ap, gconstpointer bp)
}
GPtrArray *
-camel_imapx_server_list(CamelIMAPXServer *is, const gchar *top, guint32 flags, CamelException *ex)
+camel_imapx_server_list(CamelIMAPXServer *is, const gchar *top, guint32 flags,
+ const gchar *ext, CamelException *ex)
{
CamelIMAPXJob *job;
GPtrArray *folders = NULL;
@@ -4924,6 +4931,7 @@ camel_imapx_server_list(CamelIMAPXServer *is, const gchar *top, guint32 flags, C
job->start = imapx_job_list_start;
job->pri = IMAPX_PRIORITY_LIST;
job->ex = ex;
+ job->u.list.ext = ext;
job->u.list.flags = flags;
job->u.list.folders = g_hash_table_new(imapx_name_hash, imapx_name_equal);
job->u.list.pattern = g_alloca(strlen(encoded_name)+5);
diff --git a/camel/providers/imapx/camel-imapx-server.h b/camel/providers/imapx/camel-imapx-server.h
index 2e3729a6e..502769dd0 100644
--- a/camel/providers/imapx/camel-imapx-server.h
+++ b/camel/providers/imapx/camel-imapx-server.h
@@ -119,7 +119,7 @@ CamelIMAPXServer *camel_imapx_server_new(struct _CamelStore *store, struct _Came
gboolean camel_imapx_server_connect(CamelIMAPXServer *is, gint state, CamelException *ex);
gboolean imapx_connect_to_server (CamelIMAPXServer *is, CamelException *ex);
-GPtrArray *camel_imapx_server_list(CamelIMAPXServer *is, const gchar *top, guint32 flags, CamelException *ex);
+GPtrArray *camel_imapx_server_list(CamelIMAPXServer *is, const gchar *top, guint32 flags, const gchar *ext, CamelException *ex);
void camel_imapx_server_refresh_info(CamelIMAPXServer *is, CamelFolder *folder, struct _CamelException *ex);
void camel_imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, CamelException *ex);
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index 2493fa642..be086d806 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -969,11 +969,11 @@ imapx_get_folders_free(gpointer k, gpointer v, gpointer d)
}
static void
-fetch_folders_for_pattern (CamelIMAPXStore *istore, const gchar *pattern, guint32 flags, GHashTable *table, CamelException *ex)
+fetch_folders_for_pattern (CamelIMAPXStore *istore, const gchar *pattern, guint32 flags, const gchar *ext, GHashTable *table, CamelException *ex)
{
GPtrArray *folders = NULL;
- folders = camel_imapx_server_list (istore->server, pattern, flags, ex);
+ folders = camel_imapx_server_list (istore->server, pattern, flags, ext, ex);
if (camel_exception_is_set (ex))
return;
@@ -1017,6 +1017,7 @@ fetch_folders_for_namespaces (CamelIMAPXStore *istore, const gchar *pattern, gbo
while (ns) {
guint32 flags = 0;
gchar *pat = NULL;
+ const gchar *list_ext = NULL;
if (!pattern) {
if (!*ns->path)
@@ -1029,20 +1030,25 @@ fetch_folders_for_namespaces (CamelIMAPXStore *istore, const gchar *pattern, gbo
if (sync)
flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST;
+ if (istore->server->cinfo->capa & IMAPX_CAPABILITY_LIST_EXTENDED)
+ list_ext = "RETURN (SUBSCRIBED)";
+
flags |= CAMEL_STORE_FOLDER_INFO_RECURSIVE;
- fetch_folders_for_pattern (istore, pat, flags, folders, ex);
+ fetch_folders_for_pattern (istore, pat, flags, list_ext, folders, ex);
if (camel_exception_is_set (ex)) {
g_free (pat);
goto exception;
}
-
- flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
- fetch_folders_for_pattern (istore, pat, flags, folders, ex);
- if (camel_exception_is_set (ex)) {
- g_free (pat);
- goto exception;
+ if (!list_ext) {
+ /* If the server doesn't support LIST-EXTENDED then we have to
+ issue LSUB to list the subscribed folders separately */
+ flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
+ fetch_folders_for_pattern (istore, pat, flags, NULL, folders, ex);
+ if (camel_exception_is_set (ex)) {
+ g_free (pat);
+ goto exception;
+ }
}
-
g_free (pat);
if (pattern)
diff --git a/camel/providers/imapx/camel-imapx-utils.c b/camel/providers/imapx/camel-imapx-utils.c
index df2db279e..274736d58 100644
--- a/camel/providers/imapx/camel-imapx-utils.c
+++ b/camel/providers/imapx/camel-imapx-utils.c
@@ -1790,6 +1790,7 @@ static struct {
{ "\\NOSELECT", CAMEL_FOLDER_NOSELECT },
{ "\\MARKED", 1<< 16},
{ "\\UNMARKED", 1<< 17},
+ { "\\SUBSCRIBED", CAMEL_FOLDER_SUBSCRIBED },
};
struct _list_info *