Mercurial > dovecot > core-2.2
changeset 1022:09bac2875ed8 HEAD
Support for LITERAL+ extension.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 23 Jan 2003 05:17:09 +0200 |
parents | 81cbc1467097 |
children | dc660f588218 |
files | configure.in src/imap/cmd-append.c src/lib-imap/imap-parser.c src/lib-imap/imap-parser.h |
diffstat | 4 files changed, 31 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in Wed Jan 22 22:46:36 2003 +0200 +++ b/configure.in Thu Jan 23 05:17:09 2003 +0200 @@ -792,7 +792,7 @@ dnl ** capabilities dnl ** -capability="IMAP4rev1 SORT THREAD=REFERENCES MULTIAPPEND UNSELECT" +capability="IMAP4rev1 SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+" AC_DEFINE_UNQUOTED(CAPABILITY_STRING, "$capability", IMAP capabilities) dnl **
--- a/src/imap/cmd-append.c Wed Jan 22 22:46:36 2003 +0200 +++ b/src/imap/cmd-append.c Thu Jan 23 05:17:09 2003 +0200 @@ -14,7 +14,8 @@ internal_date may be NULL as a result, but mailbox and msg_size are always set when successful. */ static int validate_args(struct imap_arg *args, struct imap_arg_list **flags, - const char **internal_date, uoff_t *msg_size) + const char **internal_date, uoff_t *msg_size, + int *nonsync) { /* [<flags>] */ if (args->type != IMAP_ARG_LIST) @@ -32,9 +33,11 @@ args++; } - if (args->type != IMAP_ARG_LITERAL_SIZE) + if (args->type != IMAP_ARG_LITERAL_SIZE && + args->type != IMAP_ARG_LITERAL_SIZE_NONSYNC) return FALSE; + *nonsync = args->type == IMAP_ARG_LITERAL_SIZE_NONSYNC; *msg_size = IMAP_ARG_LITERAL_SIZE(args); return TRUE; } @@ -51,7 +54,7 @@ const char *mailbox, *internal_date_str; uoff_t msg_size; unsigned int count; - int ret, failed, timezone_offset; + int ret, failed, timezone_offset, nonsync; /* <mailbox> */ if (!client_read_string_args(client, 1, &mailbox)) @@ -122,7 +125,7 @@ } if (!validate_args(args, &flags_list, &internal_date_str, - &msg_size)) { + &msg_size, &nonsync)) { /* error */ client_send_command_error(client, "Invalid arguments."); break; @@ -154,8 +157,10 @@ break; } - o_stream_send(client->output, "+ OK\r\n", 6); - o_stream_flush(client->output); + if (!nonsync) { + o_stream_send(client->output, "+ OK\r\n", 6); + o_stream_flush(client->output); + } /* save the mail */ i_stream_set_read_limit(client->input,
--- a/src/lib-imap/imap-parser.c Wed Jan 22 22:46:36 2003 +0200 +++ b/src/lib-imap/imap-parser.c Thu Jan 23 05:17:09 2003 +0200 @@ -42,6 +42,7 @@ const char *error; unsigned int literal_skip_crlf:1; + unsigned int literal_nonsync:1; unsigned int inside_bracket:1; unsigned int eol:1; }; @@ -233,7 +234,9 @@ arg->_data.str = p_strndup(parser->pool, data, size); } else { /* save literal size */ - arg->type = IMAP_ARG_LITERAL_SIZE; + arg->type = parser->literal_nonsync ? + IMAP_ARG_LITERAL_SIZE_NONSYNC : + IMAP_ARG_LITERAL_SIZE; arg->_data.literal_size = parser->literal_size; } break; @@ -334,7 +337,7 @@ return FALSE; } - if (parser->output != NULL) { + if (parser->output != NULL && !parser->literal_nonsync) { o_stream_send(parser->output, "+ OK\r\n", 6); o_stream_flush(parser->output); } @@ -360,6 +363,16 @@ return imap_parser_literal_end(parser); } + if (parser->literal_nonsync) { + parser->error = "Expecting '}' after '+'"; + return FALSE; + } + + if (data[i] == '+') { + parser->literal_nonsync = TRUE; + continue; + } + if (data[i] < '0' || data[i] > '9') { parser->error = "Invalid literal size"; return FALSE; @@ -455,6 +468,7 @@ case '{': parser->cur_type = ARG_PARSE_LITERAL; parser->literal_size = 0; + parser->literal_nonsync = FALSE; break; case '(': imap_parser_open_list(parser);
--- a/src/lib-imap/imap-parser.h Wed Jan 22 22:46:36 2003 +0200 +++ b/src/lib-imap/imap-parser.h Thu Jan 23 05:17:09 2003 +0200 @@ -16,6 +16,7 @@ IMAP_ARG_ATOM, IMAP_ARG_STRING, IMAP_ARG_LITERAL_SIZE, + IMAP_ARG_LITERAL_SIZE_NONSYNC, IMAP_ARG_LIST, IMAP_ARG_EOL /* end of argument list */ @@ -40,7 +41,8 @@ (arg)->_data.str : _imap_arg_str_error(arg)) #define IMAP_ARG_LITERAL_SIZE(arg) \ - ((arg)->type == IMAP_ARG_LITERAL_SIZE ? \ + (((arg)->type == IMAP_ARG_LITERAL_SIZE || \ + (arg)->type == IMAP_ARG_LITERAL_SIZE_NONSYNC) ? \ (arg)->_data.literal_size : _imap_arg_literal_size_error(arg)) #define IMAP_ARG_LIST(arg) \