Mercurial > dovecot > core-2.2
diff src/lib-imap/imap-bodystructure.c @ 833:41ec8cadd238 HEAD
Replaced TempString with a String which can use any memory pool and uses
Buffer internally.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 22 Dec 2002 00:02:57 +0200 |
parents | 8b3518bb327e |
children | 375923d2f910 |
line wrap: on
line diff
--- a/src/lib-imap/imap-bodystructure.c Sun Dec 22 00:02:20 2002 +0200 +++ b/src/lib-imap/imap-bodystructure.c Sun Dec 22 00:02:57 2002 +0200 @@ -2,7 +2,7 @@ #include "lib.h" #include "istream.h" -#include "temp-string.h" +#include "str.h" #include "rfc822-tokenize.h" #include "message-parser.h" #include "message-content-parser.h" @@ -16,7 +16,7 @@ typedef struct { Pool pool; - TempString *str; + String *str; char *content_type, *content_subtype; char *content_type_params; char *content_transfer_encoding; @@ -30,7 +30,7 @@ MessagePartEnvelopeData *envelope; } MessagePartBodyData; -static void part_write_bodystructure(MessagePart *part, TempString *str, +static void part_write_bodystructure(MessagePart *part, String *str, int extended); static void parse_content_type(const Rfc822Token *tokens, @@ -60,15 +60,15 @@ MessagePartBodyData *data = context; const char *str; - if (data->str->len != 0) - t_string_append_c(data->str, ' '); + if (str_len(data->str) != 0) + str_append_c(data->str, ' '); - t_string_append_c(data->str, '"'); - t_string_append_n(data->str, name->ptr, name->len); - t_string_append(data->str, "\" "); + str_append_c(data->str, '"'); + str_append_n(data->str, name->ptr, name->len); + str_append(data->str, "\" "); str = rfc822_tokens_get_value_quoted(value, value_count); - t_string_append(data->str, str); + str_append(data->str, str); } static void parse_content_transfer_encoding(const Rfc822Token *tokens, @@ -95,7 +95,7 @@ int count, void *context) { MessagePartBodyData *data = context; - TempString *str; + String *str; int quoted; /* Content-Language: en-US, az-arabic (comments allowed) */ @@ -103,7 +103,7 @@ if (count <= 0) return; - str = t_string_new(256); + str = t_str_new(256); quoted = FALSE; for (; count > 0; count--, tokens++) { @@ -114,7 +114,7 @@ case ',': /* list separator */ if (quoted) { - t_string_append_c(str, '"'); + str_append_c(str, '"'); quoted = FALSE; } break; @@ -123,26 +123,24 @@ and '-' is allowed, so anything else is error which we can deal with however we want. */ if (!quoted) { - if (str->len > 0) - t_string_append_c(str, ' '); - t_string_append_c(str, '"'); + if (str_len(str) > 0) + str_append_c(str, ' '); + str_append_c(str, '"'); quoted = TRUE; } - if (IS_TOKEN_STRING(tokens->token)) { - t_string_append_n(str, tokens->ptr, - tokens->len); - } else { - t_string_append_c(str, tokens->token); - } + if (IS_TOKEN_STRING(tokens->token)) + str_append_n(str, tokens->ptr, tokens->len); + else + str_append_c(str, tokens->token); break; } } if (quoted) - t_string_append_c(str, '"'); + str_append_c(str, '"'); - data->content_language = p_strdup(data->pool, str->str); + data->content_language = p_strdup(data->pool, str_c(str)); } static void parse_header(MessagePart *part, @@ -175,13 +173,13 @@ if (strcasecmp(name, "Content-Type") == 0 && part_data->content_type == NULL) { - part_data->str = t_string_new(256); + part_data->str = t_str_new(256); (void)message_content_parse_header(t_strndup(value, value_len), parse_content_type, parse_save_params_list, part_data); part_data->content_type_params = - p_strdup(pool, part_data->str->str); + p_strdup(pool, str_c(part_data->str)); } else if (strcasecmp(name, "Content-Transfer-Encoding") == 0 && part_data->content_transfer_encoding == NULL) { (void)message_content_parse_header(t_strndup(value, value_len), @@ -197,13 +195,13 @@ imap_quote_value(pool, value, value_len); } else if (strcasecmp(name, "Content-Disposition") == 0 && part_data->content_disposition_params == NULL) { - part_data->str = t_string_new(256); + part_data->str = t_str_new(256); (void)message_content_parse_header(t_strndup(value, value_len), parse_content_disposition, parse_save_params_list, part_data); part_data->content_disposition_params = - p_strdup(pool, part_data->str->str); + p_strdup(pool, str_c(part_data->str)); } else if (strcasecmp(name, "Content-Language") == 0) { (void)message_content_parse_header(t_strndup(value, value_len), parse_content_language, NULL, @@ -241,7 +239,7 @@ } } -static void part_write_body_multipart(MessagePart *part, TempString *str, +static void part_write_body_multipart(MessagePart *part, String *str, int extended) { MessagePartBodyData *data = part->context; @@ -257,53 +255,53 @@ /* no parts in multipart message, that's not allowed. write a single 0-length text/plain structure */ - t_string_append(str, EMPTY_BODYSTRUCTURE); + str_append(str, EMPTY_BODYSTRUCTURE); } - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_subtype != NULL) - t_string_append(str, data->content_subtype); + str_append(str, data->content_subtype); else - t_string_append(str, "x-unknown"); + str_append(str, "x-unknown"); if (!extended) return; /* BODYSTRUCTURE data */ - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_type_params == NULL) - t_string_append(str, "NIL"); + str_append(str, "NIL"); else { - t_string_append_c(str, '('); - t_string_append(str, data->content_type_params); - t_string_append_c(str, ')'); + str_append_c(str, '('); + str_append(str, data->content_type_params); + str_append_c(str, ')'); } - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_disposition == NULL) - t_string_append(str, "NIL"); + str_append(str, "NIL"); else { - t_string_append_c(str, '('); - t_string_append(str, data->content_disposition); + str_append_c(str, '('); + str_append(str, data->content_disposition); if (data->content_disposition_params != NULL) { - t_string_append(str, " ("); - t_string_append(str, data->content_disposition_params); - t_string_append_c(str, ')'); + str_append(str, " ("); + str_append(str, data->content_disposition_params); + str_append_c(str, ')'); } - t_string_append_c(str, ')'); + str_append_c(str, ')'); } - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_language == NULL) - t_string_append(str, "NIL"); + str_append(str, "NIL"); else { - t_string_append_c(str, '('); - t_string_append(str, data->content_language); - t_string_append_c(str, ')'); + str_append_c(str, '('); + str_append(str, data->content_language); + str_append_c(str, ')'); } } -static void part_write_body(MessagePart *part, TempString *str, int extended) +static void part_write_body(MessagePart *part, String *str, int extended) { MessagePartBodyData *data = part->context; @@ -313,29 +311,29 @@ } /* "content type" "subtype" */ - t_string_append(str, NVL(data->content_type, "\"text\"")); - t_string_append_c(str, ' '); - t_string_append(str, NVL(data->content_subtype, "\"plain\"")); + str_append(str, NVL(data->content_type, "\"text\"")); + str_append_c(str, ' '); + str_append(str, NVL(data->content_subtype, "\"plain\"")); /* ("content type param key" "value" ...) */ - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_type_params == NULL) - t_string_append(str, "NIL"); + str_append(str, "NIL"); else { - t_string_append_c(str, '('); - t_string_append(str, data->content_type_params); - t_string_append_c(str, ')'); + str_append_c(str, '('); + str_append(str, data->content_type_params); + str_append_c(str, ')'); } - t_string_printfa(str, " %s %s %s %"PRIuUOFF_T, - NVL(data->content_id, "NIL"), - NVL(data->content_description, "NIL"), - NVL(data->content_transfer_encoding, "\"8bit\""), - part->body_size.virtual_size); + str_printfa(str, " %s %s %s %"PRIuUOFF_T, + NVL(data->content_id, "NIL"), + NVL(data->content_description, "NIL"), + NVL(data->content_transfer_encoding, "\"8bit\""), + part->body_size.virtual_size); if (part->flags & MESSAGE_PART_FLAG_TEXT) { /* text/.. contains line count */ - t_string_printfa(str, " %u", part->body_size.lines); + str_printfa(str, " %u", part->body_size.lines); } else if (part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) { /* message/rfc822 contains envelope + body + line count */ MessagePartBodyData *child_data; @@ -345,19 +343,19 @@ child_data = part->children->context; - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (child_data != NULL && child_data->envelope != NULL) { - t_string_append_c(str, '('); + str_append_c(str, '('); imap_envelope_write_part_data(child_data->envelope, str); - t_string_append_c(str, ')'); + str_append_c(str, ')'); } else { /* buggy message */ - t_string_append(str, "NIL"); + str_append(str, "NIL"); } - t_string_append_c(str, ' '); + str_append_c(str, ' '); part_write_bodystructure(part->children, str, extended); - t_string_printfa(str, " %u", part->body_size.lines); + str_printfa(str, " %u", part->body_size.lines); } if (!extended) @@ -367,42 +365,42 @@ /* "md5" ("content disposition" ("disposition" "params")) ("body" "language" "params") */ - t_string_append_c(str, ' '); - t_string_append(str, NVL(data->content_md5, "NIL")); + str_append_c(str, ' '); + str_append(str, NVL(data->content_md5, "NIL")); - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_disposition == NULL) - t_string_append(str, "NIL"); + str_append(str, "NIL"); else { - t_string_append_c(str, '('); - t_string_append(str, data->content_disposition); - t_string_append_c(str, ')'); + str_append_c(str, '('); + str_append(str, data->content_disposition); + str_append_c(str, ')'); if (data->content_disposition_params != NULL) { - t_string_append(str, " ("); - t_string_append(str, data->content_disposition_params); - t_string_append_c(str, ')'); + str_append(str, " ("); + str_append(str, data->content_disposition_params); + str_append_c(str, ')'); } } - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (data->content_language == NULL) - t_string_append(str, "NIL"); + str_append(str, "NIL"); else { - t_string_append_c(str, '('); - t_string_append(str, data->content_language); - t_string_append_c(str, ')'); + str_append_c(str, '('); + str_append(str, data->content_language); + str_append_c(str, ')'); } } -static void part_write_bodystructure(MessagePart *part, TempString *str, +static void part_write_bodystructure(MessagePart *part, String *str, int extended) { i_assert(part->parent != NULL || part->next == NULL); while (part != NULL) { if (part->parent != NULL) - t_string_append_c(str, '('); + str_append_c(str, '('); if (part->flags & MESSAGE_PART_FLAG_MULTIPART) part_write_body_multipart(part, str, extended); @@ -410,7 +408,7 @@ part_write_body(part, str, extended); if (part->parent != NULL) - t_string_append_c(str, ')'); + str_append_c(str, ')'); part = part->next; } @@ -418,11 +416,11 @@ static const char *part_get_bodystructure(MessagePart *part, int extended) { - TempString *str; + String *str; - str = t_string_new(2048); + str = t_str_new(2048); part_write_bodystructure(part, str, extended); - return str->str; + return str_c(str); } const char *imap_part_get_bodystructure(Pool pool, MessagePart **part, @@ -440,22 +438,22 @@ return part_get_bodystructure(*part, extended); } -static int imap_write_list(ImapArg *args, TempString *str) +static int imap_write_list(ImapArg *args, String *str) { /* don't do any typechecking, just write it out */ - t_string_append_c(str, '('); + str_append_c(str, '('); while (args->type != IMAP_ARG_EOL) { switch (args->type) { case IMAP_ARG_NIL: - t_string_append(str, "NIL"); + str_append(str, "NIL"); break; case IMAP_ARG_ATOM: - t_string_append(str, args->data.str); + str_append(str, args->data.str); break; case IMAP_ARG_STRING: - t_string_append_c(str, '"'); - t_string_append(str, args->data.str); - t_string_append_c(str, '"'); + str_append_c(str, '"'); + str_append(str, args->data.str); + str_append_c(str, '"'); break; case IMAP_ARG_LIST: if (!imap_write_list(args->data.list->args, str)) @@ -467,23 +465,23 @@ args++; if (args->type != IMAP_ARG_EOL) - t_string_append_c(str, ' '); + str_append_c(str, ' '); } - t_string_append_c(str, ')'); + str_append_c(str, ')'); return TRUE; } -static int imap_parse_bodystructure_args(ImapArg *args, TempString *str) +static int imap_parse_bodystructure_args(ImapArg *args, String *str) { ImapArg *subargs; int i, multipart, text, message_rfc822; multipart = FALSE; while (args->type == IMAP_ARG_LIST) { - t_string_append_c(str, '('); + str_append_c(str, '('); if (!imap_parse_bodystructure_args(args->data.list->args, str)) return FALSE; - t_string_append_c(str, ')'); + str_append_c(str, ')'); multipart = TRUE; args++; @@ -494,7 +492,7 @@ if (args->type != IMAP_ARG_STRING) return FALSE; - t_string_printfa(str, " \"%s\"", args->data.str); + str_printfa(str, " \"%s\"", args->data.str); return TRUE; } @@ -506,31 +504,29 @@ message_rfc822 = strcasecmp(args[0].data.str, "message") == 0 && strcasecmp(args[1].data.str, "rfc822") == 0; - t_string_printfa(str, "\"%s\" \"%s\"", - args[0].data.str, args[1].data.str); + str_printfa(str, "\"%s\" \"%s\"", args[0].data.str, args[1].data.str); args += 2; /* ("content type param key" "value" ...) | NIL */ if (args->type == IMAP_ARG_LIST) { - t_string_append(str, " ("); + str_append(str, " ("); subargs = args->data.list->args; for (; subargs->type != IMAP_ARG_EOL; ) { if (subargs[0].type != IMAP_ARG_STRING || subargs[1].type != IMAP_ARG_STRING) return FALSE; - t_string_printfa(str, "\"%s\" \"%s\"", - subargs[0].data.str, - subargs[1].data.str); + str_printfa(str, "\"%s\" \"%s\"", + subargs[0].data.str, subargs[1].data.str); subargs += 2; if (subargs->type == IMAP_ARG_EOL) break; - t_string_append_c(str, ' '); + str_append_c(str, ' '); } - t_string_append(str, ")"); + str_append(str, ")"); } else if (args->type == IMAP_ARG_NIL) { - t_string_append(str, " NIL"); + str_append(str, " NIL"); } else { return FALSE; } @@ -539,12 +535,12 @@ /* "content id" "content description" "transfer encoding" size */ for (i = 0; i < 4; i++, args++) { if (args->type == IMAP_ARG_NIL) { - t_string_append(str, " NIL"); + str_append(str, " NIL"); } else if (args->type == IMAP_ARG_ATOM) { - t_string_append_c(str, ' '); - t_string_append(str, args->data.str); + str_append_c(str, ' '); + str_append(str, args->data.str); } else if (args->type == IMAP_ARG_STRING) { - t_string_printfa(str, " \"%s\"", args->data.str); + str_printfa(str, " \"%s\"", args->data.str); } else { return FALSE; } @@ -555,8 +551,8 @@ if (args->type != IMAP_ARG_ATOM) return FALSE; - t_string_append_c(str, ' '); - t_string_append(str, args->data.str); + str_append_c(str, ' '); + str_append(str, args->data.str); } else if (message_rfc822) { /* message/rfc822 - envelope + bodystructure + text lines */ if (args[0].type != IMAP_ARG_LIST || @@ -564,19 +560,19 @@ args[2].type != IMAP_ARG_ATOM) return FALSE; - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (!imap_write_list(args[0].data.list->args, str)) return FALSE; - t_string_append_c(str, ' '); + str_append_c(str, ' '); if (!imap_parse_bodystructure_args(args[1].data.list->args, str)) return FALSE; - t_string_append_c(str, ' '); - t_string_append(str, args[2].data.str); + str_append_c(str, ' '); + str_append(str, args[2].data.str); } return TRUE; @@ -587,13 +583,13 @@ IStream *input; ImapParser *parser; ImapArg *args; - TempString *str; + String *str; const char *value; size_t len; int ret; len = strlen(bodystructure); - str = t_string_new(len); + str = t_str_new(len); input = i_stream_create_from_data(data_stack_pool, bodystructure, len); (void)i_stream_read(input); @@ -605,7 +601,7 @@ if (ret <= 0 || !imap_parse_bodystructure_args(args, str)) value = NULL; else - value = str->str; + value = str_c(str); if (value == NULL) i_error("Error parsing IMAP bodystructure: %s", bodystructure);