message-header-decode.c revision 72388282bf6718c39af34cfcf51438910f9d62da
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (C) 2002-2007 Timo Sirainen */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenmessage_header_decode_encoded(const unsigned char *data, size_t size,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen buffer_t *decodebuf, unsigned int *charsetlen_r)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen unsigned int num = 0;
0db42260be85e797aa9909a29b20296996f52e75Timo Sirainen /* data should contain "charset?encoding?text?=" */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen for (i = 0; i < size; i++) {
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* invalid block */
46e917c9fa05cbe7bddf805d3a9838b61e3960e1Timo Sirainen quoted_printable_decode(data + start_pos[1] + 1,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* contains invalid data. show what we got so far. */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* unknown encoding */
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Boschvoid message_header_decode(const unsigned char *data, size_t size,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen unsigned int charsetlen = 0;
16cb5d65265dd0b216542803fd80c4b999ae118eTimo Sirainen /* =?charset?Q|B?text?= */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* encoded string beginning */
56d1345c43bbd28c36b7faa85e4163bd9e874290Timo Sirainen /* send the unencoded data so far */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (!callback(data + start_pos, pos - start_pos,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen buffer_create_dynamic(pool_datastack_create(),
56aa97d74071f3a2987140c2ff1cfd5a59cb35aaTimo Sirainen pos += message_header_decode_encoded(data + pos, size - pos,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* decodebuf contains <charset> NUL <text> */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (!callback(CONST_PTR_OFFSET(decodebuf->data,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen (void)callback(data + start_pos, size - start_pos,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainendecode_utf8_callback(const unsigned char *data, size_t size,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (charset == NULL || charset_is_utf8(charset)) {
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* ASCII / UTF-8 */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen charset_utf8_ucase_write(ctx->dest, ctx->dest->used,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen t = charset_to_utf8_begin(charset, ctx->ucase, &unknown_charset);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* let's just ignore this part */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* ignore any errors */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen (void)charset_to_utf8_full(t, data, &size, ctx->dest);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenvoid message_header_decode_utf8(const unsigned char *data, size_t size,