#include "dav.h"
#include "calendar.h"
-HashList *MsgHeaderHandler = NULL;
HashList *MimeRenderHandler = NULL;
HashList *ReadLoopHandler = NULL;
int dbg_analyze_msg = 0;
{
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));
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",
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;
}
}
}
-/* 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",
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);
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)
}
+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)
{
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);
}
void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
- void *vHdr;
- headereval *Hdr;
StrBuf *Token;
StrBuf *Value;
const char* sem;
}
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);
{ {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
#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);
ServerStartModule_MSGRENDERERS
(void)
{
+ DflMsgHeaderHandler = NewHash (1, FourHash);
MsgHeaderHandler = NewHash(1, NULL);
MimeRenderHandler = NewHash(1, NULL);
ReadLoopHandler = NewHash(1, NULL);
DeleteHash(&MsgHeaderHandler);
DeleteHash(&MimeRenderHandler);
DeleteHash(&ReadLoopHandler);
+ DeleteHash(&msgKeyLookup);
}
-
-
void
SessionDestroyModule_MSGRENDERERS
(wcsession *sess)