#include <signal.h>
#include "webcit.h"
#include "vcard.h"
+#include "webserver.h"
/*
-void output_text_plain(char *partbuf, int total_length) {
- wprintf("<PRE>\n");
- write(WC->http_sock, partbuf, total_length);
- wprintf("</PRE><BR>\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("<I>Error reading msg %ld part %s</I><BR><BR>",
- 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("<I>Memory allocation error</I><BR><BR>");
- 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);
- }
- if (!strcasecmp(content_type, "text/html")) {
- output_text_html(partbuf, total_length);
- }
- else {
- wprintf("<I>Unknown content type %s</I><BR><BR>\n",
- content_type);
- }
-
- free(partbuf);
-}
-
-
-
-
-
/*
* I wanna SEE that message!
*/
int nhdr = 0;
int bq = 0;
char vcard_partnum[SIZ];
- char *vcard_source = NULL;
- int multipart_hunting = 0;
- char multipart_chosen[SIZ];
- char multipart_prefix[SIZ];
+ char cal_partnum[SIZ];
+ char *part_source = NULL;
strcpy(from, "");
strcpy(node, "");
strcpy(rfca, "");
strcpy(reply_to, "");
strcpy(vcard_partnum, "");
- strcpy(multipart_chosen, "1");
+ strcpy(cal_partnum, "");
- serv_printf("MSG0 %ld|1", msgnum); /* ask for headers only */
+ serv_printf("MSG4 %ld", msgnum);
serv_gets(buf);
if (buf[0] != '1') {
wprintf("<STRONG>ERROR:</STRONG> %s<BR>\n", &buf[4]);
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)
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);
msgnum, mime_partnum);
}
+ /*** begin handler prep ***/
if (!strcasecmp(mime_content_type, "text/x-vcard")) {
strcpy(vcard_partnum, mime_partnum);
}
+ if (!strcasecmp(mime_content_type, "text/calendar")) {
+ strcpy(cal_partnum, mime_partnum);
+ }
+
+ /*** end handler prep ***/
+
}
}
wprintf("</TR></TABLE>\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("<FONT COLOR=\"000044\"><I>");
- bq = 1;
- } else if ((bq == 1) &&
- (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) && (strncmp(buf, " :-)", 4))) {
- wprintf("</FONT></I>");
- bq = 0;
- }
- wprintf("<TT>");
- url(buf);
- escputs(buf);
- wprintf("</TT><BR>\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("<FONT COLOR=\"000044\"><I>");
+ bq = 1;
+ } else if ((bq == 1) &&
+ (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) && (strncmp(buf, " :-)", 4))) {
+ wprintf("</FONT></I>");
+ bq = 0;
}
+ wprintf("<TT>");
+ url(buf);
+ escputs(buf);
+ wprintf("</TT><BR>\n");
}
wprintf("</I><BR>");
}
- /* 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<BR>\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);
free(mime_http);
}
+ /* Handler for vCard parts */
if (strlen(vcard_partnum) > 0) {
- vcard_source = load_mimepart(msgnum, vcard_partnum);
- if (vcard_source != NULL) {
+ part_source = load_mimepart(msgnum, vcard_partnum);
+ if (part_source != NULL) {
/* If it's my vCard I can edit it */
if ( (!strcasecmp(WC->wc_roomname, USERCONFIGROOM))
}
/* In all cases, display the full card */
- display_vcard(vcard_source, 0, 1);
- free(vcard_source);
+ display_vcard(part_source, 0, 1);
}
}
+ /* Handler for calendar parts */
+ if (strlen(cal_partnum) > 0) {
+ part_source = load_mimepart(msgnum, cal_partnum);
+ if (part_source != NULL) {
+ cal_process_attachment(part_source);
+ }
+ }
+
+ if (part_source) {
+ free(part_source);
+ part_source = NULL;
+ }
+
}
int num_displayed = 0;
int is_summary = 0;
int is_addressbook = 0;
+ int is_calendar = 0;
+ int is_tasks = 0;
int remaining_messages;
int lo, hi;
int lowest_displayed = (-1);
else wprintf("<A HREF=\"/readfwd?alpha=1\">(other)</A>\n");
wprintf("<HR width=100%%>\n");
}
+ if (WC->wc_view == 3) { /* calendar */
+ is_calendar = 1;
+ strcpy(cmd, "MSGS ALL");
+ maxmsgs = 32767;
+ }
+ if (WC->wc_view == 4) { /* tasks */
+ is_tasks = 1;
+ strcpy(cmd, "MSGS ALL");
+ maxmsgs = 32767;
+ wprintf("<UL>");
+ }
nummsgs = load_msg_ptrs(cmd);
if (nummsgs == 0) {
else if (is_addressbook) {
display_addressbook(WC->msgarr[a], alpha);
}
+ else if (is_calendar) {
+ display_calendar(WC->msgarr[a]);
+ }
+ else if (is_tasks) {
+ display_task(WC->msgarr[a]);
+ }
else {
read_message(WC->msgarr[a]);
}
wprintf("</TABLE>\n");
}
+ if (is_tasks) {
+ wprintf("</UL>\n"
+ "<A HREF=\"/display_edit_task?msgnum=0\">"
+ "Add new task</A>\n"
+ );
+ }
+
/* Bump these because although we're thinking in zero base, the user
* is a drooling idiot and is thinking in one base.
*/