Diffstat (limited to 'kmicromail/libetpan/tests/frm-common.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libetpan/tests/frm-common.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/kmicromail/libetpan/tests/frm-common.c b/kmicromail/libetpan/tests/frm-common.c new file mode 100644 index 0000000..eeeadf0 --- a/dev/null +++ b/kmicromail/libetpan/tests/frm-common.c @@ -0,0 +1,158 @@ +#include "frm-common.h" + +#include <string.h> +#include <stdlib.h> + +#define DEST_CHARSET "iso-8859-1" + +/* get part of the from field to display */ + +void get_from_value(struct mailimf_single_fields * fields, + char ** from, int * is_addr) +{ + struct mailimf_mailbox * mb; + + if (fields->fld_from == NULL) { + * from = NULL; + * is_addr = 0; + return; + } + + if (clist_isempty(fields->fld_from->frm_mb_list->mb_list)) { + * from = NULL; + * is_addr = 0; + return; + } + + mb = clist_begin(fields->fld_from->frm_mb_list->mb_list)->data; + + if (mb->mb_display_name != NULL) { + * from = mb->mb_display_name; + * is_addr = 0; + } + else { + * from = mb->mb_addr_spec; + * is_addr = 1; + } +} + +/* remove all CR and LF of a string and replace them with SP */ + +void strip_crlf(char * str) +{ + char * p; + + for(p = str ; * p != '\0' ; p ++) { + if ((* p == '\n') || (* p == '\r')) + * p = ' '; + } +} + +#define MAX_OUTPUT 81 + +/* display information for one message */ + +void print_mail_info(char * prefix, mailmessage * msg) +{ + char * from; + char * subject; + char * decoded_from; + char * decoded_subject; + size_t cur_token; + int r; + int is_addr; + char * dsp_from; + char * dsp_subject; + char output[MAX_OUTPUT]; + struct mailimf_single_fields single_fields; + + is_addr = 0; + from = NULL; + subject = NULL; + + decoded_subject = NULL; + decoded_from = NULL; + + /* from field */ + + if (msg->msg_fields != NULL) + mailimf_single_fields_init(&single_fields, msg->msg_fields); + else + memset(&single_fields, 0, sizeof(single_fields)); + + get_from_value(&single_fields, &from, &is_addr); + + if (from == NULL) + decoded_from = NULL; + else { + if (!is_addr) { + cur_token = 0; + r = mailmime_encoded_phrase_parse(DEST_CHARSET, + from, strlen(from), + &cur_token, DEST_CHARSET, + &decoded_from); + if (r != MAILIMF_NO_ERROR) { + decoded_from = strdup(from); + if (decoded_from == NULL) + goto err; + } + } + else { + decoded_from = strdup(from); + if (decoded_from == NULL) { + goto err; + } + } + } + + if (decoded_from == NULL) + dsp_from = ""; + else { + dsp_from = decoded_from; + strip_crlf(dsp_from); + } + + /* subject */ + + if (single_fields.fld_subject != NULL) + subject = single_fields.fld_subject->sbj_value; + + if (subject == NULL) + decoded_subject = NULL; + else { + cur_token = 0; + r = mailmime_encoded_phrase_parse(DEST_CHARSET, + subject, strlen(subject), + &cur_token, DEST_CHARSET, + &decoded_subject); + if (r != MAILIMF_NO_ERROR) { + decoded_subject = strdup(subject); + if (decoded_subject == NULL) + goto free_from; + } + } + + if (decoded_subject == NULL) + dsp_subject = ""; + else { + dsp_subject = decoded_subject; + strip_crlf(dsp_subject); + } + + snprintf(output, MAX_OUTPUT, "%3i: %-21.21s %s%-53.53s", + msg->msg_index, dsp_from, prefix, dsp_subject); + + printf("%s\n", output); + + if (decoded_subject != NULL) + free(decoded_subject); + if (decoded_from != NULL) + free(decoded_from); + + return; + + free_from: + if (decoded_from) + free(decoded_from); + err: +} |