* add a way to pass the workbuffers into the RFC-822 decoder, so we don't need to...
[citadel.git] / webcit / msg_renderers.c
index 5de3f3ba3d54ac4059563d0d13a55dbb292d26fe..a58f64043a5dbb6aff7e6e5e56568c788fc6f0ed 100644 (file)
@@ -2,6 +2,16 @@
 #include "webserver.h"
 #include "groupdav.h"
 
+
+
+inline void CheckConvertBufs(struct wcsession *WCC)
+{
+       if (WCC->ConvertBuf1 == NULL)
+               WCC->ConvertBuf1 = NewStrBuf();
+       if (WCC->ConvertBuf2 == NULL)
+               WCC->ConvertBuf2 = NewStrBuf();
+}
+
 /*
  * message index functions
  */
@@ -251,9 +261,17 @@ void examine_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 
 void examine_from(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->from);
        Msg->from = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->from, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->from, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
 }
 void tmplput_MAIL_SUMM_FROM(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -261,32 +279,61 @@ void tmplput_MAIL_SUMM_FROM(StrBuf *Target, WCTemplputParams *TP)
        StrBufAppendTemplate(Target, TP, Msg->from, 0);
 }
 
-
-
 void examine_subj(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->subj);
        Msg->subj = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->subj, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->subj, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
 }
 void tmplput_MAIL_SUMM_SUBJECT(StrBuf *Target, WCTemplputParams *TP)
-{/*////TODO: Fwd: and RE: filter!!*/
-
+{
        message_summary *Msg = (message_summary*) CTX;
+
+       if (TP->Tokens->nParameters == 4)
+       {
+               const char *pch;
+               long len;
+               
+               GetTemplateTokenString(Target, TP, 3, &pch, &len);
+               if ((len > 0)&&
+                   (strstr(ChrPtr(Msg->subj), pch) == NULL))
+               {
+                       GetTemplateTokenString(Target, TP, 2, &pch, &len);
+                       StrBufAppendBufPlain(Target, pch, len, 0);
+               }
+       }
        StrBufAppendTemplate(Target, TP, Msg->subj, 0);
 }
 int Conditional_MAIL_SUMM_SUBJECT(StrBuf *Target, WCTemplputParams *TP)
 {
        message_summary *Msg = (message_summary*) CTX;
+
+
        return StrLength(Msg->subj) > 0;
 }
 
 
 void examine_msgn(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->reply_inreplyto);
        Msg->reply_inreplyto = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->reply_inreplyto, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->reply_inreplyto, 
+                            HdrLine, 
+                            WCC->DefaultCharset,
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
 }
 void tmplput_MAIL_SUMM_INREPLYTO(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -297,14 +344,22 @@ void tmplput_MAIL_SUMM_INREPLYTO(StrBuf *Target, WCTemplputParams *TP)
 int Conditional_MAIL_SUMM_UNREAD(StrBuf *Target, WCTemplputParams *TP)
 {
        message_summary *Msg = (message_summary*) CTX;
-       return Msg->is_new != 0;
+       return (Msg->Flags & MSGFLAG_READ) != 0;
 }
 
 void examine_wefw(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->reply_references);
        Msg->reply_references = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->reply_references, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->reply_references, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
 }
 void tmplput_MAIL_SUMM_REFIDS(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -315,9 +370,17 @@ void tmplput_MAIL_SUMM_REFIDS(StrBuf *Target, WCTemplputParams *TP)
 
 void examine_cccc(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->cccc);
        Msg->cccc = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->cccc, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->cccc, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
        if (Msg->AllRcpt == NULL)
                Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
        if (StrLength(Msg->AllRcpt) > 0) {
@@ -394,9 +457,17 @@ int Conditional_MAIL_SUMM_OTHERNODE(StrBuf *Target, WCTemplputParams *TP)
 
 void examine_rcpt(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->to);
        Msg->to = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->to, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->to, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
        if (Msg->AllRcpt == NULL)
                Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
        if (StrLength(Msg->AllRcpt) > 0) {
@@ -569,7 +640,9 @@ void examine_mime_part(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundChars
        const char *Ptr = NULL;
        wc_mime_attachment *Mime;
        StrBuf *Buf;
-       
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);  
        Mime = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment));
        memset(Mime, 0, sizeof(wc_mime_attachment));
        Mime->msgnum = Msg->msgnum;
@@ -577,12 +650,22 @@ void examine_mime_part(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundChars
 
        Mime->Name = NewStrBuf();
        StrBufExtract_NextToken(Buf, HdrLine, &Ptr, '|');
-       StrBuf_RFC822_to_Utf8(Mime->Name, Buf, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Mime->Name, 
+                            Buf, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
        StrBufTrim(Mime->Name);
 
        StrBufExtract_NextToken(Buf, HdrLine, &Ptr, '|');
        Mime->FileName = NewStrBuf();
-       StrBuf_RFC822_to_Utf8(Mime->FileName, Buf, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Mime->FileName, 
+                            Buf, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
        StrBufTrim(Mime->FileName);
 
        Mime->PartNum = NewStrBuf();
@@ -637,7 +720,7 @@ void evaluate_mime_part(message_summary *Msg, wc_mime_attachment *Mime)
        void *vMimeRenderer;
 
        /* just print the root-node */
-       if ((Mime->level == 1) &&
+       if ((Mime->level >= 1) &&
            GetHash(MimeRenderHandler, SKEY(Mime->ContentType), &vMimeRenderer) &&
            vMimeRenderer != NULL)
        {
@@ -646,14 +729,14 @@ void evaluate_mime_part(message_summary *Msg, wc_mime_attachment *Mime)
                        Msg->Submessages = NewHash(1,NULL);
                Put(Msg->Submessages, SKEY(Mime->PartNum), Mime, reference_free_handler);
        }
-       else if ((Mime->level == 1) &&
+       else if ((Mime->level >= 1) &&
                 (!strcasecmp(ChrPtr(Mime->Disposition), "inline"))
                 && (!strncasecmp(ChrPtr(Mime->ContentType), "image/", 6)) ){
                if (Msg->AttachLinks == NULL)
                        Msg->AttachLinks = NewHash(1,NULL);
                Put(Msg->AttachLinks, SKEY(Mime->PartNum), Mime, reference_free_handler);
        }
-       else if ((Mime->level == 1) &&
+       else if ((Mime->level >= 1) &&
                 (StrLength(Mime->ContentType) > 0) &&
                  ( (!strcasecmp(ChrPtr(Mime->Disposition), "attachment")) 
                    || (!strcasecmp(ChrPtr(Mime->Disposition), "inline"))
@@ -681,9 +764,17 @@ void tmplput_MAIL_SUMM_NATTACH(StrBuf *Target, WCTemplputParams *TP)
 
 void examine_hnod(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->hnod);
        Msg->hnod = NewStrBufPlain(NULL, StrLength(HdrLine));
-       StrBuf_RFC822_to_Utf8(Msg->hnod, HdrLine, WC->DefaultCharset, FoundCharset);
+       StrBuf_RFC822_2_Utf8(Msg->hnod, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
 }
 void tmplput_MAIL_SUMM_H_NODE(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -833,12 +924,18 @@ void tmplput_EDIT_WIKI_BODY(StrBuf *Target, WCTemplputParams *TP)
         long msgnum;
        StrBuf *Buf;
 
-       msgnum = locate_message_by_uid(BSTR("page"));
-       if (msgnum >= 0L) {
-               Buf = NewStrBuf();
-               read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime);
-               StrBufAppendTemplate(Target, TP, Buf, 1);
-               FreeStrBuf(&Buf);
+       /* Insert the existing content of the wiki page into the editor.  But we only want
+        * to do this the first time -- if the user is uploading an attachment we don't want
+        * to do it again.
+        */
+       if (!havebstr("attach_button")) {
+               msgnum = locate_message_by_uid(BSTR("page"));
+               if (msgnum >= 0L) {
+                       Buf = NewStrBuf();
+                       read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime);
+                       StrBufAppendTemplate(Target, TP, Buf, 1);
+                       FreeStrBuf(&Buf);
+               }
        }
 }
 
@@ -1160,6 +1257,7 @@ void servcmd_readold(char *buf, long bufsize)
 }
 
 
+/* DO NOT REORDER OR REMOVE ANY OF THESE */
 readloop_struct rlid[] = {
        { {HKEY("do_search")},  servcmd_do_search       },
        { {HKEY("headers")},    servcmd_headers         },
@@ -1178,11 +1276,18 @@ int ParseMessageListHeaders_Detail(StrBuf *Line,
 {
        wcsession *WCC = WC;
 
+       CheckConvertBufs(WCC);
+
        Msg->from = NewStrBufPlain(NULL, StrLength(Line));
        StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
        if (StrLength(ConversionBuffer) != 0) {
                /* Handle senders with RFC2047 encoding */
-               StrBuf_RFC822_to_Utf8(Msg->from, ConversionBuffer, WCC->DefaultCharset, NULL);
+               StrBuf_RFC822_2_Utf8(Msg->from, 
+                                    ConversionBuffer, 
+                                    WCC->DefaultCharset, 
+                                    NULL, 
+                                    WCC->ConvertBuf1,
+                                    WCC->ConvertBuf2);
        }
                        
        /* node name */
@@ -1201,23 +1306,34 @@ int ParseMessageListHeaders_Detail(StrBuf *Line,
         */
        StrBufSkip_NTokenS(Line, pos, '|', 1);
        Msg->subj = NewStrBufPlain(NULL, StrLength(Line));
+
+       FlushStrBuf(ConversionBuffer);
+       /* we assume the subject is the last parameter inside of the list; 
+        * thus we don't use the tokenizer to fetch it, since it will hick up 
+        * on tokenizer chars inside of the subjects
        StrBufExtract_NextToken(ConversionBuffer,  Line, pos, '|');
+       */
+       if (*pos != StrBufNOTNULL) {
+               StrBufPlain(ConversionBuffer, *pos, 
+                           StrLength(Line) - (*pos - ChrPtr(Line)));
+               *pos = StrBufNOTNULL;
+               if ((StrLength(ConversionBuffer) > 0) &&
+                   (*(ChrPtr(ConversionBuffer) + 
+                      StrLength(ConversionBuffer) - 1) == '|'))
+                       StrBufCutRight(ConversionBuffer, 1);
+       }
+
        if (StrLength(ConversionBuffer) == 0)
                StrBufAppendBufPlain(Msg->subj, _("(no subject)"), -1,0);
        else {
-               StrBuf_RFC822_to_Utf8(Msg->subj, ConversionBuffer, WCC->DefaultCharset, NULL);
-               if ((StrLength(Msg->subj) > 75) && 
-                   (StrBuf_Utf8StrLen(Msg->subj) > 75)) {
-                       StrBuf_Utf8StrCut(Msg->subj, 72);
-                       StrBufAppendBufPlain(Msg->subj, HKEY("..."), 0);
-               }
+               StrBuf_RFC822_2_Utf8(Msg->subj, 
+                                    ConversionBuffer, 
+                                    WCC->DefaultCharset, 
+                                    NULL,
+                                    WCC->ConvertBuf1,
+                                    WCC->ConvertBuf2);
        }
 
-       if ((StrLength(Msg->from) > 25) && 
-           (StrBuf_Utf8StrLen(Msg->from) > 25)) {
-               StrBuf_Utf8StrCut(Msg->from, 23);
-               StrBufAppendBufPlain(Msg->from, HKEY("..."), 0);
-       }
        return 1;
 }
 
@@ -1380,7 +1496,7 @@ InitModule_MSGRENDERERS
                         NULL, NULL, CTX_MIME_ATACH, CTX_NONE, IT_NOFLAG);
 
        /* mime renderers translate an attachment into webcit viewable html text */
-       RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL, 1, 150);
+       RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL, 0, 150);
        RegisterMimeRenderer(HKEY("text/vnote"), render_MIME_VNote, 1, 300);
        RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard, 1, 201);
        RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard, 1, 200);
@@ -1448,4 +1564,6 @@ SessionDestroyModule_MSGRENDERERS
 (wcsession *sess)
 {
        DeleteHash(&sess->attachments);
+       FreeStrBuf(&sess->ConvertBuf1);
+       FreeStrBuf(&sess->ConvertBuf2);
 }