imap_write_args(str, args);
return str_c(str);
}
+
+void imap_write_capability(string_t *dest, const ARRAY_TYPE(const_string) *capabilities)
+{
+ string_t *cap_str;
+ string_t *cur_str;
+ const char *const *tmp;
+ if (array_is_empty(capabilities))
+ return;
+ cap_str = t_str_new(256);
+ for (tmp = array_front(capabilities); *tmp != NULL; tmp++) {
+ if (str_begins_with(*tmp, "IMAP4"))
+ cur_str = dest;
+ else
+ cur_str = cap_str;
+ if (str_len(cur_str) > 0)
+ str_append_c(cur_str, ' ');
+ str_append(cur_str, *tmp);
+ }
+ if (str_len(cap_str) > 0) {
+ if (str_len(dest) > 0)
+ str_append_c(dest, ' ');
+ str_append(dest, str_c(cap_str));
+ }
+}
/* Like imap_write_args(), but return the string allocated from data stack. */
const char *imap_args_to_str(const struct imap_arg *args);
+/* Writes capabilities from boollist to string.
+ Capabilities beginning with IMAP4 are written first
+ to avoid breaking clients that expect IMAP4rev1 to be the first. */
+void imap_write_capability(string_t *dest, const ARRAY_TYPE(const_string) *capabilities);
+
#endif
test_end();
}
+static void test_imap_write_capabilities(void)
+{
+ ARRAY_TYPE(const_string) capabilities;
+ t_array_init(&capabilities, 5);
+ const char *const unsorted_capabilities[] = {
+ "foo", "bar", "IMAP4rev1", "baz", "IMAP4rev2"
+ };
+ array_append(&capabilities, unsorted_capabilities, N_ELEMENTS(unsorted_capabilities));
+ string_t *cap_str = t_str_new(256);
+
+ test_begin("imap_write_capabilities");
+ imap_write_capability(cap_str, &capabilities);
+ test_assert_strcmp(str_c(cap_str), "IMAP4rev1 IMAP4rev2 foo bar baz");
+ test_end();
+}
+
int main(void)
{
static void (*const test_functions[])(void) = {
test_imap_parse_system_flag,
test_imap_write_arg,
+ test_imap_write_capabilities,
NULL
};
return test_run(test_functions);