message-decoder.c revision 373745850a588cb7ebdadf8bf2f78b1b6529b98f
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen/* Copyright (C) 2006 Timo Sirainen */
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen/* Both base64 and q-p takes max 3 bytes per character */
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen/* UTF-8 takes max 5 bytes per character. Not sure about others, but I'd think
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 10 is more than enough for everyone.. */
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen char translation_buf[MAX_TRANSLATION_BUF_SIZE];
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainenstruct message_decoder_context *message_decoder_init(void)
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen ctx = i_new(struct message_decoder_context, 1);
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen ctx->buf = buffer_create_dynamic(default_pool, 8192);
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen ctx->buf2 = buffer_create_dynamic(default_pool, 8192);
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainenvoid message_decoder_deinit(struct message_decoder_context **_ctx)
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainenmessage_decode_header_callback(const unsigned char *data, size_t size,
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen struct message_decoder_context *ctx = context;
baf3e87e186453fda13bd21f7cbcb2efc8492e8bTimo Sirainen if (charset == NULL || strcasecmp(charset, "UTF-8") == 0) {
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen t = charset_to_utf8_begin(charset, &unknown_charset);
return TRUE;
charset_to_utf8_end(&t);
return TRUE;
void *context)
switch (value_len) {
return FALSE;
NULL,
return TRUE;
bool unknown_charset;
case CONTENT_TYPE_UNKNOWN:
return FALSE;
case CONTENT_TYPE_BINARY:
case CONTENT_TYPE_QP:
case CONTENT_TYPE_BASE64:
return FALSE;
return FALSE;
return TRUE;