X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmessages.h;h=fa5fff29fa389734e273507b277042fb92bc0b64;hb=c6aec42f213ec284e34648f3d69bcf927dccddb1;hp=321ef1f89c9a9353653c15ac1ceb1cffe74d2132;hpb=c5b6fbb9fa01035c16b1a62af9314a19307558fe;p=citadel.git diff --git a/webcit/messages.h b/webcit/messages.h index 321ef1f89..fa5fff29f 100644 --- a/webcit/messages.h +++ b/webcit/messages.h @@ -1,9 +1,24 @@ -extern HashList *MsgHeaderHandler; +/* + * Copyright (c) 1996-2020 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef MESSAGES_H +#define MESSAGES_H + +extern CtxType CTX_MAILSUM; +extern CtxType CTX_MIME_ATACH; extern HashList *MimeRenderHandler; extern HashList *ReadLoopHandler; typedef struct wc_mime_attachment wc_mime_attachment; -typedef void (*RenderMimeFunc)(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset); +typedef void (*RenderMimeFunc)(StrBuf * Target, WCTemplputParams * TP, StrBuf * FoundCharset); typedef struct _RenderMimeFuncStruct { RenderMimeFunc f; } RenderMimeFuncStruct; @@ -25,45 +40,98 @@ struct wc_mime_attachment { }; void DestroyMime(void *vMime); +#define MSGFLAG_READ (1<<0) typedef struct _message_summary { - time_t date; /* its creation date */ - long msgnum; /* the message number on the citadel server */ + long msgnum; // the message number on the citadel server + int Flags; + time_t date; // its creation date int nhdr; int format_type; - StrBuf *from; /* the author */ - StrBuf *to; /* the recipient */ - StrBuf *subj; /* the title / subject */ + StrBuf *euid; + StrBuf *from; // display name of message author + StrBuf *to; // the recipient + StrBuf *subj; // title / subject StrBuf *reply_inreplyto; + long reply_inreplyto_hash; StrBuf *reply_references; - StrBuf *reply_to; + long reply_references_hash; + StrBuf *ReplyTo; StrBuf *cccc; - StrBuf *hnod; StrBuf *AllRcpt; StrBuf *Room; - StrBuf *Rfca; - StrBuf *OtherNode; + StrBuf *Rfca; // UPN or email address of message author + StrBuf *EnvTo; const StrBuf *PartNum; - - HashList *Attachments; /* list of attachments */ + HashList *Attachments; // list of attachments HashList *Submessages; HashList *AttachLinks; - HashList *AllAttach; - - int is_new; int hasattachments; - - - /* The mime part of the message */ - wc_mime_attachment *MsgBody; + int is_local; // nonzero if the message originated on the local system + wc_mime_attachment *MsgBody; // the MIME part of the message } message_summary; -void DestroyMessageSummary(void *vMsg); -inline message_summary* GetMessagePtrAt(int n, HashList *Summ); -typedef void (*ExamineMsgHeaderFunc)(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset); +void DestroyMessageSummary(void *vMsg); -void evaluate_mime_part(message_summary *Msg, wc_mime_attachment *Mime); +/* some of these fields map to msgkeys[] in msgbase.c ... others don't */ + +/* I think these are supposed to align with fieldMnemonics in msg_renderers.c + * So if you change one you have to change the other. + * TODO: figure out who did this and beat them with a wet noodle. + */ +typedef enum _eMessageField { + eAuthor, + eXclusivID, + erFc822Addr, + emessageId, + eJournal, + eReplyTo, + eListID, + eMesageText, + eIsLocal, + eMessagePath, + eRecipient, + eSpecialField, + eTimestamp, + eMsgSubject, + eenVelopeTo, + eWeferences, + eCarbonCopY, + eHeaderOnly, + eFormatType, + eMessagePart, + eSubFolder, + eLastHeader +} eMessageField; + +extern const char *fieldMnemonics[]; + +int GetFieldFromMnemonic(eMessageField * f, const char *c); +int EvaluateMsgHdr(const char *HeaderName, long HdrNLen, message_summary * Msg, StrBuf * HdrLine, StrBuf * FoundCharset); +int EvaluateMsgHdrEnum(eMessageField f, message_summary * Msg, StrBuf * HdrLine, StrBuf * FoundCharset); + + +static inline message_summary *GetMessagePtrAt(int n, HashList * Summ) { + const char *Key; + long HKLen; + void *vMsg; + + if (Summ == NULL) { + return NULL; + } + GetHashAt(Summ, n, &HKLen, &Key, &vMsg); + return (message_summary *) vMsg; +} + + +typedef void (*ExamineMsgHeaderFunc)(message_summary * Msg, StrBuf * HdrLine, StrBuf * FoundCharset); +void evaluate_mime_part(StrBuf * Target, WCTemplputParams * TP); + +typedef enum _eCustomRoomRenderer { + eUseDefault = VIEW_JOURNAL + 100, + eReadEUIDS +} eCustomRoomRenderer; enum { do_search, @@ -71,9 +139,21 @@ enum { readfwd, readnew, readold, - readgt + readgt, + readlt }; +/** + * @brief function to parse the | separated message headers list + * @param Line the raw line with your message data + * @param Msg put your parser results here... + * @param ConversionBuffer if you need some workbuffer, don't free me! + * @param ViewSpecific your view specific context data + * @returns 0: failure, trash this message. 1: all right, store it + */ +typedef int (*load_msg_ptrs_detailheaders)(StrBuf * Line, + const char **pos, message_summary * Msg, StrBuf * ConversionBuffer, void **ViewSpecific); + typedef void (*readloop_servcmd)(char *buf, long bufsize); typedef struct _readloopstruct { @@ -83,64 +163,56 @@ typedef struct _readloopstruct { extern readloop_struct rlid[]; +void readloop(long oper, eCustomRoomRenderer ForceRenderer); +int read_message(StrBuf * Target, + const char *tmpl, long tmpllen, + long msgnum, const StrBuf * section, const StrBuf ** OutMime, WCTemplputParams * TP); +int load_message(message_summary * Msg, StrBuf * FoundCharset, StrBuf ** Error); -void readloop(long oper); -int read_message(StrBuf *Target, - const char *tmpl, long tmpllen, - long msgnum, - const StrBuf *section, - const StrBuf **OutMime); -int load_message(message_summary *Msg, - StrBuf *FoundCharset, - StrBuf **Error); +typedef struct _SharedMessageStatus { + long load_seen; /* should read information be loaded */ + long sortit; /* should we sort it using the standard sort API? */ + long defaultsortorder; /* if we should sort it, which direction should be the default? */ -typedef struct _SharedMessageStatus{ - long load_seen; /** should read information be loaded */ - long sortit; /** should we sort it using the standard sort API? */ - long defaultsortorder; /** if we should sort it, which direction should be the default? */ + long maxload; /* how many headers should we accept from the server? defaults to 10k */ + long maxmsgs; /* how many message bodies do you want to load at most? */ - long maxload; /** how many headers should we accept from the server? defaults to 10k */ - long maxmsgs; /** how many message bodies do you want to load at most?*/ - long reverse; /** should the load-range be reversed? */ + long startmsg; /* which is the start message? */ + long nummsgs; /* How many messages are available to your view? */ + long numNewmsgs; /* if you load the seen-status, this is the count of them. */ + long num_displayed; /* counted up for LoadMsgFromServer *//* TODO: unclear who should access this and why */ - long startmsg; /** which is the start message ????? */ - long nummsgs; /** How many messages are available to your view? */ - long num_displayed; /** counted up for LoadMsgFromServer */ /* TODO: unclear who should access this and why */ + long lowest_found; /* smallest Message ID found; */ + long highest_found; /* highest Message ID found; */ - long lowest_found; /** smallest Message ID found; */ - long highest_found; /** highest Message ID found; */ +} SharedMessageStatus; -}SharedMessageStatus; +int load_msg_ptrs(const char *servcmd, + const char *filter, + StrBuf * FoundCharset, + SharedMessageStatus * Stat, + void **ViewSpecific, + load_msg_ptrs_detailheaders LH, StrBuf * FetchMessageList, eMessageField * MessageFieldList, long HeaderCount); -int load_msg_ptrs(const char *servcmd, SharedMessageStatus *Stat); +typedef int (*GetParamsGetServerCall_func)(SharedMessageStatus * Stat, + void **ViewSpecific, long oper, char *cmd, long len, char *filter, long flen); -typedef int (*GetParamsGetServerCall_func)(SharedMessageStatus *Stat, - void **ViewSpecific, - long oper, - char *cmd, - long len); +typedef int (*PrintViewHeader_func)(SharedMessageStatus * Stat, void **ViewSpecific); -typedef int (*PrintViewHeader_func)(SharedMessageStatus *Stat, void **ViewSpecific); +typedef int (*LoadMsgFromServer_func)(SharedMessageStatus * Stat, void **ViewSpecific, message_summary * Msg, int is_new, int i); -typedef int (*LoadMsgFromServer_func)(SharedMessageStatus *Stat, - void **ViewSpecific, - message_summary* Msg, - int is_new, - int i); - -typedef int (*RenderView_or_Tail_func)(SharedMessageStatus *Stat, - void **ViewSpecific, - long oper); +typedef int (*RenderView_or_Tail_func)(SharedMessageStatus * Stat, void **ViewSpecific, long oper); typedef int (*View_Cleanup_func)(void **ViewSpecific); void RegisterReadLoopHandlerset( + /** * RoomType: which View definition are you going to be called for */ - int RoomType, + int RoomType, /** * GetParamsGetServerCall should do the following: @@ -152,14 +224,27 @@ void RegisterReadLoopHandlerset( * is skipped. * * influence the behaviour by presetting values on SharedMessageStatus */ - GetParamsGetServerCall_func GetParamsGetServerCall, + GetParamsGetServerCall_func GetParamsGetServerCall, + + /** + * PrintpageHeader prints the surrounding information like iconbar, header etc. + * by default, output_headers() is called. + * + */ + PrintViewHeader_func PrintPageHeader, /** * PrintViewHeader is here to print informations infront of your messages. * The message list is already loaded & sorted (if) so you can evaluate * its result on the SharedMessageStatus struct. */ - PrintViewHeader_func PrintViewHeader, + PrintViewHeader_func PrintViewHeader, + + /** + * LH is the function, you specify if you want to load more than just message + * numbers from the server during the listing fetch operation. + */ + load_msg_ptrs_detailheaders LH, /** * LoadMsgFromServer is called for every message in the message list: @@ -170,7 +255,7 @@ void RegisterReadLoopHandlerset( * * depending on your needs you might want to print your message here... * * if cmd was empty, its skipped alltogether. */ - LoadMsgFromServer_func LoadMsgFromServer, + LoadMsgFromServer_func LoadMsgFromServer, /** * RenderView_or_Tail is called last; @@ -178,15 +263,21 @@ void RegisterReadLoopHandlerset( * trailing information here * * if you just pre-loaded your messages, put your render code here. */ - RenderView_or_Tail_func RenderView_or_Tail, + RenderView_or_Tail_func RenderView_or_Tail, /** * ViewCleanup should just clear your private data so all your mem can go back to * VALgrindHALLA. * it also should release the content for delivery via end_burst() or wDumpContent(1); */ - View_Cleanup_func ViewCleanup - ); + View_Cleanup_func ViewCleanup, + + /** + * brofwseListFields schould be a NULL-terminated list of message field mnemonics + * that will be the browse vector for the message header list. + */ + const char **browseListFields); + /* GetParamsGetServerCall @@ -196,3 +287,27 @@ LoadMsgFromServer RenderView_or_Tail */ + + +int ParseMessageListHeaders_Detail(StrBuf * Line, + const char **pos, message_summary * Msg, StrBuf * ConversionBuffer, void **ViewSpecific); + +/** + * @brief function to register the availability to render a specific message + * @param HeaderName Mimetype we know howto display + * @param HdrNLen length... + * @param InlineRenderable Should we announce to citserver that we want to receive these mimeparts immediately? + * @param Priority if multipart/alternative; which mimepart/Renderer should be prefered? (only applies if InlineRenderable) + */ +void RegisterMimeRenderer(const char *HeaderName, long HdrNLen, RenderMimeFunc MimeRenderer, int InlineRenderable, int Priority); + + +/** + * @brief fill the header parts of Msg with the headers loaded by MSG0 + * @param Msg empty message struct, only preinitialized with the msgid + * @param FoundCharset buffer with the prefered charset of the headers + * @param buf linebuffer used to buffer citserver replies + */ +int ReadOneMessageSummary(message_summary * Msg, StrBuf * FoundCharset, StrBuf * Buf); + +#endif