Mercurial > dovecot > original-hg > dovecot-1.2
diff src/lib-storage/index/maildir/maildir-sync.c @ 5899:f29b93c0519c HEAD
Moved maildir filename related functions to maildir-filename.c
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 08 Jul 2007 20:13:12 +0300 |
parents | f8caf3c6a5a7 |
children | 3764697932ae |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-sync.c Sun Jul 08 19:57:09 2007 +0300 +++ b/src/lib-storage/index/maildir/maildir-sync.c Sun Jul 08 20:13:12 2007 +0300 @@ -179,6 +179,7 @@ #include "maildir-storage.h" #include "maildir-uidlist.h" #include "maildir-keywords.h" +#include "maildir-filename.h" #include "maildir-sync.h" #include <stdio.h> @@ -243,169 +244,6 @@ return ctx->keywords_sync_ctx; } -int maildir_filename_get_flags(struct maildir_keywords_sync_ctx *ctx, - const char *fname, enum mail_flags *flags_r, - ARRAY_TYPE(keyword_indexes) *keywords_r) -{ - const char *info; - - array_clear(keywords_r); - *flags_r = 0; - - info = strchr(fname, MAILDIR_INFO_SEP); - if (info == NULL || info[1] != '2' || info[2] != MAILDIR_FLAGS_SEP) - return 0; - - for (info += 3; *info != '\0' && *info != MAILDIR_FLAGS_SEP; info++) { - switch (*info) { - case 'R': /* replied */ - *flags_r |= MAIL_ANSWERED; - break; - case 'S': /* seen */ - *flags_r |= MAIL_SEEN; - break; - case 'T': /* trashed */ - *flags_r |= MAIL_DELETED; - break; - case 'D': /* draft */ - *flags_r |= MAIL_DRAFT; - break; - case 'F': /* flagged */ - *flags_r |= MAIL_FLAGGED; - break; - default: - if (*info >= MAILDIR_KEYWORD_FIRST && - *info <= MAILDIR_KEYWORD_LAST) { - int idx; - - idx = maildir_keywords_char_idx(ctx, *info); - if (idx < 0) { - /* unknown keyword. */ - break; - } - - array_append(keywords_r, - (unsigned int *)&idx, 1); - break; - } - - /* unknown flag - ignore */ - break; - } - } - - return 1; -} - -static int char_cmp(const void *p1, const void *p2) -{ - const unsigned char *c1 = p1, *c2 = p2; - - return *c1 - *c2; -} - -static void -maildir_filename_append_keywords(struct maildir_keywords_sync_ctx *ctx, - ARRAY_TYPE(keyword_indexes) *keywords, - string_t *str) -{ - const unsigned int *indexes; - unsigned int i, count, start = str_len(str); - char chr; - - indexes = array_get(keywords, &count); - for (i = 0; i < count; i++) { - chr = maildir_keywords_idx_char(ctx, indexes[i]); - if (chr != '\0') - str_append_c(str, chr); - } - - qsort(str_c_modifiable(str) + start, str_len(str) - start, 1, char_cmp); -} - -const char *maildir_filename_set_flags(struct maildir_keywords_sync_ctx *ctx, - const char *fname, enum mail_flags flags, - ARRAY_TYPE(keyword_indexes) *keywords) -{ - string_t *flags_str; - enum mail_flags flags_left; - const char *info, *oldflags; - int nextflag; - - /* remove the old :info from file name, and get the old flags */ - info = strrchr(fname, MAILDIR_INFO_SEP); - if (info != NULL && strrchr(fname, '/') > info) - info = NULL; - - oldflags = ""; - if (info != NULL) { - fname = t_strdup_until(fname, info); - if (info[1] == '2' && info[2] == MAILDIR_FLAGS_SEP) - oldflags = info+3; - } - - /* insert the new flags between old flags. flags must be sorted by - their ASCII code. unknown flags are kept. */ - flags_str = t_str_new(256); - str_append(flags_str, fname); - str_append(flags_str, MAILDIR_FLAGS_FULL_SEP); - flags_left = flags; - for (;;) { - /* skip all known flags */ - while (*oldflags == 'D' || *oldflags == 'F' || - *oldflags == 'R' || *oldflags == 'S' || - *oldflags == 'T' || - (*oldflags >= MAILDIR_KEYWORD_FIRST && - *oldflags <= MAILDIR_KEYWORD_LAST)) - oldflags++; - - nextflag = *oldflags == '\0' || *oldflags == MAILDIR_FLAGS_SEP ? - 256 : (unsigned char) *oldflags; - - if ((flags_left & MAIL_DRAFT) && nextflag > 'D') { - str_append_c(flags_str, 'D'); - flags_left &= ~MAIL_DRAFT; - } - if ((flags_left & MAIL_FLAGGED) && nextflag > 'F') { - str_append_c(flags_str, 'F'); - flags_left &= ~MAIL_FLAGGED; - } - if ((flags_left & MAIL_ANSWERED) && nextflag > 'R') { - str_append_c(flags_str, 'R'); - flags_left &= ~MAIL_ANSWERED; - } - if ((flags_left & MAIL_SEEN) && nextflag > 'S') { - str_append_c(flags_str, 'S'); - flags_left &= ~MAIL_SEEN; - } - if ((flags_left & MAIL_DELETED) && nextflag > 'T') { - str_append_c(flags_str, 'T'); - flags_left &= ~MAIL_DELETED; - } - - if (keywords != NULL && array_is_created(keywords) && - nextflag > MAILDIR_KEYWORD_FIRST) { - maildir_filename_append_keywords(ctx, keywords, - flags_str); - keywords = NULL; - } - - if (*oldflags == '\0' || *oldflags == MAILDIR_FLAGS_SEP) - break; - - str_append_c(flags_str, *oldflags); - oldflags++; - } - - if (*oldflags == MAILDIR_FLAGS_SEP) { - /* another flagset, we don't know about these, just keep them */ - while (*oldflags != '\0') - str_append_c(flags_str, *oldflags++); - } - - return str_c(flags_str); -} - static int maildir_expunge(struct maildir_mailbox *mbox, const char *path, struct maildir_index_sync_context *ctx) {