ReplyToAll: fix typo in string matching table
[citadel.git] / webcit / messages.c
index f990c8700b09d1e358e502181194cccc5ec5c045..dec8d66764cdb0e105c19bd10e414a287423adce 100644 (file)
@@ -37,6 +37,15 @@ typedef struct _MsgPartEvaluatorStruct {
        MsgPartEvaluatorFunc f;
 } MsgPartEvaluatorStruct;
 
+void fixview()
+{
+       /* workaround for json listview; its not useable directly */
+       if (WC->CurRoom.view == VIEW_JSON_LIST) {
+               StrBuf *View = NewStrBuf();
+               StrBufPrintf(View, "%d", VIEW_MAILBOX);
+               putbstr("view", View);;
+       }
+}
 int load_message(message_summary *Msg, 
                 StrBuf *FoundCharset,
                 StrBuf **Error)
@@ -179,9 +188,13 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co
        void *vHdr;
        long len;
        const char *Key;
+       WCTemplputParams SuperTP;
        WCTemplputParams SubTP;
        StrBuf *Error = NULL;
 
+       memset(&SuperTP, 0, sizeof(WCTemplputParams));
+       memset(&SubTP, 0, sizeof(WCTemplputParams));
+
        Buf = NewStrBuf();
        FoundCharset = NewStrBuf();
        Msg = (message_summary *)malloc(sizeof(message_summary));
@@ -202,37 +215,46 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co
        StrBufTrim(Buf);
        StrBufLowerCase(Buf);
 
-       /* Locate a renderer capable of converting this MIME part into HTML */
-       if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) &&
-           (vHdr != NULL)) {
-               RenderMimeFuncStruct *Render;
-               Render = (RenderMimeFuncStruct*)vHdr;
-               Render->f(Msg->MsgBody, NULL, FoundCharset);
-       }
-
-       if (StrLength(Msg->reply_references)> 0) {
-               /* Trim down excessively long lists of thread references.  We eliminate the
-                * second one in the list so that the thread root remains intact.
-                */
-               int rrtok = num_tokens(ChrPtr(Msg->reply_references), '|');
-               int rrlen = StrLength(Msg->reply_references);
-               if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
-                       StrBufRemove_token(Msg->reply_references, 1, '|');
+       StackContext(NULL, &SuperTP, Msg, CTX_MAILSUM, 0, NULL);
+       {
+               /* Locate a renderer capable of converting this MIME part into HTML */
+               if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) &&
+                   (vHdr != NULL)) {
+                       RenderMimeFuncStruct *Render;
+                       
+                       StackContext(&SuperTP, &SubTP, Msg->MsgBody, CTX_MIME_ATACH, 0, NULL);
+                       {
+                               Render = (RenderMimeFuncStruct*)vHdr;
+                               Render->f(Target, &SubTP, FoundCharset);
+                       }
+                       UnStackContext(&SubTP);
+               }
+               
+               if (StrLength(Msg->reply_references)> 0) {
+                       /* Trim down excessively long lists of thread references.  We eliminate the
+                        * second one in the list so that the thread root remains intact.
+                        */
+                       int rrtok = num_tokens(ChrPtr(Msg->reply_references), '|');
+                       int rrlen = StrLength(Msg->reply_references);
+                       if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
+                               StrBufRemove_token(Msg->reply_references, 1, '|');
+                       }
                }
-       }
 
-       /* now check if we need to translate some mimeparts, and remove the duplicate */
-       it = GetNewHashPos(Msg->AllAttach, 0);
-       while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) && 
-              (vMime != NULL)) {
-               wc_mime_attachment *Mime = (wc_mime_attachment*) vMime;
-               evaluate_mime_part(Msg, Mime);
+               /* now check if we need to translate some mimeparts, and remove the duplicate */
+               it = GetNewHashPos(Msg->AllAttach, 0);
+               while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) && 
+                      (vMime != NULL)) {
+                       StackContext(&SuperTP, &SubTP, vMime, CTX_MIME_ATACH, 0, NULL);
+                       {
+                               evaluate_mime_part(Target, &SubTP);
+                       }
+                       UnStackContext(&SubTP);
+               }
+               DeleteHashPos(&it);
+               *OutMime = DoTemplate(tmpl, tmpllen, Target, &SuperTP);
        }
-       DeleteHashPos(&it);
-       memset(&SubTP, 0, sizeof(WCTemplputParams));
-       SubTP.Filter.ContextType = CTX_MAILSUM;
-       SubTP.Context = Msg;
-       *OutMime = DoTemplate(tmpl, tmpllen, Target, &SubTP);
+       UnStackContext(&SuperTP);
 
        DestroyMessageSummary(Msg);
        FreeStrBuf(&FoundCharset);
@@ -315,7 +337,7 @@ HttpStatus(long CitadelStatus)
  */
 void handle_one_message(void) 
 {
-       long CitStatus;
+       long CitStatus = ERROR + NOT_HERE;
        int CopyMessage = 0;
        const StrBuf *Destination;
        void *vLine;
@@ -777,11 +799,14 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer)
 
        if (Stat.sortit) {
                CompareFunc SortIt;
-               memset(&SubTP, 0, sizeof(WCTemplputParams));
-               SubTP.Filter.ContextType = CTX_MAILSUM;
-               SubTP.Context = NULL;
-               SortIt =  RetrieveSort(&SubTP, NULL, 0,
-                                      HKEY("date"), Stat.defaultsortorder);
+               StackContext(NULL, &SubTP, NULL, CTX_MAILSUM, 0, NULL);
+               {
+                       SortIt =  RetrieveSort(&SubTP,
+                                              NULL, 0,
+                                              HKEY("date"),
+                                              Stat.defaultsortorder);
+               }
+               UnStackContext(&SubTP);
                if (SortIt != NULL)
                        SortByPayload(WCC->summ, SortIt);
        }
@@ -890,7 +915,9 @@ void post_mime_to_server(void) {
        }
 
        /* Only do multipart/alternative for mailboxes.  BBS and Wiki rooms don't need it. */
-       if (WC->CurRoom.view == VIEW_MAILBOX) {
+       if ((WCC->CurRoom.view == VIEW_MAILBOX) ||
+           (WCC->CurRoom.view == VIEW_JSON_LIST))
+       {
                include_text_alt = 1;
        }
 
@@ -1116,13 +1143,14 @@ void post_message(void)
                                                serv_printf("Cc: %s", ChrPtr(Cc));
                                                serv_printf("Bcc: %s", ChrPtr(Bcc));
                                        } else {
-                                               serv_printf("X-Citadel-Room: %s", ChrPtr(WC->CurRoom.name));
+                                               serv_printf("X-Citadel-Room: %s", ChrPtr(WCC->CurRoom.name));
                                        }
                                }
                                post_mime_to_server();
                                if (saving_to_drafts) {
                                        AppendImportantMessage(_("Message has been saved to Drafts.\n"), -1);
                                        gotoroom(WCC->CurRoom.name);
+                                       fixview();
                                        readloop(readnew, eUseDefault);
                                        FreeStrBuf(&Buf);
                                        return;
@@ -1174,6 +1202,7 @@ void post_message(void)
         *  Otherwise, just go to the "read messages" loop.
         */
        else {
+               fixview();
                readloop(readnew, eUseDefault);
        }
 }
@@ -1303,14 +1332,29 @@ long l_msgn;
 long l_from;
 long l_rcpt;
 long l_cccc;
+long l_replyto;
 long l_node;
 long l_rfca;
-
+long l_nvto;
+
+const char *ReplyToModeStrings [3] = {
+       "reply",
+       "replyall",
+       "forward"
+};
+typedef enum _eReplyToNodes {
+       eReply,
+       eReplyAll,
+       eForward
+}eReplyToNodes;
+       
 /*
  * display the message entry screen
  */
 void display_enter(void)
 {
+       const char *ReplyingModeStr;
+       eReplyToNodes ReplyMode = eReply;
        StrBuf *Line;
        long Result;
        int rc;
@@ -1345,6 +1389,7 @@ void display_enter(void)
        }
        else if (rc != 2) {             /* Any other error means that we cannot continue */
                rc = GetServerStatusMsg(Line, &Result, 0, 2);
+               fixview();
                readloop(readnew, eUseDefault);
                FreeStrBuf(&Line);
                return;
@@ -1386,6 +1431,15 @@ void display_enter(void)
        }
 
 
+       ReplyingModeStr = bstr("replying_mode");
+       if (ReplyingModeStr != NULL) for (i = 0; i < 3; i++) {
+                       if (strcmp(ReplyingModeStr, ReplyToModeStrings[i]) == 0) {
+                               ReplyMode = (eReplyToNodes) i;
+                               break;
+                       }
+               }
+               
+
        /*
         * If the "replying_to" variable is set, it refers to a message
         * number from which we must extract some header fields...
@@ -1400,6 +1454,8 @@ void display_enter(void)
                StrBuf *rfca = NULL;
                StrBuf *rcpt = NULL;
                StrBuf *cccc = NULL;
+               StrBuf *replyto = NULL;
+               StrBuf *nvto = NULL;
                serv_printf("MSG0 %ld|1", replying_to); 
 
                StrBuf_ServGetln(Line);
@@ -1419,7 +1475,7 @@ void display_enter(void)
                                        StrBuf *subj = NewStrBuf();
                                        StrBuf *FlatSubject;
 
-                                       if (!strcasecmp(bstr("replying_mode"), "forward")) {
+                                       if (ReplyMode == eForward) {
                                                if (strncasecmp(ChrPtr(Line) + 5, "Fw:", 3)) {
                                                        StrBufAppendBufPlain(subj, HKEY("Fw: "), 0);
                                                }
@@ -1483,7 +1539,9 @@ void display_enter(void)
                                else if (which == l_node) {
                                        node = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
                                }
-                               
+                               else if (which == l_replyto) {
+                                       replyto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                               }
                                else if (which == l_rfca) {
                                        StrBuf *FlatRFCA;
                                        rfca = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
@@ -1492,6 +1550,10 @@ void display_enter(void)
                                        FreeStrBuf(&rfca);
                                        rfca = FlatRFCA;
                                }
+                               else if (which == l_nvto) {
+                                       nvto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                       putbstr("nvto", nvto);
+                               }
                        }
 
 
@@ -1514,11 +1576,14 @@ void display_enter(void)
                /*
                 * If this is a Reply or a ReplyAll, copy the sender's email into the To: field
                 */
-               if (    (!strcasecmp(bstr("replying_mode"), "reply"))
-                       || (!strcasecmp(bstr("replying_mode"), "replyall"))
-               ) {
+               if ((ReplyMode == eReply) || (ReplyMode == eReplyAll))
+               {
                        StrBuf *to_rcpt;
-                       if (StrLength(rfca) > 0) {
+                       if ((StrLength(replyto) > 0) && (ReplyMode == eReplyAll)) {
+                               to_rcpt = NewStrBuf();
+                               StrBufAppendBuf(to_rcpt, replyto, 0);
+                       }
+                       else if (StrLength(rfca) > 0) {
                                to_rcpt = NewStrBuf();
                                StrBufAppendBuf(to_rcpt, from, 0);
                                StrBufAppendBufPlain(to_rcpt, HKEY(" <"), 0);
@@ -1529,7 +1594,7 @@ void display_enter(void)
                                to_rcpt =  from;
                                from = NULL;
                                if (    (StrLength(node) > 0)
-                                       && (strcasecmp(ChrPtr(node), ChrPtr(WC->serv_info->serv_nodename)))
+                                       && (strcasecmp(ChrPtr(node), ChrPtr(WCC->serv_info->serv_nodename)))
                                ) {
                                        StrBufAppendBufPlain(to_rcpt, HKEY(" @ "), 0);
                                        StrBufAppendBuf(to_rcpt, node, 0);
@@ -1541,11 +1606,12 @@ void display_enter(void)
                /*
                 * Only if this is a ReplyAll, copy all recipients into the Cc: field
                 */
-               if (    (!strcasecmp(bstr("replying_mode"), "replyall"))
-               {
+               if (ReplyMode == eReplyAll)
+               {
                        StrBuf *cc_rcpt = rcpt;
                        rcpt = NULL;
-                       if (StrLength(cccc) > 0) {
+                       if ((StrLength(cccc) > 0) && (StrLength(replyto) == 0))
+                       {
                                if (cc_rcpt != NULL)  {
                                        StrBufAppendPrintf(cc_rcpt, ", ");
                                        StrBufAppendBuf(cc_rcpt, cccc, 0);
@@ -1616,6 +1682,7 @@ void display_enter(void)
                else if (rc != 2) {     /* Any other error means that we cannot continue */
                        AppendImportantMessage(ChrPtr(CmdBuf) + 4, StrLength(CmdBuf) - 4);
                        FreeStrBuf(&CmdBuf);
+                       fixview();
                        readloop(readnew, eUseDefault);
                        return;
                }
@@ -1654,6 +1721,8 @@ void delete_msg(void)
        StrBuf_ServGetln(Line);
        GetServerStatusMsg(Line, NULL, 1, 0);
 
+       fixview();
+
        readloop(readnew, eUseDefault);
 }
 
@@ -1678,6 +1747,7 @@ void move_msg(void)
                AppendImportantMessage(_("The message was not moved."), -1);
        }
 
+       fixview();
        readloop(readnew, eUseDefault);
 }
 
@@ -2004,8 +2074,10 @@ InitModule_MSG
        l_from = FourHash("from", 4);
        l_rcpt = FourHash("rcpt", 4);
        l_cccc = FourHash("cccc", 4);
+       l_replyto = FourHash("rep2", 4);
        l_node = FourHash("node", 4);
        l_rfca = FourHash("rfca", 4);
+       l_nvto = FourHash("nvto", 4);
 
        return ;
 }