mbox-sync-parse.c revision f0569d9fbb25c8437760be69f194595a841ad711
/* Copyright (C) 2004 Timo Sirainen */
#include "lib.h"
#include "buffer.h"
#include "istream.h"
#include "str.h"
#include "write-full.h"
#include "message-parser.h"
#include "mail-index.h"
#include "mbox-sync-private.h"
#include <stdlib.h>
struct mbox_flag_type mbox_status_flags[] = {
{ 'R', MAIL_SEEN },
{ 'O', MBOX_NONRECENT },
{ 0, 0 }
};
struct mbox_flag_type mbox_xstatus_flags[] = {
{ 'A', MAIL_ANSWERED },
{ 'F', MAIL_FLAGGED },
{ 'T', MAIL_DRAFT },
{ 'D', MAIL_DELETED },
{ 0, 0 }
};
struct header_func {
const char *header;
struct message_header_line *hdr);
};
struct message_header_line *hdr)
{
/* the value may contain newlines. we can't count whitespace before
and after it as a single contiguous whitespace block, as that may
get us into situation where removing whitespace goes eg.
" \n \n" -> " \n\n" which would then be treated as end of headers.
that could probably be avoided by being careful, but as newlines
should never be there (we don't generate them), it's not worth the
trouble. */
for (i = hdr->full_value_len; i > 0; i--) {
break;
space++;
}
}
}
{
int i;
}
return 0;
}
struct message_header_line *hdr,
struct mbox_flag_type *flags_list)
{
size_t i;
for (i = 0; i < hdr->full_value_len; i++) {
}
}
struct message_header_line *hdr)
{
return TRUE;
}
struct message_header_line *hdr)
{
return TRUE;
}
struct message_header_line *hdr)
{
const char *str;
char *end;
/* Valid only in first message */
return FALSE;
}
/* <uid validity> <last uid> */
t_push();
t_pop();
pos++;
if (uid_validity == 0) {
/* broken */
return FALSE;
}
}
/* broken, update */
}
return TRUE;
// FIXME: save keywords
return TRUE;
}
struct message_header_line *hdr)
{
return FALSE;
/* this is the c-client style "FOLDER INTERNAL DATA" message.
skip it. */
return TRUE;
}
struct message_header_line *hdr)
{
// FIXME: parse them
return TRUE;
}
struct message_header_line *hdr)
{
size_t i;
/* duplicate */
return FALSE;
}
for (i = 0; i < hdr->full_value_len; i++) {
break;
}
/* next_uid broken - fix it */
}
/* broken - UIDs must be growing */
return FALSE;
}
/* everything was good, except we can't have X-UID before
X-IMAPbase header (to keep c-client compatibility). keep
the UID, but when we're rewriting this makes sure the
X-UID is appended after X-IMAPbase. */
return FALSE;
}
return TRUE;
}
struct message_header_line *hdr)
{
size_t i;
/* duplicate */
return FALSE;
}
for (i = 0; i < hdr->full_value_len; i++) {
break;
}
for (; i < hdr->full_value_len; i++) {
/* broken value */
return FALSE;
}
}
return TRUE;
}
static struct header_func header_funcs[] = {
{ "Content-Length", parse_content_length },
{ "Status", parse_status },
{ "X-IMAP", parse_x_imap },
{ "X-IMAPbase", parse_x_imap_base },
{ "X-Keywords", parse_x_keywords },
{ "X-Status", parse_x_status },
{ "X-UID", parse_x_uid },
};
{
int i;
return &header_funcs[i];
}
return NULL;
}
struct mbox_sync_mail_context *ctx,
int rewriting)
{
struct message_header_parser_ctx *hdr_ctx;
struct message_header_line *hdr;
struct header_func *func;
int i;
ctx->header_last_change = 0;
for (i = 0; i < MBOX_HDR_COUNT; i++)
line_start_pos = 0;
break;
}
}
/* whitespaces around ':' are non-standard. either
there's whitespace before ':' or none after.
if we're going to rewrite this message, we can't
do it partially from here after as offsets won't
match. this shouldn't happen pretty much ever, so
don't try to optimize this - just rewrite the whole
thing. */
}
/* this header is broken, remove it */
}
continue;
}
} else {
}
if (!hdr->no_newline)
}
/* missing X-IMAPbase */
}
/* update uid-last field in X-IMAPbase */
}
/* missing X-UID */
}
}