]> code.citadel.org Git - citadel.git/blobdiff - webcit/messages.c
* read static/server files directly into the outbuffer
[citadel.git] / webcit / messages.c
index 81f2da5860a8ff6ae8c6bb47f5e33db611c09d04..e7f007484a2fa66e3456c9903dd08c6dddbb6d8d 100644 (file)
@@ -13,6 +13,8 @@
 #define SENDER_COL_WIDTH_PCT           30      /**< Mailbox view column width */
 #define DATE_PLUS_BUTTONS_WIDTH_PCT    20      /**< Mailbox view column width */
 
+void display_enter(void);
+
 /*
  * Address book entry (keep it short and sweet, it's just a quickie lookup
  * which we can use to get to the real meat and bones later)
@@ -661,14 +663,14 @@ void display_parsed_vcard(struct vCard *v, int full, long msgnum) {
                                        wprintf("</TD></TR>\n");
                                }
                        }
-                       else if (!strcasecmp(firsttoken, "photo") && full && pass == 2) { 
+                       /* else if (!strcasecmp(firsttoken, "photo") && full && pass == 2) { 
                                // Only output on second pass
                                wprintf("<tr><td>");
                                wprintf(_("Photo:"));
                                wprintf("</td><td>");
                                wprintf("<img src=\"/vcardphoto/%ld/\" alt=\"Contact photo\"/>",msgnum);
                                wprintf("</td></tr>\n");
-                       }
+                       } */
                        else if (!strcasecmp(firsttoken, "version")) {
                                /* ignore */
                        }
@@ -1390,13 +1392,11 @@ ENDBODY:        /* If there are attached submessages, display them now... */
  *
  * msgnum_as_string == Message number, as a string instead of as a long int
  */
-void embed_message(char *msgnum_as_string) {
+void embed_message(void) {
        long msgnum = 0L;
 
-       msgnum = atol(msgnum_as_string);
-       begin_ajax_response();
+       msgnum = StrTol(WC->UrlFragment1);
        read_message(msgnum, 0, "");
-       end_ajax_response();
 }
 
 
@@ -1405,19 +1405,19 @@ void embed_message(char *msgnum_as_string) {
  *
  * msgnum_as_string == Message number, as a string instead of as a long int
  */
-void print_message(char *msgnum_as_string) {
+void print_message(void) {
        long msgnum = 0L;
 
-       msgnum = atol(msgnum_as_string);
+       msgnum = StrTol(WC->UrlFragment1);
        output_headers(0, 0, 0, 0, 0, 0);
 
-       wprintf("Content-type: text/html\r\n"
+       hprintf("Content-type: text/html\r\n"
                "Server: %s\r\n"
                "Connection: close\r\n",
                PACKAGE_STRING);
        begin_burst();
 
-       wprintf("\r\n\r\n<html>\n<head><title>");
+       wprintf("\r\n<html>\n<head><title>");
        escputs(WC->wc_fullname);
        wprintf("</title></head>\n"
                "<body onLoad=\" window.print(); window.close(); \">\n"
@@ -1436,14 +1436,14 @@ void print_message(char *msgnum_as_string) {
  *
  * \param msgnum_as_string Message number, as a string instead of as a long int
  */
-void display_headers(char *msgnum_as_string) {
+void display_headers(void) {
        long msgnum = 0L;
        char buf[1024];
 
-       msgnum = atol(msgnum_as_string);
+       msgnum = StrTol(WC->UrlFragment1);
        output_headers(0, 0, 0, 0, 0, 0);
 
-       wprintf("Content-type: text/plain\r\n"
+       hprintf("Content-type: text/plain\r\n"
                "Server: %s\r\n"
                "Connection: close\r\n",
                PACKAGE_STRING);
@@ -2220,6 +2220,8 @@ int load_msg_ptrs(char *servcmd, int with_headers)
        return (nummsgs);
 }
 
+
+typedef int (*QSortFunction) (const void*, const void*);
 /**
  * \brief qsort() compatible function to compare two longs in descending order.
  *
@@ -2336,6 +2338,84 @@ int summcmp_rdate(const void *s1, const void *s2) {
 }
 
 
+enum {
+       eUp,
+       eDown,
+       eNone
+};
+
+const char* SortIcons[3] = {
+       "static/up_pointer.gif",
+       "static/down_pointer.gif",
+       "static/sort_none.gif"
+};
+
+ enum  {/// SortByEnum
+       eDate,
+       eRDate,
+       eSubject,
+       eRSubject,
+       eSender,
+       eRSender,
+       eReverse,
+       eUnSet
+}; 
+
+/** SortEnum to plain string representation */
+static const char* SortByStrings[] = {
+       "date",
+       "rdate",
+       "subject", 
+       "rsubject", 
+       "sender",
+       "rsender",
+       "reverse",
+       "unset"
+};
+
+/** SortEnum to sort-Function Table */
+const QSortFunction SortFuncs[eUnSet] = {
+       summcmp_date,
+       summcmp_rdate,
+       summcmp_subj,
+       summcmp_rsubj,
+       summcmp_sender,
+       summcmp_rsender,
+       summcmp_rdate
+};
+
+/** given a SortEnum, which icon should we choose? */
+const int SortDateToIcon[eUnSet] = { eUp, eDown, eNone, eNone, eNone, eNone, eNone};
+const int SortSubjectToIcon[eUnSet] = { eNone, eNone, eUp, eDown, eNone, eNone, eNone};
+const int SortSenderToIcon[eUnSet] = { eNone, eNone, eNone, eNone, eUp, eDown, eNone};
+
+/** given a SortEnum, which would be the "opposite" search option? */
+const int DateInvertSortString[eUnSet] =  { eRDate, eDate, eDate, eDate, eDate, eDate, eDate};
+const int SubjectInvertSortString[eUnSet] =  { eSubject, eSubject, eRSubject, eUnSet, eSubject, eSubject, eSubject};
+const int SenderInvertSortString[eUnSet] =  { eSender, eSender, eSender, eSender, eRSender, eUnSet, eSender};
+
+
+/**
+ * \Brief Translates sortoption String to its SortEnum representation 
+ * \param SortBy string to translate
+ * \return the enum matching the string; defaults to RDate
+ */
+//SortByEnum 
+int StrToESort (StrBuf *sortby)
+{
+       int result = eDate;
+
+       if (!IsEmptyStr(ChrPtr(sortby))) while (result < eUnSet){
+                       if (!strcasecmp(ChrPtr(sortby), 
+                                       SortByStrings[result])) 
+                               return result;
+                       result ++;
+               }
+       return eRDate;
+}
+
+
+
 
 /**
  * \brief command loop for reading messages
@@ -2366,11 +2446,10 @@ void readloop(char *oper)
        struct addrbookent *addrbook = NULL;
        int num_ab = 0;
        StrBuf *sortby = NULL;
+       //SortByEnum 
+       int SortBy = eRDate;
        StrBuf *sortpref_name;
        StrBuf *sortpref_value;
-       char *subjsort_button;
-       char *sendsort_button;
-       char *datesort_button;
        int bbs_reverse = 0;
        struct wcsession *WCC = WC;     /* This is done to make it run faster; WC is a function */
 
@@ -2391,17 +2470,16 @@ void readloop(char *oper)
 
        sortby = NewStrBufPlain(bstr("sortby"), -1);
        if ( (!IsEmptyStr(ChrPtr(sortby))) && 
-            (strcasecmp(ChrPtr(sortby), ChrPtr(sortpref_value))) {
+            (strcasecmp(ChrPtr(sortby), ChrPtr(sortpref_value)) != 0)) {
                set_pref(sortpref_name, sortby, 1);
+               sortpref_value = NULL;
+               sortpref_value = sortby;
        }
+       
        FreeStrBuf(&sortpref_name);
-       if (IsEmptyStr(ChrPtr(sortby))) StrBufAppendBuf(sortby,  sortpref_value, 0);
-
-       /** mailbox sort */
-       if (IsEmptyStr(ChrPtr(sortby))) StrBufPrintf(sortby, "rdate");
-
+       SortBy = StrToESort(sortpref_value);
        /** message board sort */
-       if (!strcasecmp(ChrPtr(sortby), "reverse")) {
+       if (SortBy == eReverse) {
                bbs_reverse = 1;
        }
        else {
@@ -2458,7 +2536,7 @@ void readloop(char *oper)
        } 
        if (WCC->is_mobile) {
                maxmsgs = 20;
-               StrBufPrintf(sortby, "rdate");
+               SortBy =  eRDate;
        }
 
        /**
@@ -2539,61 +2617,10 @@ void readloop(char *oper)
        }
 
        if (is_summary || WCC->is_mobile) {
-               if (!strcasecmp(ChrPtr(sortby), "subject")) {
-                       qsort(WCC->summ, WCC->num_summ,
-                               sizeof(struct message_summary), summcmp_subj);
-               }
-               else if (!strcasecmp(ChrPtr(sortby), "rsubject")) {
-                       qsort(WCC->summ, WCC->num_summ,
-                               sizeof(struct message_summary), summcmp_rsubj);
-               }
-               else if (!strcasecmp(ChrPtr(sortby), "sender")) {
-                       qsort(WCC->summ, WCC->num_summ,
-                               sizeof(struct message_summary), summcmp_sender);
-               }
-               else if (!strcasecmp(ChrPtr(sortby), "rsender")) {
-                       qsort(WCC->summ, WCC->num_summ,
-                               sizeof(struct message_summary), summcmp_rsender);
-               }
-               else if (!strcasecmp(ChrPtr(sortby), "date")) {
-                       qsort(WCC->summ, WCC->num_summ,
-                               sizeof(struct message_summary), summcmp_date);
-               }
-               else if (!strcasecmp(ChrPtr(sortby), "rdate")) {
-                       qsort(WCC->summ, WCC->num_summ,
-                               sizeof(struct message_summary), summcmp_rdate);
-               }
-       }
-
-       if (!strcasecmp(ChrPtr(sortby), "subject")) {
-               subjsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=rsubject\"><img border=\"0\" src=\"static/down_pointer.gif\" /></a>" ;
-       }
-       else if (!strcasecmp(ChrPtr(sortby), "rsubject")) {
-               subjsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=subject\"><img border=\"0\" src=\"static/up_pointer.gif\" /></a>" ;
-       }
-       else {
-               subjsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=subject\"><img border=\"0\" src=\"static/sort_none.gif\" /></a>" ;
+               qsort(WCC->summ, WCC->num_summ,
+                     sizeof(struct message_summary), SortFuncs[SortBy]);
        }
 
-       if (!strcasecmp(ChrPtr(sortby), "sender")) {
-               sendsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=rsender\"><img border=\"0\" src=\"static/down_pointer.gif\" /></a>" ;
-       }
-       else if (!strcasecmp(ChrPtr(sortby), "rsender")) {
-               sendsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=sender\"><img border=\"0\" src=\"static/up_pointer.gif\" /></a>" ;
-       }
-       else {
-               sendsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=sender\"><img border=\"0\" src=\"static/sort_none.gif\" /></a>" ;
-       }
-
-       if (!strcasecmp(ChrPtr(sortby), "date")) {
-               datesort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=rdate\"><img border=\"0\" src=\"static/down_pointer.gif\" /></a>" ;
-       }
-       else if (!strcasecmp(ChrPtr(sortby), "rdate")) {
-               datesort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=date\"><img border=\"0\" src=\"static/up_pointer.gif\" /></a>" ;
-       }
-       else {
-               datesort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=rdate\"><img border=\"0\" src=\"static/sort_none.gif\" /></a>" ;
-       }
 
        if (is_summary) {
 
@@ -2611,9 +2638,9 @@ void readloop(char *oper)
                        "<table cellspacing=0 style=\"width:100%%\">"
                        "<tr>"
                );
-               wprintf("<th width=%d%%>%s %s</th>"
-                       "<th width=%d%%>%s %s</th>"
-                       "<th width=%d%%>%s %s"
+               wprintf("<th width=%d%%>%s <a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=%s\"><img border=\"0\" src=\"%s\" /></a> </th>\n"
+                       "<th width=%d%%>%s <a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=%s\"><img border=\"0\" src=\"%s\" /></a> </th>\n"
+                       "<th width=%d%%>%s <a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=%s\"><img border=\"0\" src=\"%s\" /></a> \n"
                        "&nbsp;"
                        "<input type=\"submit\" name=\"delete_button\" id=\"delbutton\" "
                        " onClick=\"CtdlDeleteSelectedMessages(event)\" "
@@ -2622,11 +2649,17 @@ void readloop(char *oper)
                        "</tr>\n"
                        ,
                        SUBJ_COL_WIDTH_PCT,
-                       _("Subject"),   subjsort_button,
+                       _("Subject"),
+                       SortByStrings[SubjectInvertSortString[SortBy]],
+                       SortIcons[SortSubjectToIcon[SortBy]],
                        SENDER_COL_WIDTH_PCT,
-                       _("Sender"),    sendsort_button,
+                       _("Sender"),
+                       SortByStrings[SenderInvertSortString[SortBy]],
+                       SortIcons[SortSenderToIcon[SortBy]],
                        DATE_PLUS_BUTTONS_WIDTH_PCT,
-                       _("Date"),      datesort_button,
+                       _("Date"),
+                       SortByStrings[DateInvertSortString[SortBy]],
+                       SortIcons[SortDateToIcon[SortBy]],
                        _("Delete")
                );
                wprintf("</table></div></div>\n");
@@ -3243,10 +3276,10 @@ void display_enter(void)
        int recipient_required = 0;
        int subject_required = 0;
        int recipient_bad = 0;
-       int i;
        int is_anonymous = 0;
        long existing_page = (-1L);
        size_t dplen;
+       struct wcsession *WCC = WC;
 
        now = time(NULL);
 
@@ -3269,7 +3302,7 @@ void display_enter(void)
                recipient_required = 1;
        }
        else if (buf[0] != '2') {               /** Any other error means that we cannot continue */
-               sprintf(WC->ImportantMessage, "%s", &buf[4]);
+               sprintf(WCC->ImportantMessage, "%s", &buf[4]);
                readloop("readnew");
                return;
        }
@@ -3283,8 +3316,8 @@ void display_enter(void)
         * Are we perhaps in an address book view?  If so, then an "enter
         * message" command really means "add new entry."
         */
-       if (WC->wc_default_view == VIEW_ADDRESSBOOK) {
-               do_edit_vcard(-1, "", "", WC->wc_roomname);
+       if (WCC->wc_default_view == VIEW_ADDRESSBOOK) {
+               do_edit_vcard(-1, "", "", WCC->wc_roomname);
                return;
        }
 
@@ -3292,7 +3325,7 @@ void display_enter(void)
         * Are we perhaps in a calendar room?  If so, then an "enter
         * message" command really means "add new calendar item."
         */
-       if (WC->wc_default_view == VIEW_CALENDAR) {
+       if (WCC->wc_default_view == VIEW_CALENDAR) {
                display_edit_event();
                return;
        }
@@ -3301,7 +3334,7 @@ void display_enter(void)
         * Are we perhaps in a tasks view?  If so, then an "enter
         * message" command really means "add new task."
         */
-       if (WC->wc_default_view == VIEW_TASKS) {
+       if (WCC->wc_default_view == VIEW_TASKS) {
                display_edit_task();
                return;
        }
@@ -3372,13 +3405,13 @@ void display_enter(void)
                "name=\"enterform\""
                ">\n");
        wprintf("<input type=\"hidden\" name=\"postseq\" value=\"%ld\">\n", now);
-       if (WC->wc_view == VIEW_WIKI) {
+       if (WCC->wc_view == VIEW_WIKI) {
                wprintf("<input type=\"hidden\" name=\"wikipage\" value=\"%s\">\n", bstr("wikipage"));
        }
        wprintf("<input type=\"hidden\" name=\"return_to\" value=\"%s\">\n", bstr("return_to"));
-       wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
+       wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WCC->nonce);
        wprintf("<input type=\"hidden\" name=\"force_room\" value=\"");
-       escputs(WC->wc_roomname);
+       escputs(WCC->wc_roomname);
        wprintf("\">\n");
        wprintf("<input type=\"hidden\" name=\"references\" value=\"");
        escputs(bstr("references"));
@@ -3430,9 +3463,9 @@ void display_enter(void)
                }
        }
 
-       if (WC->room_flags & QR_ANONOPT) {
+       if (WCC->room_flags & QR_ANONOPT) {
                wprintf("<option %s value=\"__ANONYMOUS__\">%s</option>\n",
-                       ((!strcasecmp(bstr("__ANONYMOUS__"), WC->wc_fullname)) ? "selected" : ""),
+                       ((!strcasecmp(bstr("__ANONYMOUS__"), WCC->wc_fullname)) ? "selected" : ""),
                        _("Anonymous")
                );
        }
@@ -3459,7 +3492,7 @@ void display_enter(void)
        }
 
        wprintf(_(" <I>in</I> "));
-       escputs(WC->wc_roomname);
+       escputs(WCC->wc_roomname);
 
        wprintf("</td></tr>");
 
@@ -3568,7 +3601,7 @@ void display_enter(void)
        }
 
        /** If we're editing a wiki page, insert the existing page here... */
-       else if (WC->wc_view == VIEW_WIKI) {
+       else if (WCC->wc_view == VIEW_WIKI) {
                safestrncpy(buf, bstr("wikipage"), sizeof buf);
                str_wiki_index(buf);
                existing_page = locate_message_by_uid(buf);
@@ -3578,37 +3611,42 @@ void display_enter(void)
        }
 
        /** Insert our signature if appropriate... */
-       if ( (WC->is_mailbox) && yesbstr("sig_inserted") ) {
+       if ( (WCC->is_mailbox) && !yesbstr("sig_inserted") ) {
                int UseSig;
                get_pref_yesno("use_sig", &UseSig, 0);
                if (UseSig) {
-                       int len;
+                       StrBuf *Sig;
+                       const char *sig, *esig;
+
                        get_preference("signature", &ebuf);
-                       euid_unescapize(buf, ChrPtr(ebuf));/////TODO
+                       Sig = NewStrBuf();
+                       StrBufEUid_unescapize(Sig, ebuf);
+                       sig = ChrPtr(Sig);
+                       esig = sig + StrLength(Sig);
                        wprintf("<br>--<br>");
-                       len = strlen(buf);
-                       for (i=0; i<len; ++i) {
-                               if (buf[i] == '\n') {
+                       while (sig <= esig) {
+                               if (*sig == '\n') {
                                        wprintf("<br>");
                                }
-                               else if (buf[i] == '<') {
+                               else if (*sig == '<') {
                                        wprintf("&lt;");
                                }
-                               else if (buf[i] == '>') {
+                               else if (*sig == '>') {
                                        wprintf("&gt;");
                                }
-                               else if (buf[i] == '&') {
+                               else if (*sig == '&') {
                                        wprintf("&amp;");
                                }
-                               else if (buf[i] == '\"') {
+                               else if (*sig == '\"') {
                                        wprintf("&quot;");
                                }
-                               else if (buf[i] == '\'') {
+                               else if (*sig == '\'') {
                                        wprintf("&#39;");
                                }
-                               else if (isprint(buf[i])) {
-                                       wprintf("%c", buf[i]);
-                               }
+                               else /* since we're utf 8, is this a good idea? if (isprint(*sig))*/ {
+                                       wprintf("%c", *sig);
+                               } 
+                               sig ++;
                        }
                }
        }
@@ -3630,7 +3668,7 @@ void display_enter(void)
        wprintf(_("Attachments:"));
        wprintf(" ");
        wprintf("<select name=\"which_attachment\" size=1>");
-       for (att = WC->first_attachment; att != NULL; att = att->next) {
+       for (att = WCC->first_attachment; att != NULL; att = att->next) {
                wprintf("<option value=\"");
                urlescputs(att->filename);
                wprintf("\">");
@@ -3762,3 +3800,29 @@ void confirm_move_msg(void)
        wprintf("</CENTER>\n");
        wDumpContent(1);
 }
+
+void readnew(void) { readloop("readnew");}
+void readold(void) { readloop("readold");}
+void readfwd(void) { readloop("readfwd");}
+void headers(void) { readloop("headers");}
+void do_search(void) { readloop("do_search");}
+
+void 
+InitModule_MSG
+(void)
+{
+       WebcitAddUrlHandler(HKEY("readnew"), readnew, 0);
+       WebcitAddUrlHandler(HKEY("readold"), readold, 0);
+       WebcitAddUrlHandler(HKEY("readfwd"), readfwd, 0);
+       WebcitAddUrlHandler(HKEY("headers"), headers, 0);
+       WebcitAddUrlHandler(HKEY("do_search"), do_search, 0);
+       WebcitAddUrlHandler(HKEY("display_enter"), display_enter, 0);
+       WebcitAddUrlHandler(HKEY("post"), post_message, 0);
+       WebcitAddUrlHandler(HKEY("move_msg"), move_msg, 0);
+       WebcitAddUrlHandler(HKEY("delete_msg"), delete_msg, 0);
+       WebcitAddUrlHandler(HKEY("confirm_move_msg"), confirm_move_msg, 0);
+       WebcitAddUrlHandler(HKEY("msg"), embed_message, NEED_URL|AJAX);
+       WebcitAddUrlHandler(HKEY("printmsg"), print_message, NEED_URL);
+       WebcitAddUrlHandler(HKEY("msgheaders"), display_headers, NEED_URL);
+       return ;
+}