#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;
}
}
*/
int load_msg_ptrs(const char *servcmd,
const char *filter,
+ StrBuf *FoundCharset,
SharedMessageStatus *Stat,
- load_msg_ptrs_detailheaders LH)
+ void **ViewSpecific,
+ load_msg_ptrs_detailheaders LH,
+ StrBuf *FetchMessageList,
+ eMessageField *MessageFieldList,
+ long HeaderCount)
{
wcsession *WCC = WC;
message_summary *Msg;
serv_puts("000");
break;
}
+ else if (FetchMessageList != NULL) {
+ serv_putbuf(FetchMessageList);
+ break;
+ }
/* fall back to empty filter in case of we were fooled... */
serv_puts("");
serv_puts("000");
Msg->msgnum = StrBufExtractNext_long(Buf, &Ptr, '|');
Msg->date = StrBufExtractNext_long(Buf, &Ptr, '|');
-
- if (Stat->nummsgs == 0) {
- if (Msg->msgnum < Stat->lowest_found) {
- Stat->lowest_found = Msg->msgnum;
- }
- if (Msg->msgnum > Stat->highest_found) {
- Stat->highest_found = Msg->msgnum;
+ if (MessageFieldList != NULL) {
+ long i;
+ for (i = 0; i < HeaderCount; i++) {
+ StrBufExtract_NextToken(Buf2, Buf, &Ptr, '|');
+ if (StrLength(Buf2) > 0) {
+ EvaluateMsgHdrEnum(MessageFieldList[i], Msg, Buf2, FoundCharset);
+ }
}
}
+ else {
+ if (Stat->nummsgs == 0) {
+ if (Msg->msgnum < Stat->lowest_found) {
+ Stat->lowest_found = Msg->msgnum;
+ }
+ if (Msg->msgnum > Stat->highest_found) {
+ Stat->highest_found = Msg->msgnum;
+ }
+ }
- if ((Msg->msgnum == 0) && (StrLength(Buf) < 32)) {
- free(Msg);
- continue;
+ if ((Msg->msgnum == 0) && (StrLength(Buf) < 32)) {
+ free(Msg);
+ continue;
+ }
}
-
/*
* as citserver probably gives us messages in forward date sorting
* nummsgs should be the same order as the message date.
skipit = 1;
}
if ((!skipit) && (LH != NULL)) {
- if (!LH(Buf, &Ptr, Msg, Buf2)){
+ if (!LH(Buf, &Ptr, Msg, Buf2, ViewSpecific)){
free(Msg);
continue;
}
RenderView_or_Tail_func RenderView_or_Tail;
View_Cleanup_func ViewCleanup;
load_msg_ptrs_detailheaders LHParse;
+ long HeaderCount;
+ StrBuf *FetchMessageList;
+ eMessageField *MessageFieldList;
} RoomRenderer;
}
if (!IsEmptyStr(cmd)) {
const char *p = NULL;
+ StrBuf *FoundCharset = NULL;
if (!IsEmptyStr(filter))
p = filter;
- Stat.nummsgs = load_msg_ptrs(cmd, p, &Stat, ViewMsg->LHParse);
+ if (ViewMsg->HeaderCount > 0) {
+ FoundCharset = NewStrBuf();
+ }
+ Stat.nummsgs = load_msg_ptrs(cmd, p,
+ FoundCharset,
+ &Stat,
+ &ViewSpecific,
+ ViewMsg->LHParse,
+ ViewMsg->FetchMessageList,
+ ViewMsg->MessageFieldList,
+ ViewMsg->HeaderCount);
+ FreeStrBuf(&FoundCharset);
}
if (Stat.sortit) {
StrBuf *Recp = NULL;
StrBuf *Cc = NULL;
StrBuf *Bcc = NULL;
- char *wikipage = NULL;
+ StrBuf *wikipage = NULL;
const StrBuf *my_email_addr = NULL;
StrBuf *CmdBuf = NULL;
StrBuf *references = NULL;
FreeStrBuf(&EmailAddress);
FreeStrBuf(&EncBuf);
- wikipage = strdup(bstr("page"));
+ wikipage = NewStrBufDup(sbstr("page"));
str_wiki_index(wikipage);
my_email_addr = sbstr("my_email_addr");
StrLength(encoded_subject) +
StrLength(Cc) +
StrLength(Bcc) +
- strlen(wikipage) +
+ StrLength(wikipage) +
StrLength(my_email_addr) +
StrLength(references);
CmdBuf = NewStrBufPlain(NULL, sizeof (CMD) + HeaderLen);
ChrPtr(display_name),
saving_to_drafts?"":ChrPtr(Cc),
saving_to_drafts?"":ChrPtr(Bcc),
- wikipage,
+ ChrPtr(wikipage),
ChrPtr(my_email_addr),
ChrPtr(references));
FreeStrBuf(&references);
}
-/* 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",
case eMessagePath:
case eSpecialField:
case eTimestamp:
+ case eHeaderOnly:
+ case eFormatType:
+ case eMessagePart:
+ case eSubFolder:
+ case ePevious:
+ case eLastHeader:
break;
}
const StrBuf *Recp = NULL;
const StrBuf *Cc = NULL;
const StrBuf *Bcc = NULL;
- char *wikipage = NULL;
+ StrBuf *wikipage = NULL;
StrBuf *CmdBuf = NULL;
const char CMD[] = "ENT0 0|%s|%d|0||%s||%s|%s|%s";
Recp = sbstr("recp");
Cc = sbstr("cc");
Bcc = sbstr("bcc");
- wikipage = strdup(bstr("page"));
+ wikipage = NewStrBufDup(sbstr("page"));
str_wiki_index(wikipage);
CmdBuf = NewStrBufPlain(NULL,
StrLength(display_name) +
StrLength(Cc) +
StrLength(Bcc) +
- strlen(wikipage));
+ StrLength(wikipage));
StrBufPrintf(CmdBuf,
CMD,
ChrPtr(display_name),
ChrPtr(Cc),
ChrPtr(Bcc),
- wikipage
+ ChrPtr(wikipage)
);
serv_puts(ChrPtr(CmdBuf));
StrBuf_ServGetln(CmdBuf);
readloop(oper, eUseDefault);
}
+void FreeReadLoopHandlerSet(void *v) {
+ RoomRenderer *Handler = (RoomRenderer *) v;
+ FreeStrBuf(&Handler->FetchMessageList);
+ if (Handler->MessageFieldList != NULL) {
+ free(Handler->MessageFieldList);
+ }
+ free(Handler);
+}
+
void RegisterReadLoopHandlerset(
int RoomType,
GetParamsGetServerCall_func GetParamsGetServerCall,
load_msg_ptrs_detailheaders LH,
LoadMsgFromServer_func LoadMsgFromServer,
RenderView_or_Tail_func RenderView_or_Tail,
- View_Cleanup_func ViewCleanup
+ View_Cleanup_func ViewCleanup,
+ const char **browseListFields
)
{
+ long count = 0;
+ long i = 0;
RoomRenderer *Handler;
Handler = (RoomRenderer*) malloc(sizeof(RoomRenderer));
Handler->ViewCleanup = ViewCleanup;
Handler->LHParse = LH;
- Put(ReadLoopHandler, IKEY(RoomType), Handler, NULL);
-}
+ if (browseListFields != NULL) {
+ while (browseListFields[count] != NULL) {
+ count ++;
+ }
+ Handler->HeaderCount = count;
+ Handler->MessageFieldList = (eMessageField*) malloc(sizeof(eMessageField) * count);
+ Handler->FetchMessageList = NewStrBufPlain(NULL, 5 * count + 4 + 5);
+ StrBufPlain(Handler->FetchMessageList, HKEY("time\n"));
+ for (i = 0; i < count; i++) {
+ if (!GetFieldFromMnemonic(&Handler->MessageFieldList[i], browseListFields[i])) {
+ fprintf(stderr, "Unknown message header: %s\n", browseListFields[i]);
+ exit(1);
+ }
+ StrBufAppendBufPlain(Handler->FetchMessageList, browseListFields[i], 4, 0);
+ StrBufAppendBufPlain(Handler->FetchMessageList, HKEY("\n"), 0);
+ }
+ StrBufAppendBufPlain(Handler->FetchMessageList, HKEY("000"), 0);
+ }
+ else {
+ Handler->FetchMessageList = NULL;
+ Handler->MessageFieldList = NULL;
+ }
-void
-ServerShutdownModule_MSG
-(void)
-{
- DeleteHash(&msgKeyLookup);
+ Put(ReadLoopHandler, IKEY(RoomType), Handler, FreeReadLoopHandlerSet);
}
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);