return 0;
}
-static void parse_status_flags(struct mbox_sync_mail_context *ctx,
+static bool parse_status_flags(struct mbox_sync_mail_context *ctx,
struct message_header_line *hdr,
struct mbox_flag_type *flags_list)
{
+ enum mail_flags flag;
size_t i;
+ bool duplicates = FALSE;
ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE;
for (i = 0; i < hdr->full_value_len; i++) {
- ctx->mail.flags |=
- mbox_flag_find(flags_list, hdr->full_value[i]);
+ flag = mbox_flag_find(flags_list, hdr->full_value[i]);
+ if ((ctx->mail.flags & flag) != 0)
+ duplicates = TRUE;
+ else
+ ctx->mail.flags |= flag;
}
ctx->mail.flags ^= MBOX_NONRECENT_KLUDGE;
+ return duplicates;
}
static bool parse_status(struct mbox_sync_mail_context *ctx,
struct message_header_line *hdr)
{
- parse_status_flags(ctx, hdr, mbox_status_flags);
+ if (parse_status_flags(ctx, hdr, mbox_status_flags))
+ ctx->mail.status_broken = TRUE;
ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header);
return TRUE;
}
static bool parse_x_status(struct mbox_sync_mail_context *ctx,
struct message_header_line *hdr)
{
- parse_status_flags(ctx, hdr, mbox_xstatus_flags);
+ if (parse_status_flags(ctx, hdr, mbox_xstatus_flags))
+ ctx->mail.xstatus_broken = TRUE;
ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header);
return TRUE;
}
mbox_sync_update_header_from_real(struct mbox_sync_mail_context *ctx,
const struct mbox_sync_mail *mail)
{
- if ((ctx->mail.flags & STATUS_FLAGS_MASK) !=
+ if (mail->status_broken ||
+ (ctx->mail.flags & STATUS_FLAGS_MASK) !=
(mail->flags & STATUS_FLAGS_MASK) ||
(ctx->mail.flags & MAIL_RECENT) != 0) {
ctx->mail.flags = (ctx->mail.flags & ~STATUS_FLAGS_MASK) |
ctx->mail.flags &= ~MAIL_RECENT;
mbox_sync_update_status(ctx);
}
- if ((ctx->mail.flags & XSTATUS_FLAGS_MASK) !=
+ if (mail->xstatus_broken ||
+ (ctx->mail.flags & XSTATUS_FLAGS_MASK) !=
(mail->flags & XSTATUS_FLAGS_MASK)) {
ctx->mail.flags = (ctx->mail.flags & ~XSTATUS_FLAGS_MASK) |
(mail->flags & XSTATUS_FLAGS_MASK);