From 5937c6f4ddebd391ee5c7e85c6070784274c6f1d Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sat, 13 Jul 2002 04:39:59 +0000 Subject: [PATCH] * Handle multipart/alternative in a nicer way, giving us the opportunity to output HTML instead of converting to text/plain and back. (Not finished.) --- webcit/ChangeLog | 7 +- webcit/messages.c | 178 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 161 insertions(+), 24 deletions(-) diff --git a/webcit/ChangeLog b/webcit/ChangeLog index 951e991f9..2698e1797 100644 --- a/webcit/ChangeLog +++ b/webcit/ChangeLog @@ -1,4 +1,8 @@ $Log$ +Revision 323.46 2002/07/13 04:39:59 ajc +* Handle multipart/alternative in a nicer way, giving us the opportunity to + output HTML instead of converting to text/plain and back. (Not finished.) + Revision 323.45 2002/07/11 03:17:03 ajc * hacks to text_to_server() to transmit messages as HTML @@ -858,6 +862,3 @@ Sun Dec 6 19:50:55 EST 1998 Art Cancro 1998-12-03 Nathan Bryant * webserver.c: warning fix - - - diff --git a/webcit/messages.c b/webcit/messages.c index 079c9c741..1ffad7c36 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -194,8 +194,90 @@ void display_vcard(char *vcard_source, char alpha, int full) { +void output_text_plain(char *partbuf, int total_length) { + wprintf("
\n");
+	write(WC->http_sock, partbuf, total_length);
+	wprintf("

\n"); +} + + + + +/* + * Output the chosen part of a MIME message. This might be chosen from + * a multipart/alternative or it might be chosen because it's the only one + * present. We care not why it was chosen; it is our job to be a servile + * little function and do what we are told. + */ +void output_chosen_part(long msgnum, char *multipart_chosen) { + char buf[SIZ]; + char *partbuf; + int total_length = 0; + int downloaded_length = 0; + int block_length = 0; + char content_type[SIZ]; + + serv_printf("OPNA %ld|%s", msgnum, multipart_chosen); + serv_gets(buf); + if (buf[0] != '2') { + wprintf("Error reading msg %ld part %s

", + msgnum, multipart_chosen); + return; + } + + total_length = extract_int(&buf[4], 0); + extract(content_type, &buf[4], 3); + + if ( (strlen(content_type) ==0) + ||(!strcasecmp(content_type, "text")) + ||(!strcasecmp(content_type, "text/english")) + ) { + strcpy(content_type, "text/plain"); + } + + partbuf = malloc(total_length); + if (partbuf == NULL) { + wprintf("Memory allocation error

"); + return; + } + + while (downloaded_length < total_length) { + if ((total_length - downloaded_length) < 4096) { + block_length = total_length - downloaded_length; + } + else { + block_length = 4096; + } + serv_printf("READ %d|%d", downloaded_length, block_length); + serv_gets(buf); + if (buf[0] == '6') { + block_length = extract_int(&buf[4], 0); + serv_read(partbuf, block_length); + downloaded_length += block_length; + } + } + + serv_puts("CLOS"); + serv_gets(buf); + + if (!strcasecmp(content_type, "text/plain")) { + output_text_plain(partbuf, total_length); + } + else { + wprintf("Unknown content type %s

\n", + content_type); + } + + free(partbuf); +} + + + +/* + * I wanna SEE that message! + */ void read_message(long msgnum) { char buf[SIZ]; char mime_partnum[SIZ]; @@ -215,15 +297,18 @@ void read_message(long msgnum) { int bq = 0; char vcard_partnum[SIZ]; char *vcard_source = NULL; + int multipart_hunting = 0; + char multipart_chosen[SIZ]; + char multipart_prefix[SIZ]; strcpy(from, ""); strcpy(node, ""); strcpy(rfca, ""); strcpy(reply_to, ""); strcpy(vcard_partnum, ""); + strcpy(multipart_chosen, "1"); - sprintf(buf, "MSG0 %ld", msgnum); - serv_puts(buf); + serv_printf("MSG0 %ld|1", msgnum); /* ask for headers only */ serv_gets(buf); if (buf[0] != '1') { wprintf("ERROR: %s
\n", &buf[4]); @@ -238,7 +323,7 @@ void read_message(long msgnum) { wprintf("COLOR=\"000000\"> "); strcpy(m_subject, ""); - while (serv_gets(buf), strncasecmp(buf, "text", 4)) { + while (serv_gets(buf), strcasecmp(buf, "000")) { if (!strncasecmp(buf, "nhdr=yes", 8)) nhdr = 1; if (nhdr == 1) @@ -284,6 +369,36 @@ void read_message(long msgnum) { wprintf("%s ", now); } + if (format_type == 4) { + if (!strncasecmp(buf, "pref=", 5)) { + extract(multipart_prefix, &buf[5], 1); + if (!strcasecmp(multipart_prefix, + "multipart/alternative")) { + ++multipart_hunting; + } + } + if (!strncasecmp(buf, "suff=", 5)) { + extract(multipart_prefix, &buf[5], 1); + if (!strcasecmp(multipart_prefix, + "multipart/alternative")) { + --multipart_hunting; + } + } + if (!strncasecmp(buf, "part=", 5)) { + if (multipart_hunting > 0) { + extract(mime_partnum, &buf[5], 2); + extract(mime_content_type, &buf[5], 4); + if ( (!strcasecmp(mime_content_type, + "text/plain")) + || (!strcasecmp(mime_content_type, + "text/html")) ) { + strcpy(multipart_chosen, + mime_partnum); + } + } + } + } + if (!strncasecmp(buf, "part=", 5)) { extract(mime_filename, &buf[5], 1); extract(mime_partnum, &buf[5], 2); @@ -398,29 +513,50 @@ void read_message(long msgnum) { wprintf("\n"); + + /* Messages in legacy Citadel variformat get handled thusly... */ if (format_type == 0) { - fmout(NULL); - } else { - while (serv_gets(buf), strcmp(buf, "000")) { - while ((strlen(buf) > 0) && (isspace(buf[strlen(buf) - 1]))) - buf[strlen(buf) - 1] = 0; - if ((bq == 0) && - ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) || (!strncmp(buf, " :-)", 4)))) { - wprintf(""); - bq = 1; - } else if ((bq == 1) && - (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) && (strncmp(buf, " :-)", 4))) { - wprintf(""); - bq = 0; + serv_printf("MSG0 %ld", msgnum); + serv_gets(buf); + if (buf[0] == '1') { + while (serv_gets(buf), strncasecmp(buf, "text", 4)) { } + fmout(NULL); + } + } + + /* Boring old 80-column fixed format text gets handled this way... */ + if (format_type == 1) { + serv_printf("MSG0 %ld", msgnum); + serv_gets(buf); + if (buf[0] == '1') { + while (serv_gets(buf), strncasecmp(buf, "text", 4)) { } + while (serv_gets(buf), strcmp(buf, "000")) { + while ((strlen(buf) > 0) && (isspace(buf[strlen(buf) - 1]))) + buf[strlen(buf) - 1] = 0; + if ((bq == 0) && + ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) || (!strncmp(buf, " :-)", 4)))) { + wprintf(""); + bq = 1; + } else if ((bq == 1) && + (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) && (strncmp(buf, " :-)", 4))) { + wprintf(""); + bq = 0; + } + wprintf(""); + url(buf); + escputs(buf); + wprintf("
\n"); } - wprintf(""); - url(buf); - escputs(buf); - wprintf("
\n"); } + wprintf("
"); + } + + /* MIME! Rock on!! */ + if (format_type == 4) { + output_chosen_part(msgnum, multipart_chosen); } - wprintf("
"); + /* Afterwards, offer links to download attachments 'n' such */ if (mime_http != NULL) { wprintf("%s", mime_http); free(mime_http); -- 2.39.2