From 3001ec590c36f696c898ad52a43654de140ac246 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Tue, 23 Jul 2002 04:43:59 +0000 Subject: [PATCH] * Updated message reading to use the new MSG4 command, so we can do output of various types of richtext (mainly HTML). --- webcit/ChangeLog | 5 ++ webcit/html2html.c | 36 +++++++-- webcit/messages.c | 198 ++++++++++----------------------------------- webcit/serv_func.c | 8 +- webcit/webcit.h | 2 +- 5 files changed, 84 insertions(+), 165 deletions(-) diff --git a/webcit/ChangeLog b/webcit/ChangeLog index b725d3052..a6fa7ec7e 100644 --- a/webcit/ChangeLog +++ b/webcit/ChangeLog @@ -1,4 +1,8 @@ $Log$ +Revision 323.49 2002/07/23 04:43:58 ajc +* Updated message reading to use the new MSG4 command, so we can do output + of various types of richtext (mainly HTML). + Revision 323.48 2002/07/16 03:37:24 ajc * Small change to above @@ -868,3 +872,4 @@ Sun Dec 6 19:50:55 EST 1998 Art Cancro 1998-12-03 Nathan Bryant * webserver.c: warning fix + diff --git a/webcit/html2html.c b/webcit/html2html.c index 8fdc8cb38..705d7e76e 100644 --- a/webcit/html2html.c +++ b/webcit/html2html.c @@ -26,20 +26,38 @@ #include #include "webcit.h" #include "vcard.h" +#include "webserver.h" /* - * Here we go. Please note that the buffer may be changed by this function! */ -void output_text_html(char *partbuf, int total_length) { - +void output_html(void) { + char buf[SIZ]; + char *msg; char *ptr; char *msgstart; char *msgend; + int total_length = 1; + int line_length = 0; + + msg = strdup(""); + msgstart = msg; + msgend = msg; + + while (serv_gets(buf), strcmp(buf, "000")) { + line_length = strlen(buf); + total_length = total_length + line_length + 1; + msg = realloc(msg, total_length); + strcpy(msgend, buf); + strcat(msgend, "\n"); + msgend = &msgend[line_length + 1]; + } + + ptr = msg; + msgstart = msg; + msgend = &msg[total_length]; - ptr = partbuf; - msgstart = partbuf; - msgend = &partbuf[total_length]; + fprintf(stderr, "msg looks like this:\n%s\n", ptr); while (ptr < msgend) { @@ -75,7 +93,11 @@ void output_text_html(char *partbuf, int total_length) { write(WC->http_sock, msgstart, strlen(msgstart)); - /* Close a bunch of tags that might have been opened */ + /* Close a bunch of tags that might have been opened wprintf("
\n"); + */ + + /* Now give back the memory */ + free(msg); } diff --git a/webcit/messages.c b/webcit/messages.c index 8d9bf78c9..f4a43e3fb 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -25,6 +25,7 @@ #include #include "webcit.h" #include "vcard.h" +#include "webserver.h" /* @@ -194,95 +195,6 @@ 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 + 1); - if (partbuf == NULL) { - wprintf("Memory allocation error

"); - return; - } - - partbuf[total_length] = 0; /* Give it a nice null terminator */ - - /* FIXME ... add something to make this die if we - * lose the server connection. - */ - 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 if (!strcasecmp(content_type, "text/html")) { - output_text_html(partbuf, total_length); - } - else { - wprintf("Unknown content type %s

\n", - content_type); - } - - free(partbuf); -} - - - - - /* * I wanna SEE that message! */ @@ -305,18 +217,14 @@ 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"); - serv_printf("MSG0 %ld|1", msgnum); /* ask for headers only */ + serv_printf("MSG4 %ld", msgnum); serv_gets(buf); if (buf[0] != '1') { wprintf("ERROR: %s
\n", &buf[4]); @@ -331,7 +239,7 @@ void read_message(long msgnum) { wprintf("COLOR=\"000000\"> "); strcpy(m_subject, ""); - while (serv_gets(buf), strcasecmp(buf, "000")) { + while (serv_gets(buf), strcasecmp(buf, "text")) { if (!strncasecmp(buf, "nhdr=yes", 8)) nhdr = 1; if (nhdr == 1) @@ -377,36 +285,6 @@ 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); @@ -521,49 +399,57 @@ void read_message(long msgnum) { wprintf("\n"); + /* + * Learn the content type + */ + strcpy(mime_content_type, "text/plain"); + while (serv_gets(buf), (strlen(buf) > 0)) { + if (!strncasecmp(buf, "Content-type: ", 14)) { + safestrncpy(mime_content_type, &buf[14], + sizeof(mime_content_type)); + } + } /* Messages in legacy Citadel variformat get handled thusly... */ - if (format_type == 0) { - serv_printf("MSG0 %ld", msgnum); - serv_gets(buf); - if (buf[0] == '1') { - while (serv_gets(buf), strncasecmp(buf, "text", 4)) { } - fmout(NULL); - } + if (!strcasecmp(mime_content_type, "text/x-citadel-variformat")) { + 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"); + else if (!strcasecmp(mime_content_type, "text/plain")) { + 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("
"); } - /* MIME! Rock on!! */ - if (format_type == 4) { - output_chosen_part(msgnum, multipart_chosen); + else /* HTML is fun, but we've got to strip it first */ + if (!strcasecmp(mime_content_type, "text/html")) { + output_html(); } + /* Unknown weirdness */ + else { + wprintf("I don't know how to display %s
\n", + mime_content_type); + while (serv_gets(buf), strcmp(buf, "000")) { } + } + + /* Afterwards, offer links to download attachments 'n' such */ if (mime_http != NULL) { wprintf("%s", mime_http); diff --git a/webcit/serv_func.c b/webcit/serv_func.c index fd5193694..d8c41ad39 100644 --- a/webcit/serv_func.c +++ b/webcit/serv_func.c @@ -32,13 +32,14 @@ struct serv_info serv_info; /* - * get info about the server we've WC->connected to + * get info about the server we've connected to */ void get_serv_info(char *browser_host, char *user_agent) { char buf[SIZ]; int a; + /* Tell the server what kind of client is connecting */ serv_printf("IDEN %d|%d|%d|%s|%s", DEVELOPER_ID, CLIENT_ID, @@ -48,6 +49,11 @@ void get_serv_info(char *browser_host, char *user_agent) ); serv_gets(buf); + /* Tell the server what kind of richtext we prefer */ + serv_puts("MSGP text/html|text/plain"); + serv_gets(buf); + + /* Now ask the server to tell us a little bit about itself... */ serv_puts("INFO"); serv_gets(buf); if (buf[0] != '1') diff --git a/webcit/webcit.h b/webcit/webcit.h index 7ca0b51c8..500fa6f1b 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -314,4 +314,4 @@ char *safestrncpy(char *dest, const char *src, size_t n); void display_addressbook(long msgnum, char alpha); void offer_start_page(void); void change_start_page(void); -void output_text_html(char *partbuf, int total_length); +void output_html(void); -- 2.30.2