summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J Stevens <paul@nfg.nl>2010-04-14 09:55:02 +0200
committerPaul J Stevens <paul@nfg.nl>2010-04-14 09:58:17 +0200
commit3f41ea95cafef3263622d539bafc8cb9471d2de5 (patch)
tree5c852bf16561dc3fca8948e04237979f48db409f
parent13cd60b3d6c9ab116c0db3c4f6e720798ad51e2c (diff)
respect capability configuration
-rw-r--r--src/dm_capa.c38
-rw-r--r--test/check_dbmail_capa.c12
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