*/
static void
-params_write(const struct message_part_param *params,
- unsigned int params_count, string_t *str,
- bool default_charset)
+params_write(const struct message_part_param *params, unsigned int params_count,
+ string_t *str, bool default_charset, enum imap_quote_flags qflags)
{
unsigned int i;
bool seen_charset;
if (default_charset &&
strcasecmp(params[i].name, "charset") == 0)
seen_charset = TRUE;
- imap_append_string(str, params[i].name, 0);
+ imap_append_string(str, params[i].name, qflags);
str_append_c(str, ' ');
- imap_append_string(str, params[i].value, 0);
+ imap_append_string(str, params[i].value, qflags);
}
if (default_charset && !seen_charset) {
if (i > 0)
static int
part_write_bodystructure_siblings(const struct message_part *part,
string_t *dest, bool extended,
+ enum imap_quote_flags qflags,
const char **error_r)
{
for (; part != NULL; part = part->next) {
str_append_c(dest, '(');
- if (imap_bodystructure_write(part, dest, extended, error_r) < 0)
+ if (imap_bodystructure_write(part, dest, extended, qflags,
+ error_r) < 0)
return -1;
str_append_c(dest, ')');
}
static void
part_write_bodystructure_common(const struct message_part_data *data,
- string_t *str)
+ string_t *str, enum imap_quote_flags qflags)
{
str_append_c(str, ' ');
if (data->content_disposition == NULL)
str_append(str, "NIL");
else {
str_append_c(str, '(');
- imap_append_string(str, data->content_disposition, 0);
+ imap_append_string(str, data->content_disposition, qflags);
str_append_c(str, ' ');
params_write(data->content_disposition_params,
- data->content_disposition_params_count, str, FALSE);
+ data->content_disposition_params_count, str,
+ FALSE, qflags);
str_append_c(str, ')');
}
i_assert(*lang != NULL);
str_append_c(str, '(');
- imap_append_string(str, *lang, 0);
+ imap_append_string(str, *lang, qflags);
lang++;
while (*lang != NULL) {
str_append_c(str, ' ');
- imap_append_string(str, *lang, 0);
+ imap_append_string(str, *lang, qflags);
lang++;
}
str_append_c(str, ')');
}
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_location, 0);
+ imap_append_nstring_nolf(str, data->content_location, qflags);
}
static int part_write_body_multipart(const struct message_part *part,
string_t *str, bool extended,
+ enum imap_quote_flags qflags,
const char **error_r)
{
const struct message_part_data *data = part->data;
if (part->children != NULL) {
if (part_write_bodystructure_siblings(part->children, str,
- extended, error_r) < 0)
+ extended, qflags,
+ error_r) < 0)
return -1;
} else {
/* no parts in multipart message,
}
str_append_c(str, ' ');
- imap_append_string(str, data->content_subtype, 0);
+ imap_append_string(str, data->content_subtype, qflags);
if (!extended)
return 0;
str_append_c(str, ' ');
params_write(data->content_type_params,
- data->content_type_params_count, str, FALSE);
+ data->content_type_params_count, str, FALSE, qflags);
- part_write_bodystructure_common(data, str);
+ part_write_bodystructure_common(data, str, qflags);
return 0;
}
return FALSE;
}
-static int part_write_body(const struct message_part *part,
- string_t *str, bool extended, const char **error_r)
+static int
+part_write_body(const struct message_part *part, string_t *str,
+ bool extended, enum imap_quote_flags qflags,
+ const char **error_r)
{
const struct message_part_data *data = part->data;
bool text;
str_append(str, "\"text\" \"plain\"");
} else {
text = (strcasecmp(data->content_type, "text") == 0);
- imap_append_string(str, data->content_type, 0);
+ imap_append_string(str, data->content_type, qflags);
str_append_c(str, ' ');
- imap_append_string(str, data->content_subtype, 0);
+ imap_append_string(str, data->content_subtype, qflags);
}
bool part_is_text = (part->flags & MESSAGE_PART_FLAG_TEXT) != 0;
if (text != part_is_text) {
/* ("content type param key" "value" ...) */
str_append_c(str, ' ');
params_write(data->content_type_params,
- data->content_type_params_count, str, text);
+ data->content_type_params_count, str, text, qflags);
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_id, 0);
+ imap_append_nstring_nolf(str, data->content_id, qflags);
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_description, 0);
+ imap_append_nstring_nolf(str, data->content_description, qflags);
str_append_c(str, ' ');
if (data->content_transfer_encoding != NULL)
- imap_append_string(str, data->content_transfer_encoding, 0);
+ imap_append_string(str, data->content_transfer_encoding, qflags);
else
str_append(str, "\"7bit\"");
str_printfa(str, " %"PRIuUOFF_T, part->body_size.virtual_size);
child_data = part->children->data;
str_append(str, " (");
- imap_envelope_write(child_data->envelope, str, 0);
+ imap_envelope_write(child_data->envelope, str, qflags);
str_append(str, ") ");
if (part_write_bodystructure_siblings(part->children, str,
- extended, error_r) < 0)
+ extended, qflags,
+ error_r) < 0)
return -1;
str_printfa(str, " %u", part->body_size.lines);
}
/* "md5" ("content disposition" ("disposition" "params"))
("body" "language" "params") "location" */
str_append_c(str, ' ');
- imap_append_nstring_nolf(str, data->content_md5, 0);
- part_write_bodystructure_common(data, str);
+ imap_append_nstring_nolf(str, data->content_md5, qflags);
+ part_write_bodystructure_common(data, str, qflags);
return 0;
}
int imap_bodystructure_write(const struct message_part *part,
string_t *dest, bool extended,
+ enum imap_quote_flags qflags,
const char **error_r)
{
- if ((part->flags & MESSAGE_PART_FLAG_MULTIPART) != 0)
- return part_write_body_multipart(part, dest, extended, error_r);
- else
- return part_write_body(part, dest, extended, error_r);
+ if ((part->flags & MESSAGE_PART_FLAG_MULTIPART) != 0) {
+ return part_write_body_multipart(part, dest, extended, qflags,
+ error_r);
+ } else {
+ return part_write_body(part, dest, extended, qflags, error_r);
+ }
}
/*
test_begin(t_strdup_printf("imap bodystructure write [%u]", i));
parts = msg_parse(pool, test->message, 0, 0, TRUE);
- test_assert(imap_bodystructure_write(parts, str, TRUE, &error) == 0);
+ test_assert(imap_bodystructure_write(parts, str, TRUE, 0, &error) == 0);
test_assert(strcmp(str_c(str), test->bodystructure) == 0);
str_truncate(str, 0);
- test_assert(imap_bodystructure_write(parts, str, FALSE, &error) == 0);
+ test_assert(imap_bodystructure_write(parts, str, FALSE, 0, &error) == 0);
test_assert(strcmp(str_c(str), test->body) == 0);
pool_unref(&pool);
parts->flags &= ENUM_NEGATE(MESSAGE_PART_FLAG_TEXT);
string_t *str = t_str_new(128);
- test_assert(imap_bodystructure_write(parts, str, FALSE, &error) < 0);
+ test_assert(imap_bodystructure_write(parts, str, FALSE, 0, &error) < 0);
test_assert_strcmp(error, "text flag mismatch");
pool_unref(&pool);
test_end();
if (ret == 0) {
str_truncate(str, 0);
- test_assert(imap_bodystructure_write(parts, str, TRUE, &error) == 0);
+ test_assert(imap_bodystructure_write(parts, str, TRUE, 0, &error) == 0);
test_assert(strcmp(str_c(str), test->bodystructure) == 0);
} else {
i_error("Invalid BODYSTRUCTURE: %s", error);
if (ret == 0) {
str_truncate(str, 0);
- test_assert(imap_bodystructure_write(parts, str, TRUE, &error) == 0);
+ test_assert(imap_bodystructure_write(parts, str, TRUE, 0, &error) == 0);
test_assert(strcmp(str_c(str), test->bodystructure) == 0);
} else {
i_error("Invalid BODYSTRUCTURE: %s", error);
if (ret == 0) {
str_truncate(str, 0);
- test_assert(imap_bodystructure_write(parts, str, TRUE, &error) == 0);
+ test_assert(imap_bodystructure_write(parts, str, TRUE, 0, &error) == 0);
test_assert(strcmp(str_c(str), test->output) == 0);
} else {
i_error("Invalid BODYSTRUCTURE: %s", error);
TRUE);
/* write out BODYSTRUCTURE and serialize message_parts */
- test_assert(imap_bodystructure_write(parts, str_body, TRUE, &error) == 0);
+ test_assert(imap_bodystructure_write(parts, str_body, TRUE, 0, &error) == 0);
message_part_serialize(parts, str_parts);
/* now deserialize message_parts and make sure they can be used