void newmsg_showfp(FILE *fp, int *attachcnt) { struct rfc2045 *p=rfc2045_fromfp(fp), *q; if (!p) enomem(); /* Here's a nice opportunity to count all attachments */ *attachcnt=0; for (q=p->firstpart; q; q=q->next) if (!q->isdummy) ++*attachcnt; if (*attachcnt) --*attachcnt; /* Not counting the 1st MIME part */ { const char *content_type; const char *content_transfer_encoding; const char *charset; rfc2045_mimeinfo(p, &content_type, &content_transfer_encoding, &charset); if (content_type && strcmp(content_type, "multipart/alternative") == 0) *attachcnt=0; } q=rfc2045_searchcontenttype(p, "text/plain"); if (q) { struct rfc2045src *src=rfc2045src_init_fd(fileno(fp)); if (src) { struct show_textarea_info info; show_textarea_init(&info, 1); rfc2045_decodetextmimesection(src, q, sqwebmail_content_charset, NULL, &show_textarea_trampoline, &info); rfc2045src_deinit(src); show_textarea(&info, "\n", 1); } } rfc2045_free(p); }
int rfc2045_decodemsgtoutf8(struct rfc2045src *src, struct rfc2045 *p, struct rfc2045_decodemsgtoutf8_cb *callback) { struct rfc2045headerinfo *hi; int rc; hi=rfc2045header_start(src, p); if (hi) { char *header; char *value; while (rfc2045header_get(hi, &header, &value, RFC2045H_NOLC | RFC2045H_KEEPNL) == 0 && header) { if (callback->flags & RFC2045_DECODEMSG_NOHEADERS) continue; if (doconvtoutf8_rfc822hdr(header, value, callback) < 0) return -1; } rfc2045header_end(hi); } if (p->firstpart) { for (p=p->firstpart; p; p=p->next) { if (!p->isdummy) { if ((rc=rfc2045_decodemsgtoutf8(src, p, callback)) != 0) return rc; } } } else { const char *content_type; const char *transfer_encoding; const char *charset; struct doconvtoutf8_info info; info.callback=callback; rfc2045_mimeinfo(p, &content_type, &transfer_encoding, &charset); if ((strncmp(content_type, "text/", 5) == 0 || strncmp(content_type, "message/", 8) == 0) && (callback->flags & RFC2045_DECODEMSG_NOBODY) == 0 && (rc=rfc2045_decodetextmimesection(src, p, "utf-8", NULL, decode_handler, &info)) != 0) return rc; } return 0; }
static void decodenoconvert(int fd, struct rfc2045 *p, const char *chset, int (*func)(const char *, size_t, void *), void *arg) { rfc2045_decodetextmimesection(fd, p, chset, func, arg); }