static bool mailbox_keywords_are_valid(struct mailbox *box, const char *const keywords[], const char **error_r) { unsigned int i; for (i = 0; keywords[i] != NULL; i++) { if (!mailbox_keyword_is_valid(box, keywords[i], error_r)) return FALSE; } return TRUE; }
static struct mail_keywords * mailbox_keywords_create_skip(struct mailbox *box, const char *const keywords[]) { struct mail_keywords *kw; T_BEGIN { ARRAY(const char *) valid_keywords; const char *error; t_array_init(&valid_keywords, 32); for (; *keywords != NULL; keywords++) { if (mailbox_keyword_is_valid(box, *keywords, &error)) array_append(&valid_keywords, keywords, 1); } array_append_zero(&valid_keywords); /* NULL-terminate */ kw = mail_index_keywords_create(box->index, keywords); } T_END; return kw; }
static void parse_imap_keywords_list(struct mbox_sync_mail_context *ctx, struct message_header_line *hdr, size_t pos) { struct mailbox *box = &ctx->sync_ctx->mbox->box; struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box); const char *keyword, *error; size_t keyword_start; unsigned int idx, count; count = 0; while (pos < hdr->full_value_len) { if (IS_LWSP_LF(hdr->full_value[pos])) { pos++; continue; } /* read the keyword */ keyword_start = pos; for (; pos < hdr->full_value_len; pos++) { if (IS_LWSP_LF(hdr->full_value[pos])) break; } /* add it to index's keyword list if it's not there already */ keyword = t_strndup(hdr->full_value + keyword_start, pos - keyword_start); if (mailbox_keyword_is_valid(&ctx->sync_ctx->mbox->box, keyword, &error)) { mail_index_keyword_lookup_or_create(box->index, keyword, &idx); } count++; } if (count != array_count(ibox->keyword_names)) { /* need to update this list */ ctx->imapbase_rewrite = TRUE; ctx->need_rewrite = TRUE; } }