headereval *Hdr;
void *vHdr;
char buf[SIZ];
-// char mime_submessages[256] = "";
- char reply_references[1024] = "";
int Done = 0;
int state=0;
long len;
StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
lprintf(1, ":: [%s] = [%s]\n", ChrPtr(HdrToken), ChrPtr(Buf));
+ /* look up one of the examine_* functions to parse the content */
if (GetHash(MsgHeaderHandler, SKEY(HdrToken), &vHdr) &&
(vHdr != NULL)) {
Hdr = (headereval*)vHdr;
if (StrLength(HdrToken) > 0) {
StrBufCutLeft(Buf, StrLength(HdrToken) + 1);
lprintf(1, ":: [%s] = [%s]\n", ChrPtr(HdrToken), ChrPtr(Buf));
+ /* the examine*'s know how to do with mime headers too... */
if (GetHash(MsgHeaderHandler, SKEY(HdrToken), &vHdr) &&
(vHdr != NULL)) {
Hdr = (headereval*)vHdr;
if (Msg->AllAttach == NULL)
Msg->AllAttach = NewHash(1,NULL);
+ /* now we put the body mimepart we read above into the mimelist */
Put(Msg->AllAttach, SKEY(Msg->MsgBody->PartNum), Msg->MsgBody, DestroyMime);
/* strip the bare contenttype, so we ommit charset etc. */
StrBufExtract_token(Buf, Msg->MsgBody->ContentType, 0, ';');
StrBufTrim(Buf);
+ /* look up the renderer, that will convert this mimeitem into the htmlized form */
if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) &&
(vHdr != NULL)) {
RenderMimeFunc Render;
int rrtok = num_tokens(ChrPtr(Msg->reply_references), '|');
int rrlen = StrLength(Msg->reply_references);
if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
- remove_token(reply_references, 1, '|');////todo
+ StrBufRemove_token(Msg->reply_references, 1, '|');
}
}
StrBufAppendBuf(Msg->reply_to, Msg->from, 0);
}
}
+
+ /* now check if we need to translate some mimeparts, and remove the duplicate */
it = GetNewHashPos(Msg->AllAttach, 0);
while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) &&
(vMime != NULL)) {
wcsession *WCC = WC;
message_summary *Msg;
StrBuf *Buf, *Buf2;
- ///char buf[1024];
- ///time_t datestamp;
- //char fullname[128];
- //char nodename[128];
- //char inetaddr[128];
- //char subject[1024];
- ///char *ptr;
- int nummsgs;
- ////int sbjlen;
+ int nummsgs = 0;
int maxload = 0;
long len;
int n;
- ////int num_summ_alloc = 0;
if (WCC->summ != NULL) {
if (WCC->summ != NULL)
DeleteHash(&WCC->summ);
}
WCC->summ = NewHash(1, Flathash);
- nummsgs = 0;
maxload = 10000;
Buf = NewStrBuf();
char buf[SIZ];
char old_msgs[SIZ];
int a = 0;
- ///int b = 0;
int nummsgs;
long startmsg = 0;
int maxmsgs = 0;
output_headers(1, 1, 1, 0, 0, 0);
- /*
+ /* TODO: how can we best sort this in?
if (WCC->is_mobile) {
maxmsgs = 20;
snprintf(cmd, sizeof(cmd), "MSGS %s|%s||1",
);
SortBy = eRDate;
}
-
+ */
/*
* Are we doing a summary view? If so, we need to know old messages
* and new messages, so we can do that pretty boldface thing for the
* new messages.
*/
-
-
nummsgs = load_msg_ptrs(cmd, (is_summary || WCC->is_mobile));
if (nummsgs == 0) {
if (care_for_empty_list) {
char buf[SIZ];
long now;
const StrBuf *display_name = NULL;
- /////wc_attachment *att;
int recipient_required = 0;
int subject_required = 0;
int recipient_bad = 0;
int is_anonymous = 0;
-
wcsession *WCC = WC;
now = time(NULL);
/*----------------------------------------------------------------------------*/
/*
- * qsort() compatible function to compare two longs in descending order.
+ * comparator for two longs in descending order.
*/
int longcmp_r(const void *s1, const void *s2) {
long l1;
}
/*
- * qsort() compatible function to compare two longs in descending order.
+ * comparator for longs; descending order.
*/
int qlongcmp_r(const void *s1, const void *s2) {
long l1 = (long) s1;
/*
- * qsort() compatible function to compare two message summary structs by ascending subject.
+ * comparator for message summary structs by ascending subject.
*/
int summcmp_subj(const void *s1, const void *s2) {
message_summary *summ1;
}
/*
- * qsort() compatible function to compare two message summary structs by descending subject.
+ * comparator for message summary structs by descending subject.
*/
int summcmp_rsubj(const void *s1, const void *s2) {
message_summary *summ1;
}
/*
- * qsort() compatible function to compare two message summary structs by ascending sender.
+ * comparator for message summary structs by ascending sender.
*/
int summcmp_sender(const void *s1, const void *s2) {
message_summary *summ1;
}
/*
- * qsort() compatible function to compare two message summary structs by descending sender.
+ * comparator for message summary structs by descending sender.
*/
int summcmp_rsender(const void *s1, const void *s2) {
message_summary *summ1;
}
/*
- * qsort() compatible function to compare two message summary structs by ascending date.
+ * comparator for message summary structs by ascending date.
*/
int summcmp_date(const void *s1, const void *s2) {
message_summary *summ1;
}
/*
- * qsort() compatible function to compare two message summary structs by descending date.
+ * comparator for message summary structs by descending date.
*/
int summcmp_rdate(const void *s1, const void *s2) {
message_summary *summ1;
void examine_pref(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {return;}
void examine_suff(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {return;}
void examine_path(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {return;}
+void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+////TODO: do we care?
+}
void examine_nhdr(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
}
-
-
void examine_room(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
if ((StrLength(HdrLine) > 0) &&
}
-
-
-
-
-
void examine_hnod(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->hnod);
void examine_msg4_partnum(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
Msg->MsgBody->PartNum = NewStrBufDup(HdrLine);
- StrBufTrim(Msg->MsgBody->PartNum);/////TODO: striplt == trim?
+ StrBufTrim(Msg->MsgBody->PartNum);
}
-void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
-{
-////TODO: do we care?
-}
void examine_content_lengh(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
summcmp_rsender,
CTX_MAILSUM);
+ /* iterate over all known mails in WC->summ */
RegisterIterator("MAIL:SUMM:MSGS", 0, NULL, iterate_get_mailsumm_All,
NULL,NULL, CTX_MAILSUM, CTX_NONE);
+ /* render parts of the message struct */
RegisterNamespace("MAIL:SUMM:DATESTR", 0, 0, tmplput_MAIL_SUMM_DATE_STR, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:DATENO", 0, 0, tmplput_MAIL_SUMM_DATE_NO, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:N", 0, 0, tmplput_MAIL_SUMM_N, CTX_MAILSUM);
RegisterConditional(HKEY("COND:MAIL:SUMM:OTHERNODE"), 0, Conditional_MAIL_SUMM_OTHERNODE, CTX_MAILSUM);
RegisterConditional(HKEY("COND:MAIL:ANON"), 0, Conditional_ANONYMOUS_MESSAGE, CTX_MAILSUM);
+
+ /* do we have mimetypes to iterate over? */
RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH"), 0, Conditional_MAIL_MIME_ALL, CTX_MAILSUM);
RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH:SUBMESSAGES"), 0, Conditional_MAIL_MIME_SUBMESSAGES, CTX_MAILSUM);
RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH:LINKS"), 0, Conditional_MAIL_MIME_ATTACHLINKS, CTX_MAILSUM);
RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH:ATT"), 0, Conditional_MAIL_MIME_ATTACH, CTX_MAILSUM);
-
RegisterIterator("MAIL:MIME:ATTACH", 0, NULL, iterate_get_mime_All,
NULL, NULL, CTX_MIME_ATACH, CTX_MAILSUM);
RegisterIterator("MAIL:MIME:ATTACH:SUBMESSAGES", 0, NULL, iterate_get_mime_Submessages,
RegisterIterator("MAIL:MIME:ATTACH:ATT", 0, NULL, iterate_get_mime_Attachments,
NULL, NULL, CTX_MIME_ATACH, CTX_MAILSUM);
+ /* Parts of a mime attachent */
RegisterNamespace("MAIL:MIME:NAME", 0, 2, tmplput_MIME_Name, CTX_MIME_ATACH);
RegisterNamespace("MAIL:MIME:FILENAME", 0, 2, tmplput_MIME_FileName, CTX_MIME_ATACH);
RegisterNamespace("MAIL:MIME:PARTNUM", 0, 2, tmplput_MIME_PartNum, CTX_MIME_ATACH);
RegisterNamespace("MAIL:MIME:CHARSET", 0, 2, tmplput_MIME_Charset, CTX_MIME_ATACH);
RegisterNamespace("MAIL:MIME:LENGTH", 0, 2, tmplput_MIME_Length, CTX_MIME_ATACH);
RegisterNamespace("MAIL:MIME:DATA", 0, 2, tmplput_MIME_Data, CTX_MIME_ATACH);
+ /* load the actual attachment into WC->attachments; no output!!! */
RegisterNamespace("MAIL:MIME:LOADDATA", 0, 0, tmplput_MIME_LoadData, CTX_MIME_ATACH);
+ /* iterate the WC->attachments; use the above tokens for their contents */
RegisterIterator("MSG:ATTACHNAMES", 0, NULL, iterate_get_registered_Attachments,
NULL, NULL, CTX_MIME_ATACH, CTX_NONE);
+ /* mime renderers translate an attachment into webcit viewable html text */
RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL);
RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard);
RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard);
RegisterMimeRenderer(HKEY("text/calendar"), render_MIME_ICS);
RegisterMimeRenderer(HKEY("application/ics"), render_MIME_ICS);
-
RegisterMimeRenderer(HKEY("text/x-citadel-variformat"), render_MAIL_variformat);
RegisterMimeRenderer(HKEY("text/plain"), render_MAIL_text_plain);
RegisterMimeRenderer(HKEY("text"), render_MAIL_text_plain);
RegisterMimeRenderer(HKEY("text/html"), render_MAIL_html);
RegisterMimeRenderer(HKEY(""), render_MAIL_UNKNOWN);
+ /* 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);
RegisterMsgHdr(HKEY("from"), examine_from, 0);
RegisterMsgHdr(HKEY("time"), examine_time, 0);
RegisterMsgHdr(HKEY("part"), examine_mime_part, 0);
RegisterMsgHdr(HKEY("text"), examine_text, 1);
+ /* these are the content-type headers we get infront of a message; put it into the same hash since it doesn't clash. */
RegisterMsgHdr(HKEY("X-Citadel-MSG4-Partnum"), examine_msg4_partnum, 0);
RegisterMsgHdr(HKEY("Content-type"), examine_content_type, 0);
RegisterMsgHdr(HKEY("Content-length"), examine_content_lengh, 0);
- RegisterMsgHdr(HKEY("Content-transfer-encoding"), examine_content_encoding, 0);
+ RegisterMsgHdr(HKEY("Content-transfer-encoding"), examine_content_encoding, 0); /* do we care? */
RegisterMsgHdr(HKEY("charset"), examine_charset, 0);
- /* Don't care... */
+ /* Don't care about these... */
RegisterMsgHdr(HKEY("pref"), examine_pref, 0);
RegisterMsgHdr(HKEY("suff"), examine_suff, 0);
RegisterMsgHdr(HKEY("path"), examine_path, 0);