diff options
author | Paul J Stevens <paul@nfg.nl> | 2010-04-14 09:55:02 +0200 |
---|---|---|
committer | Paul J Stevens <paul@nfg.nl> | 2010-04-14 09:58:17 +0200 |
commit | 3f41ea95cafef3263622d539bafc8cb9471d2de5 (patch) | |
tree | 5c852bf16561dc3fca8948e04237979f48db409f | |
parent | 13cd60b3d6c9ab116c0db3c4f6e720798ad51e2c (diff) |
respect capability configuration
-rw-r--r-- | src/dm_capa.c | 38 | ||||
-rw-r--r-- | test/check_dbmail_capa.c | 12 |
2 files changed, 33 insertions, 17 deletions
diff --git a/src/dm_capa.c b/src/dm_capa.c index 2166a8e9..ca85e4f5 100644 --- a/src/dm_capa.c +++ b/src/dm_capa.c @@ -32,14 +32,14 @@ struct T { const char capabilities[MAX_CAPASIZE]; - const char max_set[MAX_CAPASIZE]; + GList *max_set; GList *current_set; gboolean dirty; }; -static GList *capa_search(T A, const char *c) +static GList *capa_search(GList *set, const char *c) { - return g_list_find_custom(A->current_set, c, (GCompareFunc)strcasecmp); + return g_list_find_custom(set, c, (GCompareFunc)strcasecmp); } static void capa_update(T A) @@ -55,20 +55,28 @@ static void capa_update(T A) T Capa_new(void) { field_t val; + char maxcapa[MAX_CAPASIZE]; T A; A = g_malloc0(sizeof(*A)); char **v, **h; + memset(&maxcapa,0,sizeof(maxcapa)); + GETCONFIGVALUE("capability", "IMAP", val); if (strlen(val) > 0) - strncpy((char *)A->max_set, val, MAX_CAPASIZE-1); + strncpy((char *)maxcapa, val, MAX_CAPASIZE-1); else - strncpy((char *)A->max_set, IMAP_CAPABILITY_STRING, MAX_CAPASIZE-1); + strncpy((char *)maxcapa, IMAP_CAPABILITY_STRING, MAX_CAPASIZE-1); + A->max_set = NULL; A->current_set = NULL; - h = v = g_strsplit(A->max_set, " ", -1); - while (*v) A->current_set = g_list_append(A->current_set, *v++); + h = v = g_strsplit(maxcapa, " ", -1); + while (*v) { + A->max_set = g_list_append(A->max_set, *v); + A->current_set = g_list_append(A->current_set, *v++); + } + g_free(h); A->dirty = TRUE; @@ -83,21 +91,24 @@ const gchar * Capa_as_string(T A) gboolean Capa_match(T A, const char *c) { - return capa_search(A, c)?TRUE:FALSE; + return capa_search(A->current_set, c)?TRUE:FALSE; } void Capa_add(T A, const char *c) { - A->current_set = g_list_append(A->current_set, g_strdup(c)); - A->dirty = TRUE; + GList *element = capa_search(A->max_set, c); + if (element) { + A->current_set = g_list_append(A->current_set, element->data); + A->dirty = TRUE; + } } void Capa_remove(T A, const char * c) { - GList *element = capa_search(A, c); + GList *element = capa_search(A->current_set, c); if (element) { A->current_set = g_list_remove_link(A->current_set, element); - g_list_destroy(element); + g_list_free(element); A->dirty = TRUE; } } @@ -105,7 +116,8 @@ void Capa_remove(T A, const char * c) void Capa_free(T *A) { T c = *A; - if (c->current_set) g_list_destroy(c->current_set); + if (c->current_set) g_list_free(g_list_first(c->current_set)); + if (c->max_set) g_list_destroy(c->max_set); if (c) g_free(c); c = NULL; } diff --git a/test/check_dbmail_capa.c b/test/check_dbmail_capa.c index e67ceb54..95bf4899 100644 --- a/test/check_dbmail_capa.c +++ b/test/check_dbmail_capa.c @@ -70,10 +70,14 @@ END_TEST START_TEST(test_capa_add) { - char *ex1 = "IMAP4rev1 AUTH=LOGIN AUTH=CRAM-MD5 ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE STARTTLS ID BLAHCAPA"; - Capa_add(A, "BLAHCAPA"); - fail_unless(Capa_match(A, "BLAHCAPA"), "add failed\n[%s] !=\n[%s]\n", ex1, Capa_as_string(A)); - fail_unless(MATCH(Capa_as_string(A), ex1), "add failed\n[%s] !=\n[%s]\n", ex1, Capa_as_string(A)); + char *ex1 = "IMAP4rev1 AUTH=LOGIN AUTH=CRAM-MD5 ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE STARTTLS"; + char *ex2 = "IMAP4rev1 AUTH=LOGIN AUTH=CRAM-MD5 ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE STARTTLS ID"; + Capa_remove(A, "ID"); + fail_unless(! Capa_match(A, "ID"), "remove failed\n[%s] !=\n[%s]\n", ex1, Capa_as_string(A)); + fail_unless(MATCH(Capa_as_string(A), ex1), "remove failed\n[%s] !=\n[%s]\n", ex1, Capa_as_string(A)); + Capa_add(A, "ID"); + fail_unless(Capa_match(A, "ID"), "add failed\n[%s] !=\n[%s]\n", ex2, Capa_as_string(A)); + fail_unless(MATCH(Capa_as_string(A), ex2), "add failed\n[%s] !=\n[%s]\n", ex2, Capa_as_string(A)); } END_TEST |