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) \