static struct message_part *msg_parse(pool_t pool, bool parse_bodystructure) { struct message_parser_ctx *parser; struct istream *input; struct message_block block; struct message_part *parts; int ret; input = i_stream_create_from_data(testmsg, sizeof(testmsg)-1); parser = message_parser_init(pool, input, MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP | MESSAGE_HEADER_PARSER_FLAG_DROP_CR, MESSAGE_PARSER_FLAG_SKIP_BODY_BLOCK); while ((ret = message_parser_parse_next_block(parser, &block)) > 0) { if (parse_bodystructure) { imap_bodystructure_parse_header(pool, block.part, block.hdr); } } test_assert(ret < 0); test_assert(message_parser_deinit(&parser, &parts) == 0); i_stream_unref(&input); return parts; }
void index_mail_parse_header(struct message_part *part, struct message_header_line *hdr, struct index_mail *mail) { struct mail *_mail = &mail->mail.mail; struct index_mail_data *data = &mail->data; unsigned int field_idx, count; uint8_t *match; data->parse_line_num++; if (data->save_bodystructure_header) { i_assert(part != NULL); imap_bodystructure_parse_header(mail->mail.data_pool, part, hdr); } if (data->save_envelope) { imap_envelope_parse_header(mail->mail.data_pool, &data->envelope_data, hdr); if (hdr == NULL) index_mail_parse_finish_imap_envelope(mail); } if (hdr == NULL) { /* end of headers */ if (mail->data.save_sent_date) mail->data.sent_date_parsed = TRUE; T_BEGIN { index_mail_parse_header_finish(mail); } T_END; data->save_bodystructure_header = FALSE; return; } if (!hdr->continued) { T_BEGIN { const char *cache_field_name = t_strconcat("hdr.", hdr->name, NULL); data->parse_line.field_idx = mail_cache_register_lookup(_mail->box->cache, cache_field_name); } T_END; }
void index_mail_cache_parse_continue(struct mail *_mail) { struct index_mail *mail = (struct index_mail *)_mail; struct message_block block; while (message_parser_parse_next_block(mail->data.parser_ctx, &block) > 0) { if (block.size != 0) continue; if (!mail->data.header_parsed) { index_mail_parse_header(block.part, block.hdr, mail); if (block.hdr == NULL) mail->data.header_parsed = TRUE; } else { imap_bodystructure_parse_header(mail->data_pool, block.part, block.hdr); } } }
static void parse_bodystructure_part_header(struct message_part *part, struct message_header_line *hdr, pool_t pool) { imap_bodystructure_parse_header(pool, part, hdr); }