]> code.citadel.org Git - citadel.git/blobdiff - webcit/messages.c
* Changed decode_base64() to CtdlDecodeBase64() to avoid conflict with
[citadel.git] / webcit / messages.c
index 079c9c741d3924e88f03dd9c7fa8d33fd8673799..d5d98b155e6b187a267cfbbfb07dfd181c0d89a5 100644 (file)
@@ -25,6 +25,7 @@
 #include <signal.h>
 #include "webcit.h"
 #include "vcard.h"
+#include "webserver.h"
 
 
 /*
@@ -194,8 +195,9 @@ void display_vcard(char *vcard_source, char alpha, int full) {
 
 
 
-
-
+/*
+ * I wanna SEE that message!
+ */
 void read_message(long msgnum) {
        char buf[SIZ];
        char mime_partnum[SIZ];
@@ -214,16 +216,17 @@ void read_message(long msgnum) {
        int nhdr = 0;
        int bq = 0;
        char vcard_partnum[SIZ];
-       char *vcard_source = NULL;
+       char cal_partnum[SIZ];
+       char *part_source = NULL;
 
        strcpy(from, "");
        strcpy(node, "");
        strcpy(rfca, "");
        strcpy(reply_to, "");
        strcpy(vcard_partnum, "");
+       strcpy(cal_partnum, "");
 
-       sprintf(buf, "MSG0 %ld", msgnum);
-       serv_puts(buf);
+       serv_printf("MSG4 %ld", msgnum);
        serv_gets(buf);
        if (buf[0] != '1') {
                wprintf("<STRONG>ERROR:</STRONG> %s<BR>\n", &buf[4]);
@@ -238,7 +241,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, "text")) {
                if (!strncasecmp(buf, "nhdr=yes", 8))
                        nhdr = 1;
                if (nhdr == 1)
@@ -329,10 +332,17 @@ void read_message(long msgnum) {
                                        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 ***/
+
                }
 
        }
@@ -398,18 +408,33 @@ void read_message(long msgnum) {
 
        wprintf("</TR></TABLE>\n");
 
-       if (format_type == 0) {
+       /* 
+        * 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 (!strcasecmp(mime_content_type, "text/x-citadel-variformat")) {
                fmout(NULL);
-       } else {
+       }
+
+       /* Boring old 80-column fixed format text gets handled this way... */
+       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)))) {
+                       ((!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))) {
+                               (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) && (strncmp(buf, " :-)", 4))) {
                                wprintf("</FONT></I>");
                                bq = 0;
                        }
@@ -418,17 +443,32 @@ void read_message(long msgnum) {
                        escputs(buf);
                        wprintf("</TT><BR>\n");
                }
+               wprintf("</I><BR>");
+       }
+
+       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")) { }
        }
-       wprintf("</I><BR>");
 
+
+       /* 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))
@@ -440,11 +480,23 @@ void read_message(long msgnum) {
                        }
 
                        /* 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;
+       }
+
 }