diff options
-rw-r--r-- | camel/ChangeLog | 12 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap-command.c | 21 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap-engine.c | 54 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap-engine.h | 1 |
4 files changed, 79 insertions, 9 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 413374d135..ed10e180b2 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,15 @@ +2004-03-24 Jeffrey Stedfast <fejj@ximian.com> + + * providers/imap4/camel-imap-engine.c (camel_imap_engine_literal): + New convenience wrapper function. + (engine_parse_status): Fixed to handle literal mailbox strings. + + * providers/imap4/camel-imap-command.c (camel_imap_command_newv): + Changed how %L works - create the CamelIMAPLiteral for our caller + instead of expecting them to create it for us. We can autodetect + what type of object (stream vs data-wrapper) the literal is, so + it's trivial to do. + 2004-03-23 Jeffrey Stedfast <fejj@ximian.com> * providers/imap/camel-imap-folder.c (imap_get_message): Reworked diff --git a/camel/providers/imap4/camel-imap-command.c b/camel/providers/imap4/camel-imap-command.c index 4dfcb8faee..73f1f97096 100644 --- a/camel/providers/imap4/camel-imap-command.c +++ b/camel/providers/imap4/camel-imap-command.c @@ -195,11 +195,10 @@ camel_imap_command_newv (CamelIMAPEngine *engine, CamelIMAPFolder *imap_folder, if (ch == '%') { CamelIMAPLiteral *literal; CamelIMAPFolder *folder; - CamelDataWrapper *wrapper; - CamelStream *stream; unsigned int u; char *string; size_t len; + void *obj; int c, d; g_string_append_len (str, start, format - start - 1); @@ -232,7 +231,22 @@ camel_imap_command_newv (CamelIMAPEngine *engine, CamelIMAPFolder *imap_folder, break; case 'L': /* Literal */ - literal = va_arg (args, CamelIMAPLiteral *); + obj = va_arg (args, void *); + + literal = g_new (CamelIMAPLiteral, 1); + if (CAMEL_IS_DATA_WRAPPER (obj)) { + literal->type = CAMEL_IMAP_LITERAL_WRAPPER; + literal->literal.wrapper = obj; + } else if (CAMEL_IS_STREAM (obj)) { + literal->type = CAMEL_IMAP_LITERAL_STREAM; + literal->literal.stream = obj; + } else { + g_assert_not_reached (); + } + + camel_object_ref (obj); + + /* FIXME: take advantage of LITERAL+? */ len = camel_imap_literal_length (literal); g_string_append_printf (str, "{%u}\r\n", len); @@ -327,7 +341,6 @@ void camel_imap_command_unref (CamelIMAPCommand *ic) { CamelIMAPCommandPart *part, *next; - CamelIMAPLiteral *literal; int i; if (ic == NULL) diff --git a/camel/providers/imap4/camel-imap-engine.c b/camel/providers/imap4/camel-imap-engine.c index 36d2e42f9e..e7d6ce5899 100644 --- a/camel/providers/imap4/camel-imap-engine.c +++ b/camel/providers/imap4/camel-imap-engine.c @@ -579,6 +579,7 @@ engine_parse_status (CamelIMAPEngine *engine, CamelException *ex) { camel_imap_token_t token; char *mailbox; + size_t len; int type; if (camel_imap_engine_next_token (engine, &token, ex) == -1) @@ -592,7 +593,9 @@ engine_parse_status (CamelIMAPEngine *engine, CamelException *ex) mailbox = g_strdup (token.v.qstring); break; case CAMEL_IMAP_TOKEN_LITERAL: - /* FIXME: can this happen? if so implement it */ + if (camel_imap_engine_literal (engine, (unsigned char **) &mailbox, &len, err) == -1) + return -1; + break; default: fprintf (stderr, "Unexpected token in IMAP untagged STATUS response: %s%c\n", token.token == CAMEL_IMAP_TOKEN_NIL ? "NIL" : "", @@ -1582,7 +1585,7 @@ camel_imap_engine_eat_line (CamelIMAPEngine *engine, CamelException *ex) int camel_imap_engine_line (CamelIMAPEngine *engine, unsigned char **line, size_t *len, CamelException *ex) { - GByteArray *linebuf; + GByteArray *linebuf = NULL; unsigned char *buf; size_t buflen; int retval; @@ -1591,7 +1594,7 @@ camel_imap_engine_line (CamelIMAPEngine *engine, unsigned char **line, size_t *l linebuf = g_byte_array_new (); while ((retval = camel_imap_stream_line (engine->istream, &buf, &buflen)) > 0) { - if (line != NULL) + if (linebuf != NULL) g_byte_array_append (linebuf, buf, buflen); } @@ -1600,13 +1603,13 @@ camel_imap_engine_line (CamelIMAPEngine *engine, unsigned char **line, size_t *l _("IMAP server %s unexpectedly disconnected: %s"), engine->url->host, errno ? g_strerror (errno) : _("Unknown")); - if (line != NULL) + if (linebuf != NULL) g_byte_array_free (linebuf, TRUE); return -1; } - if (line != NULL) { + if (linebuf != NULL) { g_byte_array_append (linebuf, buf, buflen); *line = linebuf->data; @@ -1619,6 +1622,47 @@ camel_imap_engine_line (CamelIMAPEngine *engine, unsigned char **line, size_t *l } +int +camel_imap_engine_literal (CamelIMAPEngine *engine, unsigned char **literal, size_t *len, CamelException *ex) +{ + GByteArray *literalbuf = NULL; + unsigned char *buf; + size_t buflen; + int retval; + + if (literal != NULL) + literalbuf = g_byte_array_new (); + + while ((retval = camel_imap_stream_literal (engine->istream, &buf, &buflen)) > 0) { + if (literalbuf != NULL) + g_byte_array_append (literalbuf, buf, buflen); + } + + if (retval == -1) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("IMAP server %s unexpectedly disconnected: %s"), + engine->url->host, errno ? g_strerror (errno) : _("Unknown")); + + if (literalbuf != NULL) + g_byte_array_free (literalbuf, TRUE); + + return -1; + } + + if (literalbuf != NULL) { + g_byte_array_append (literalbuf, buf, buflen); + g_byte_array_append (literalbuf, "", 1); + + *literal = literalbuf->data; + *len = literalbuf->len - 1; + + g_byte_array_free (literalbuf, FALSE); + } + + return 0; +} + + void camel_imap_resp_code_free (CamelIMAPRespCode *rcode) { diff --git a/camel/providers/imap4/camel-imap-engine.h b/camel/providers/imap4/camel-imap-engine.h index fd125b05d1..6612693243 100644 --- a/camel/providers/imap4/camel-imap-engine.h +++ b/camel/providers/imap4/camel-imap-engine.h @@ -207,6 +207,7 @@ void camel_imap_engine_handle_untagged (CamelIMAPEngine *engine, CamelException /* stream wrapper utility functions */ int camel_imap_engine_next_token (CamelIMAPEngine *engine, struct _camel_imap_token_t *token, CamelException *ex); int camel_imap_engine_line (CamelIMAPEngine *engine, unsigned char **line, size_t *len, CamelException *ex); +int camel_imap_engine_literal (CamelIMAPEngine *engine, unsigned char **literal, size_t *len, CamelException *ex); int camel_imap_engine_eat_line (CamelIMAPEngine *engine, CamelException *ex); |