put standard handlers into their own enum-lookupable list.
authorWilfried Goesgens <willi@arangodb.com>
Mon, 21 Dec 2015 18:06:44 +0000 (19:06 +0100)
committerWilfried Goesgens <willi@arangodb.com>
Mon, 21 Dec 2015 18:06:44 +0000 (19:06 +0100)
webcit/messages.c
webcit/msg_renderers.c

index a5447a378952ca84674ecaaf01f368fc277653e6..732ef03b8093686eecdac97baf7a9d3a21b60a9e 100644 (file)
@@ -17,7 +17,6 @@
 #include "dav.h"
 #include "calendar.h"
 
-HashList *MsgHeaderHandler = NULL;
 HashList *MimeRenderHandler = NULL;
 HashList *ReadLoopHandler = NULL;
 int dbg_analyze_msg = 0;
@@ -45,12 +44,11 @@ int load_message(message_summary *Msg,
 {
        StrBuf *Buf;
        StrBuf *HdrToken;
-       headereval *Hdr;
-       void *vHdr;
        char buf[SIZ];
        int Done = 0;
        int state=0;
-       
+       int rc;
+
        Buf = NewStrBuf();
        if (Msg->PartNum != NULL) {
                serv_printf("MSG4 %ld|%s", Msg->msgnum, ChrPtr(Msg->PartNum));
@@ -97,14 +95,11 @@ int load_message(message_summary *Msg,
                        StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
                        
                        /* look up one of the examine_* functions to parse the content */
-                       if (GetHash(MsgHeaderHandler, SKEY(HdrToken), &vHdr) &&
-                           (vHdr != NULL)) {
-                               Hdr = (headereval*)vHdr;
-                               Hdr->evaluator(Msg, Buf, FoundCharset);
-                               if (Hdr->Type == 1) {
-                                       state++;
-                               }
-                       }/* TODO: 
+                       rc =  EvaluateMsgHdr(SKEY(HdrToken), Msg, Buf, FoundCharset);
+                       if (rc == 1) {
+                               state++;
+                       }
+                       /* TODO: 
                        else LogError(Target, 
                                      __FUNCTION__,  
                                      "don't know how to handle message header[%s]\n", 
@@ -125,11 +120,8 @@ int load_message(message_summary *Msg,
                                if (StrLength(HdrToken) > 0) {
                                        StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
                                        /* the examine*'s know how to do with mime headers too... */
-                                       if (GetHash(MsgHeaderHandler, SKEY(HdrToken), &vHdr) &&
-                                           (vHdr != NULL)) {
-                                               Hdr = (headereval*)vHdr;
-                                               Hdr->evaluator(Msg, Buf, FoundCharset);
-                                       }
+                                       EvaluateMsgHdr(SKEY(HdrToken), Msg, Buf, FoundCharset);
+                                       
                                        break;
                                }
                        }
@@ -1310,77 +1302,6 @@ void remove_attachment(void) {
 }
 
 
-/* Maps to msgkeys[] in msgbase.c: */
-
-typedef enum _eMessageField {
-       eAuthor,
-       eXclusivID,
-       erFc822Addr,
-       eHumanNode,
-       emessageId,
-       eJournal,
-       eReplyTo,
-       eListID,
-       eMesageText,
-       eNodeName,
-       eOriginalRoom,
-       eMessagePath,
-       eRecipient,
-       eSpecialField,
-       eTimestamp,
-       eMsgSubject,
-       eenVelopeTo,
-       eWeferences,
-       eCarbonCopY
-}eMessageField;
-
-const char* fieldMnemonics[] = {
-       "from", /* A -> eAuthor       */
-       "exti", /* E -> eXclusivID    */
-       "rfca", /* F -> erFc822Addr   */
-       "hnod", /* H -> eHumanNode    */
-       "msgn", /* I -> emessageId    */
-       "jrnl", /* J -> eJournal      */
-       "rep2", /* K -> eReplyTo      */
-       "list", /* L -> eListID       */
-       "text", /* M -> eMesageText   */
-       "node", /* N -> eNodeName     */
-       "room", /* O -> eOriginalRoom */
-       "path", /* P -> eMessagePath  */
-       "rcpt", /* R -> eRecipient    */
-       "spec", /* S -> eSpecialField */
-       "time", /* T -> eTimestamp    */
-       "subj", /* U -> eMsgSubject   */
-       "nvto", /* V -> eenVelopeTo   */
-       "wefw", /* W -> eWeferences   */
-       "cccc"  /* Y -> eCarbonCopY   */
-};
-
-HashList *msgKeyLookup = NULL;
-
-int GetFieldFromMnemonic(eMessageField *f, const char* c)
-{
-       void *v = NULL;
-       if (GetHash(msgKeyLookup, c, 4, &v)) {
-               *f = (eMessageField) v;
-               return 1;
-       }
-       return 0;
-}
-
-void FillMsgKeyLookupTable(void)
-{
-       long i;
-
-       msgKeyLookup = NewHash (1, FourHash);
-
-       for (i=0; i < 20; i++) {
-               if (fieldMnemonics[i] != NULL) {
-                       Put(msgKeyLookup, fieldMnemonics[i], 4, (void*)i, reference_free_handler);
-               }
-       }
-}
-
 const char *ReplyToModeStrings [3] = {
        "reply",
        "replyall",
@@ -2098,25 +2019,16 @@ void RegisterReadLoopHandlerset(
        Put(ReadLoopHandler, IKEY(RoomType), Handler, NULL);
 }
 
-void 
-ServerShutdownModule_MSG
-(void)
-{
-       DeleteHash(&msgKeyLookup);
-}
-
 void 
 InitModule_MSG
 (void)
 {
-       FillMsgKeyLookupTable();
-
        RegisterPreference("use_sig",
                           _("Attach signature to email messages?"), 
                           PRF_YESNO, 
                           NULL);
        RegisterPreference("signature", _("Use this signature:"), PRF_QP_STRING, NULL);
-       RegisterPreference("default_header_charset", 
+       RegisterPreference("default_header_charset",
                           _("Default character set for email headers:"), 
                           PRF_STRING, 
                           NULL);
index d04959865188d830015890c6bfa9f9c1b66cefed..484a13d8b775b0d3a1504b40d09bb15ed3834d32 100644 (file)
@@ -5,6 +5,10 @@
 CtxType CTX_MAILSUM = CTX_NONE;
 CtxType CTX_MIME_ATACH = CTX_NONE;
 
+HashList *MsgHeaderHandler = NULL;
+HashList *DflMsgHeaderHandler = NULL;
+
+
 static inline void CheckConvertBufs(struct wcsession *WCC)
 {
        if (WCC->ConvertBuf1 == NULL)
@@ -62,6 +66,25 @@ void DestroyMessageSummary(void *vMsg)
 }
 
 
+int EvaluateMsgHdr(const char *HeaderName, long HdrNLen, message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       void *vHdr;
+       headereval* Hdr = NULL;
+       if (HdrNLen == 4) {
+               if (GetHash(DflMsgHeaderHandler, HeaderName, HdrNLen, &vHdr) &&
+                   (vHdr != NULL)) {
+                       Hdr = (headereval*)vHdr;
+               }
+       }
+       if (Hdr == NULL && GetHash(MsgHeaderHandler, HeaderName, HdrNLen, &vHdr) &&
+           (vHdr != NULL)) {
+               Hdr = (headereval*)vHdr;
+       }
+       if (Hdr == NULL)
+               return -1;
+       Hdr->evaluator(Msg, HdrLine, FoundCharset);
+       return Hdr->Type;
+}
 
 void RegisterMsgHdr(const char *HeaderName, long HdrNLen, ExamineMsgHeaderFunc evaluator, int type)
 {
@@ -69,6 +92,14 @@ void RegisterMsgHdr(const char *HeaderName, long HdrNLen, ExamineMsgHeaderFunc e
        ev = (headereval*) malloc(sizeof(headereval));
        ev->evaluator = evaluator;
        ev->Type = type;
+
+       if (HdrNLen == 4) {
+               eMessageField f;
+               if (GetFieldFromMnemonic(&f, HeaderName)) {
+                       Put(DflMsgHeaderHandler, HeaderName, HdrNLen, ev, NULL);
+                       return;
+               }
+       }
        Put(MsgHeaderHandler, HeaderName, HdrNLen, ev, NULL);
 }
 
@@ -803,8 +834,6 @@ void examine_content_lengh(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundC
 
 void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
-       void *vHdr;
-       headereval *Hdr;
        StrBuf *Token;
        StrBuf *Value;
        const char* sem;
@@ -840,12 +869,8 @@ void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCh
                        }
                        StrBufTrim(Token);
 
-                       if (GetHash(MsgHeaderHandler, SKEY(Token), &vHdr) &&
-                           (vHdr != NULL)) {
-                               Hdr = (headereval*)vHdr;
-                               Hdr->evaluator(Msg, Value, FoundCharset);
-                       }
-                       else syslog(LOG_WARNING, "don't know how to handle content type sub-header[%s]\n", ChrPtr(Token));
+                       if (EvaluateMsgHdr(SKEY(Token), Msg, Value, FoundCharset) < 0)
+                               syslog(LOG_WARNING, "don't know how to handle content type sub-header[%s]\n", ChrPtr(Token));
                }
                FreeStrBuf(&Token);
                FreeStrBuf(&Value);
@@ -1373,6 +1398,53 @@ readloop_struct rlid[] = {
        { {HKEY("readlt")},     servcmd_readlt          }
 };
 
+const char* fieldMnemonics[] = {
+       "from", /* A -> eAuthor       */
+       "exti", /* E -> eXclusivID    */
+       "rfca", /* F -> erFc822Addr   */
+       "hnod", /* H -> eHumanNode    */
+       "msgn", /* I -> emessageId    */
+       "jrnl", /* J -> eJournal      */
+       "rep2", /* K -> eReplyTo      */
+       "list", /* L -> eListID       */
+       "text", /* M -> eMesageText   */
+       "node", /* N -> eNodeName     */
+       "room", /* O -> eOriginalRoom */
+       "path", /* P -> eMessagePath  */
+       "rcpt", /* R -> eRecipient    */
+       "spec", /* S -> eSpecialField */
+       "time", /* T -> eTimestamp    */
+       "subj", /* U -> eMsgSubject   */
+       "nvto", /* V -> eenVelopeTo   */
+       "wefw", /* W -> eWeferences   */
+       "cccc"  /* Y -> eCarbonCopY   */
+};
+HashList *msgKeyLookup = NULL;
+
+int GetFieldFromMnemonic(eMessageField *f, const char* c)
+{
+       void *v = NULL;
+       if (GetHash(msgKeyLookup, c, 4, &v)) {
+               *f = (eMessageField) v;
+               return 1;
+       }
+       return 0;
+}
+
+void FillMsgKeyLookupTable(void)
+{
+       long i;
+
+       msgKeyLookup = NewHash (1, FourHash);
+
+       for (i=0; i < 20; i++) {
+               if (fieldMnemonics[i] != NULL) {
+                       Put(msgKeyLookup, fieldMnemonics[i], 4, (void*)i, reference_free_handler);
+               }
+       }
+}
+
+
 
 void 
 InitModule_MSGRENDERERS
@@ -1487,6 +1559,8 @@ InitModule_MSGRENDERERS
 #endif
        RegisterMimeRenderer(HKEY(""), render_MAIL_UNKNOWN, 0, 0);
 
+       FillMsgKeyLookupTable();
+
        /* these headers are citserver replies to MSG4 and friends. one evaluator for each */
        RegisterMsgHdr(HKEY("nhdr"), examine_nhdr, 0);
        RegisterMsgHdr(HKEY("type"), examine_type, 0);
@@ -1529,6 +1603,7 @@ void
 ServerStartModule_MSGRENDERERS
 (void)
 {
+       DflMsgHeaderHandler = NewHash (1, FourHash);
        MsgHeaderHandler = NewHash(1, NULL);
        MimeRenderHandler = NewHash(1, NULL);
        ReadLoopHandler = NewHash(1, NULL);
@@ -1541,10 +1616,9 @@ ServerShutdownModule_MSGRENDERERS
        DeleteHash(&MsgHeaderHandler);
        DeleteHash(&MimeRenderHandler);
        DeleteHash(&ReadLoopHandler);
+       DeleteHash(&msgKeyLookup);
 }
 
-
-
 void 
 SessionDestroyModule_MSGRENDERERS
 (wcsession *sess)