1 /*----------------------------------------------------------------------------*/
6 * message index functions
10 void DestroyMimeParts(wc_mime_attachment
*Mime
)
12 FreeStrBuf(&Mime
->Name
);
13 FreeStrBuf(&Mime
->FileName
);
14 FreeStrBuf(&Mime
->PartNum
);
15 FreeStrBuf(&Mime
->Disposition
);
16 FreeStrBuf(&Mime
->ContentType
);
17 FreeStrBuf(&Mime
->Charset
);
18 FreeStrBuf(&Mime
->Data
);
21 void DestroyMime(void *vMime
)
23 wc_mime_attachment
*Mime
= (wc_mime_attachment
*)vMime
;
24 DestroyMimeParts(Mime
);
28 void DestroyMessageSummary(void *vMsg
)
30 message_summary
*Msg
= (message_summary
*) vMsg
;
32 FreeStrBuf(&Msg
->from
);
34 FreeStrBuf(&Msg
->subj
);
35 FreeStrBuf(&Msg
->reply_inreplyto
);
36 FreeStrBuf(&Msg
->reply_references
);
37 FreeStrBuf(&Msg
->cccc
);
38 FreeStrBuf(&Msg
->hnod
);
39 FreeStrBuf(&Msg
->AllRcpt
);
40 FreeStrBuf(&Msg
->Room
);
41 FreeStrBuf(&Msg
->Rfca
);
42 FreeStrBuf(&Msg
->OtherNode
);
44 FreeStrBuf(&Msg
->reply_to
);
46 DeleteHash(&Msg
->Attachments
); /**< list of Accachments */
47 DeleteHash(&Msg
->Submessages
);
48 DeleteHash(&Msg
->AttachLinks
);
49 DeleteHash(&Msg
->AllAttach
);
55 void RegisterMsgHdr(const char *HeaderName
, long HdrNLen
, ExamineMsgHeaderFunc evaluator
, int type
)
58 ev
= (headereval
*) malloc(sizeof(headereval
));
59 ev
->evaluator
= evaluator
;
61 Put(MsgHeaderHandler
, HeaderName
, HdrNLen
, ev
, NULL
);
64 void RegisterMimeRenderer(const char *HeaderName
, long HdrNLen
, RenderMimeFunc MimeRenderer
)
66 RenderMimeFuncStruct
*f
;
68 f
= (RenderMimeFuncStruct
*) malloc(sizeof(RenderMimeFuncStruct
));
70 Put(MimeRenderHandler
, HeaderName
, HdrNLen
, f
, NULL
);
74 /*----------------------------------------------------------------------------*/
77 * comparator for two longs in descending order.
79 int longcmp_r(const void *s1
, const void *s2
) {
83 l1
= *(long *)GetSearchPayload(s1
);
84 l2
= *(long *)GetSearchPayload(s2
);
86 if (l1
> l2
) return(-1);
87 if (l1
< l2
) return(+1);
92 * comparator for longs; descending order.
94 int qlongcmp_r(const void *s1
, const void *s2
) {
98 if (l1
> l2
) return(-1);
99 if (l1
< l2
) return(+1);
105 * comparator for message summary structs by ascending subject.
107 int summcmp_subj(const void *s1
, const void *s2
) {
108 message_summary
*summ1
;
109 message_summary
*summ2
;
111 summ1
= (message_summary
*)GetSearchPayload(s1
);
112 summ2
= (message_summary
*)GetSearchPayload(s2
);
113 return strcasecmp(ChrPtr(summ1
->subj
), ChrPtr(summ2
->subj
));
117 * comparator for message summary structs by descending subject.
119 int summcmp_rsubj(const void *s1
, const void *s2
) {
120 message_summary
*summ1
;
121 message_summary
*summ2
;
123 summ1
= (message_summary
*)GetSearchPayload(s1
);
124 summ2
= (message_summary
*)GetSearchPayload(s2
);
125 return strcasecmp(ChrPtr(summ2
->subj
), ChrPtr(summ1
->subj
));
128 * comparator for message summary structs by descending subject.
130 int groupchange_subj(const void *s1
, const void *s2
) {
131 message_summary
*summ1
;
132 message_summary
*summ2
;
134 summ1
= (message_summary
*)s1
;
135 summ2
= (message_summary
*)s2
;
136 return ChrPtr(summ2
->subj
)[0] != ChrPtr(summ1
->subj
)[0];
140 * comparator for message summary structs by ascending sender.
142 int summcmp_sender(const void *s1
, const void *s2
) {
143 message_summary
*summ1
;
144 message_summary
*summ2
;
146 summ1
= (message_summary
*)GetSearchPayload(s1
);
147 summ2
= (message_summary
*)GetSearchPayload(s2
);
148 return strcasecmp(ChrPtr(summ1
->from
), ChrPtr(summ2
->from
));
152 * comparator for message summary structs by descending sender.
154 int summcmp_rsender(const void *s1
, const void *s2
) {
155 message_summary
*summ1
;
156 message_summary
*summ2
;
158 summ1
= (message_summary
*)GetSearchPayload(s1
);
159 summ2
= (message_summary
*)GetSearchPayload(s2
);
160 return strcasecmp(ChrPtr(summ2
->from
), ChrPtr(summ1
->from
));
163 * comparator for message summary structs by descending sender.
165 int groupchange_sender(const void *s1
, const void *s2
) {
166 message_summary
*summ1
;
167 message_summary
*summ2
;
169 summ1
= (message_summary
*)s1
;
170 summ2
= (message_summary
*)s2
;
171 return strcasecmp(ChrPtr(summ2
->from
), ChrPtr(summ1
->from
)) != 0;
176 * comparator for message summary structs by ascending date.
178 int summcmp_date(const void *s1
, const void *s2
) {
179 message_summary
*summ1
;
180 message_summary
*summ2
;
182 summ1
= (message_summary
*)GetSearchPayload(s1
);
183 summ2
= (message_summary
*)GetSearchPayload(s2
);
185 if (summ1
->date
< summ2
->date
) return -1;
186 else if (summ1
->date
> summ2
->date
) return +1;
191 * comparator for message summary structs by descending date.
193 int summcmp_rdate(const void *s1
, const void *s2
) {
194 message_summary
*summ1
;
195 message_summary
*summ2
;
197 summ1
= (message_summary
*)GetSearchPayload(s1
);
198 summ2
= (message_summary
*)GetSearchPayload(s2
);
200 if (summ1
->date
< summ2
->date
) return +1;
201 else if (summ1
->date
> summ2
->date
) return -1;
206 * comparator for message summary structs by descending date.
208 const long DAYSECONDS
= 24 * 60 * 60;
209 int groupchange_date(const void *s1
, const void *s2
) {
210 message_summary
*summ1
;
211 message_summary
*summ2
;
213 summ1
= (message_summary
*)s1
;
214 summ2
= (message_summary
*)s2
;
216 return (summ1
->date
% DAYSECONDS
) != (summ2
->date
%DAYSECONDS
);
220 /*----------------------------------------------------------------------------*/
221 /* Don't wanna know... or? */
222 void examine_pref(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
) {return;}
223 void examine_suff(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
) {return;}
224 void examine_path(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
) {return;}
225 void examine_content_encoding(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
227 /* TODO: do we care? */
230 void examine_nhdr(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
233 if (!strncasecmp(ChrPtr(HdrLine
), "yes", 8))
236 int Conditional_ANONYMOUS_MESSAGE(StrBuf
*Target
, WCTemplputParams
*TP
)
238 message_summary
*Msg
= (message_summary
*) CTX
;
239 return Msg
->nhdr
!= 0;
242 void examine_type(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
244 Msg
->format_type
= StrToi(HdrLine
);
248 void examine_from(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
250 FreeStrBuf(&Msg
->from
);
251 Msg
->from
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
252 StrBuf_RFC822_to_Utf8(Msg
->from
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
254 void tmplput_MAIL_SUMM_FROM(StrBuf
*Target
, WCTemplputParams
*TP
)
256 message_summary
*Msg
= (message_summary
*) CTX
;
257 StrBufAppendTemplate(Target
, TP
, Msg
->from
, 0);
262 void examine_subj(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
264 FreeStrBuf(&Msg
->subj
);
265 Msg
->subj
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
266 StrBuf_RFC822_to_Utf8(Msg
->subj
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
268 void tmplput_MAIL_SUMM_SUBJECT(StrBuf
*Target
, WCTemplputParams
*TP
)
269 {/*////TODO: Fwd: and RE: filter!!*/
271 message_summary
*Msg
= (message_summary
*) CTX
;
272 StrBufAppendTemplate(Target
, TP
, Msg
->subj
, 0);
274 int Conditional_MAIL_SUMM_SUBJECT(StrBuf
*Target
, WCTemplputParams
*TP
)
276 message_summary
*Msg
= (message_summary
*) CTX
;
277 return StrLength(Msg
->subj
) > 0;
281 void examine_msgn(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
283 FreeStrBuf(&Msg
->reply_inreplyto
);
284 Msg
->reply_inreplyto
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
285 StrBuf_RFC822_to_Utf8(Msg
->reply_inreplyto
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
287 void tmplput_MAIL_SUMM_INREPLYTO(StrBuf
*Target
, WCTemplputParams
*TP
)
289 message_summary
*Msg
= (message_summary
*) CTX
;
290 StrBufAppendTemplate(Target
, TP
, Msg
->reply_inreplyto
, 0);
293 int Conditional_MAIL_SUMM_UNREAD(StrBuf
*Target
, WCTemplputParams
*TP
)
295 message_summary
*Msg
= (message_summary
*) CTX
;
296 return Msg
->is_new
!= 0;
299 void examine_wefw(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
301 FreeStrBuf(&Msg
->reply_references
);
302 Msg
->reply_references
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
303 StrBuf_RFC822_to_Utf8(Msg
->reply_references
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
305 void tmplput_MAIL_SUMM_REFIDS(StrBuf
*Target
, WCTemplputParams
*TP
)
307 message_summary
*Msg
= (message_summary
*) CTX
;
308 StrBufAppendTemplate(Target
, TP
, Msg
->reply_references
, 0);
312 void examine_cccc(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
314 FreeStrBuf(&Msg
->cccc
);
315 Msg
->cccc
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
316 StrBuf_RFC822_to_Utf8(Msg
->cccc
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
317 if (Msg
->AllRcpt
== NULL
)
318 Msg
->AllRcpt
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
319 if (StrLength(Msg
->AllRcpt
) > 0) {
320 StrBufAppendBufPlain(Msg
->AllRcpt
, HKEY(", "), 0);
322 StrBufAppendBuf(Msg
->AllRcpt
, Msg
->cccc
, 0);
324 void tmplput_MAIL_SUMM_CCCC(StrBuf
*Target
, WCTemplputParams
*TP
)
326 message_summary
*Msg
= (message_summary
*) CTX
;
327 StrBufAppendTemplate(Target
, TP
, Msg
->cccc
, 0);
331 void examine_room(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
333 if ((StrLength(HdrLine
) > 0) &&
334 (strcasecmp(ChrPtr(HdrLine
), ChrPtr(WC
->wc_roomname
)))) {
335 FreeStrBuf(&Msg
->Room
);
336 Msg
->Room
= NewStrBufDup(HdrLine
);
339 void tmplput_MAIL_SUMM_ORGROOM(StrBuf
*Target
, WCTemplputParams
*TP
)
341 message_summary
*Msg
= (message_summary
*) CTX
;
342 StrBufAppendTemplate(Target
, TP
, Msg
->Room
, 0);
346 void examine_rfca(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
348 FreeStrBuf(&Msg
->Rfca
);
349 Msg
->Rfca
= NewStrBufDup(HdrLine
);
351 void tmplput_MAIL_SUMM_RFCA(StrBuf
*Target
, WCTemplputParams
*TP
)
353 message_summary
*Msg
= (message_summary
*) CTX
;
354 StrBufAppendTemplate(Target
, TP
, Msg
->Rfca
, 0);
356 int Conditional_MAIL_SUMM_RFCA(StrBuf
*Target
, WCTemplputParams
*TP
)
358 message_summary
*Msg
= (message_summary
*) CTX
;
359 return StrLength(Msg
->Rfca
) > 0;
361 int Conditional_MAIL_SUMM_CCCC(StrBuf
*Target
, WCTemplputParams
*TP
)
363 message_summary
*Msg
= (message_summary
*) CTX
;
364 return StrLength(Msg
->cccc
) > 0;
367 void examine_node(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
371 if ( (StrLength(HdrLine
) > 0) &&
372 ((WC
->room_flags
& QR_NETWORK
)
373 || ((strcasecmp(ChrPtr(HdrLine
), ChrPtr(WCC
->serv_info
->serv_nodename
))
374 && (strcasecmp(ChrPtr(HdrLine
), ChrPtr(WCC
->serv_info
->serv_fqdn
))))))) {
375 FreeStrBuf(&Msg
->OtherNode
);
376 Msg
->OtherNode
= NewStrBufDup(HdrLine
);
379 void tmplput_MAIL_SUMM_OTHERNODE(StrBuf
*Target
, WCTemplputParams
*TP
)
381 message_summary
*Msg
= (message_summary
*) CTX
;
382 StrBufAppendTemplate(Target
, TP
, Msg
->OtherNode
, 0);
384 int Conditional_MAIL_SUMM_OTHERNODE(StrBuf
*Target
, WCTemplputParams
*TP
)
386 message_summary
*Msg
= (message_summary
*) CTX
;
387 return StrLength(Msg
->OtherNode
) > 0;
391 void examine_rcpt(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
393 FreeStrBuf(&Msg
->to
);
394 Msg
->to
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
395 StrBuf_RFC822_to_Utf8(Msg
->to
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
396 if (Msg
->AllRcpt
== NULL
)
397 Msg
->AllRcpt
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
398 if (StrLength(Msg
->AllRcpt
) > 0) {
399 StrBufAppendBufPlain(Msg
->AllRcpt
, HKEY(", "), 0);
401 StrBufAppendBuf(Msg
->AllRcpt
, Msg
->to
, 0);
403 void tmplput_MAIL_SUMM_TO(StrBuf
*Target
, WCTemplputParams
*TP
)
405 message_summary
*Msg
= (message_summary
*) CTX
;
406 StrBufAppendTemplate(Target
, TP
, Msg
->to
, 0);
408 int Conditional_MAIL_SUMM_TO(StrBuf
*Target
, WCTemplputParams
*TP
)
410 message_summary
*Msg
= (message_summary
*) CTX
;
411 return StrLength(Msg
->to
) != 0;
413 int Conditional_MAIL_SUMM_SUBJ(StrBuf
*Target
, WCTemplputParams
*TP
)
415 message_summary
*Msg
= (message_summary
*) CTX
;
416 return StrLength(Msg
->subj
) != 0;
418 void tmplput_MAIL_SUMM_ALLRCPT(StrBuf
*Target
, WCTemplputParams
*TP
)
420 message_summary
*Msg
= (message_summary
*) CTX
;
421 StrBufAppendTemplate(Target
, TP
, Msg
->AllRcpt
, 0);
426 void tmplput_SUMM_COUNT(StrBuf
*Target
, WCTemplputParams
*TP
)
428 StrBufAppendPrintf(Target
, "%d", GetCount( WC
->summ
));
431 HashList
*iterate_get_mailsumm_All(StrBuf
*Target
, WCTemplputParams
*TP
)
435 void examine_time(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
437 Msg
->date
= StrTol(HdrLine
);
440 void tmplput_MAIL_SUMM_DATE_BRIEF(StrBuf
*Target
, WCTemplputParams
*TP
)
443 message_summary
*Msg
= (message_summary
*) CTX
;
444 webcit_fmt_date(datebuf
, Msg
->date
, 1);
445 StrBufAppendBufPlain(Target
, datebuf
, -1, 0);
448 void tmplput_MAIL_SUMM_DATE_FULL(StrBuf
*Target
, WCTemplputParams
*TP
)
451 message_summary
*Msg
= (message_summary
*) CTX
;
452 webcit_fmt_date(datebuf
, Msg
->date
, 0);
453 StrBufAppendBufPlain(Target
, datebuf
, -1, 0);
455 void tmplput_MAIL_SUMM_DATE_NO(StrBuf
*Target
, WCTemplputParams
*TP
)
457 message_summary
*Msg
= (message_summary
*) CTX
;
458 StrBufAppendPrintf(Target
, "%ld", Msg
->date
, 0);
463 void render_MAIL(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
465 Mime
->Data
= NewStrBufPlain(NULL
, Mime
->length
);
466 read_message(Mime
->Data
, HKEY("view_submessage"), Mime
->msgnum
, 0, Mime
->PartNum
);
468 if ( (!IsEmptyStr(mime_submessages)) && (!section[0]) ) {
469 for (i=0; i<num_tokens(mime_submessages, '|'); ++i) {
470 extract_token(buf, mime_submessages, i, '|', sizeof buf);
471 / ** use printable_view to suppress buttons * /
472 wprintf("<blockquote>");
473 read_message(Mime->msgnum, 1, ChrPtr(Mime->Section));
474 wprintf("</blockquote>");
480 void render_MIME_VCard(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
484 if (StrLength(Mime
->Data
) > 0) {
487 /** If it's my vCard I can edit it */
488 if ( (!strcasecmp(ChrPtr(WCC
->wc_roomname
), USERCONFIGROOM
))
489 || (!strcasecmp(&(ChrPtr(WCC
->wc_roomname
)[11]), USERCONFIGROOM
))
490 || (WC
->wc_view
== VIEW_ADDRESSBOOK
)
492 StrBufAppendPrintf(Buf
, "<a href=\"edit_vcard?msgnum=%ld&partnum=%s\">",
493 Mime
->msgnum
, ChrPtr(Mime
->PartNum
));
494 StrBufAppendPrintf(Buf
, "[%s]</a>", _("edit"));
497 /* In all cases, display the full card */
498 display_vcard(Buf
, ChrPtr(Mime
->Data
), 0, 1, NULL
, Mime
->msgnum
);
499 FreeStrBuf(&Mime
->Data
);
505 void render_MIME_ICS(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
507 if (StrLength(Mime
->Data
) == 0) {
510 if (StrLength(Mime
->Data
) > 0) {
511 cal_process_attachment(Mime
);
517 void examine_mime_part(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
519 wc_mime_attachment
*Mime
;
522 Mime
= (wc_mime_attachment
*) malloc(sizeof(wc_mime_attachment
));
523 memset(Mime
, 0, sizeof(wc_mime_attachment
));
524 Mime
->msgnum
= Msg
->msgnum
;
527 Mime
->Name
= NewStrBuf();
528 StrBufExtract_token(Buf
, HdrLine
, 0, '|');
529 StrBuf_RFC822_to_Utf8(Mime
->Name
, Buf
, WC
->DefaultCharset
, FoundCharset
);
530 StrBufTrim(Mime
->Name
);
532 StrBufExtract_token(Buf
, HdrLine
, 1, '|');
533 Mime
->FileName
= NewStrBuf();
534 StrBuf_RFC822_to_Utf8(Mime
->FileName
, Buf
, WC
->DefaultCharset
, FoundCharset
);
535 StrBufTrim(Mime
->FileName
);
537 Mime
->PartNum
= NewStrBuf();
538 StrBufExtract_token(Mime
->PartNum
, HdrLine
, 2, '|');
539 StrBufTrim(Mime
->PartNum
);
540 if (strchr(ChrPtr(Mime
->PartNum
), '.') != NULL
)
545 Mime
->Disposition
= NewStrBuf();
546 StrBufExtract_token(Mime
->Disposition
, HdrLine
, 3, '|');
548 Mime
->ContentType
= NewStrBuf();
549 StrBufExtract_token(Mime
->ContentType
, HdrLine
, 4, '|');
550 StrBufTrim(Mime
->ContentType
);
551 StrBufLowerCase(Mime
->ContentType
);
553 if (!strcmp(ChrPtr(Mime
->ContentType
), "application/octet-stream")) {
554 StrBufPlain(Mime
->ContentType
,
555 GuessMimeByFilename(SKEY(Mime
->FileName
)), -1);
557 Mime
->length
= StrBufExtract_int(HdrLine
, 5, '|');
559 if ( (StrLength(Mime
->FileName
) == 0) && (StrLength(Mime
->Name
) > 0) ) {
560 StrBufAppendBuf(Mime
->FileName
, Mime
->Name
, 0);
563 if (StrLength(Msg
->PartNum
) > 0) {
565 StrBufPrintf(Buf
, "%s.%s", ChrPtr(Msg
->PartNum
), ChrPtr(Mime
->PartNum
));
571 if (Msg
->AllAttach
== NULL
)
572 Msg
->AllAttach
= NewHash(1,NULL
);
573 Put(Msg
->AllAttach
, SKEY(Mime
->PartNum
), Mime
, DestroyMime
);
578 void evaluate_mime_part(message_summary
*Msg
, wc_mime_attachment
*Mime
)
582 /* just print the root-node */
583 if ((Mime
->level
== 1) &&
584 GetHash(MimeRenderHandler
, SKEY(Mime
->ContentType
), &vMimeRenderer
) &&
585 vMimeRenderer
!= NULL
)
587 Mime
->Renderer
= (RenderMimeFuncStruct
*) vMimeRenderer
;
588 if (Msg
->Submessages
== NULL
)
589 Msg
->Submessages
= NewHash(1,NULL
);
590 Put(Msg
->Submessages
, SKEY(Mime
->PartNum
), Mime
, reference_free_handler
);
592 else if ((Mime
->level
== 1) &&
593 (!strcasecmp(ChrPtr(Mime
->Disposition
), "inline"))
594 && (!strncasecmp(ChrPtr(Mime
->ContentType
), "image/", 6)) ){
595 if (Msg
->AttachLinks
== NULL
)
596 Msg
->AttachLinks
= NewHash(1,NULL
);
597 Put(Msg
->AttachLinks
, SKEY(Mime
->PartNum
), Mime
, reference_free_handler
);
599 else if ((Mime
->level
== 1) &&
600 (StrLength(Mime
->ContentType
) > 0) &&
601 ( (!strcasecmp(ChrPtr(Mime
->Disposition
), "attachment"))
602 || (!strcasecmp(ChrPtr(Mime
->Disposition
), "inline"))
603 || (!strcasecmp(ChrPtr(Mime
->Disposition
), ""))))
605 if (Msg
->AttachLinks
== NULL
)
606 Msg
->AttachLinks
= NewHash(1,NULL
);
607 Put(Msg
->AttachLinks
, SKEY(Mime
->PartNum
), Mime
, reference_free_handler
);
608 if ((strcasecmp(ChrPtr(Mime
->ContentType
), "application/octet-stream") == 0) &&
609 (StrLength(Mime
->FileName
) > 0)) {
610 FlushStrBuf(Mime
->ContentType
);
611 StrBufAppendBufPlain(Mime
->ContentType
,
612 GuessMimeByFilename(SKEY(Mime
->FileName
)),
618 void tmplput_MAIL_SUMM_NATTACH(StrBuf
*Target
, WCTemplputParams
*TP
)
620 message_summary
*Msg
= (message_summary
*) CTX
;
621 StrBufAppendPrintf(Target
, "%ld", GetCount(Msg
->Attachments
));
625 void examine_hnod(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
627 FreeStrBuf(&Msg
->hnod
);
628 Msg
->hnod
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
629 StrBuf_RFC822_to_Utf8(Msg
->hnod
, HdrLine
, WC
->DefaultCharset
, FoundCharset
);
631 void tmplput_MAIL_SUMM_H_NODE(StrBuf
*Target
, WCTemplputParams
*TP
)
633 message_summary
*Msg
= (message_summary
*) CTX
;
634 StrBufAppendTemplate(Target
, TP
, Msg
->hnod
, 0);
636 int Conditional_MAIL_SUMM_H_NODE(StrBuf
*Target
, WCTemplputParams
*TP
)
638 message_summary
*Msg
= (message_summary
*) CTX
;
639 return StrLength(Msg
->hnod
) > 0;
644 void examine_text(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
646 Msg
->MsgBody
->Data
= NewStrBuf();
649 void examine_msg4_partnum(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
651 Msg
->MsgBody
->PartNum
= NewStrBufDup(HdrLine
);
652 StrBufTrim(Msg
->MsgBody
->PartNum
);
655 void examine_content_lengh(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
657 Msg
->MsgBody
->length
= StrTol(HdrLine
);
658 Msg
->MsgBody
->size_known
= 1;
661 void examine_content_type(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
671 Msg
->MsgBody
->ContentType
= NewStrBufDup(HdrLine
);
672 sem
= strchr(ChrPtr(HdrLine
), ';');
675 Token
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
676 Value
= NewStrBufPlain(NULL
, StrLength(HdrLine
));
677 len
= sem
- ChrPtr(HdrLine
);
678 StrBufCutAt(Msg
->MsgBody
->ContentType
, len
, NULL
);
679 while (sem
!= NULL
) {
680 while (isspace(*(sem
+ 1)))
682 StrBufCutLeft(HdrLine
, sem
- ChrPtr(HdrLine
));
683 sem
= strchr(ChrPtr(HdrLine
), ';');
685 len
= sem
- ChrPtr(HdrLine
);
687 len
= StrLength(HdrLine
);
690 StrBufAppendBufPlain(Token
, ChrPtr(HdrLine
), len
, 0);
691 eq
= strchr(ChrPtr(Token
), '=');
693 len
= eq
- ChrPtr(Token
);
694 StrBufAppendBufPlain(Value
, eq
+ 1, StrLength(Token
) - len
- 1, 0);
695 StrBufCutAt(Token
, len
, NULL
);
700 if (GetHash(MsgHeaderHandler
, SKEY(Token
), &vHdr
) &&
702 Hdr
= (headereval
*)vHdr
;
703 Hdr
->evaluator(Msg
, Value
, FoundCharset
);
705 else lprintf(1, "don't know how to handle content type sub-header[%s]\n", ChrPtr(Token
));
712 void tmplput_MAIL_SUMM_N(StrBuf
*Target
, WCTemplputParams
*TP
)
714 message_summary
*Msg
= (message_summary
*) CTX
;
715 StrBufAppendPrintf(Target
, "%ld", Msg
->msgnum
);
720 int Conditional_MAIL_MIME_ALL(StrBuf
*Target
, WCTemplputParams
*TP
)
722 message_summary
*Msg
= (message_summary
*) CTX
;
723 return GetCount(Msg
->Attachments
) > 0;
726 int Conditional_MAIL_MIME_SUBMESSAGES(StrBuf
*Target
, WCTemplputParams
*TP
)
728 message_summary
*Msg
= (message_summary
*) CTX
;
729 return GetCount(Msg
->Submessages
) > 0;
732 int Conditional_MAIL_MIME_ATTACHLINKS(StrBuf
*Target
, WCTemplputParams
*TP
)
734 message_summary
*Msg
= (message_summary
*) CTX
;
735 return GetCount(Msg
->AttachLinks
) > 0;
738 int Conditional_MAIL_MIME_ATTACH(StrBuf
*Target
, WCTemplputParams
*TP
)
740 message_summary
*Msg
= (message_summary
*) CTX
;
741 return GetCount(Msg
->AllAttach
) > 0;
746 /*----------------------------------------------------------------------------*/
747 void tmplput_QUOTED_MAIL_BODY(StrBuf
*Target
, WCTemplputParams
*TP
)
752 MsgNum
= LBstr(TKEY(0));
754 read_message(Buf
, HKEY("view_message_replyquote"), MsgNum
, 0, NULL
);
755 StrBufAppendTemplate(Target
, TP
, Buf
, 1);
759 void tmplput_MAIL_BODY(StrBuf
*Target
, WCTemplputParams
*TP
)
761 message_summary
*Msg
= (message_summary
*) CTX
;
762 StrBufAppendTemplate(Target
, TP
, Msg
->MsgBody
->Data
, 0);
766 void render_MAIL_variformat(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
768 /* Messages in legacy Citadel variformat get handled thusly... */
769 StrBuf
*Target
= NewStrBufPlain(NULL
, StrLength(Mime
->Data
));
770 FmOut(Target
, "JUSTIFY", Mime
->Data
);
771 FreeStrBuf(&Mime
->Data
);
775 void render_MAIL_text_plain(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
778 const char *ptr
, *pte
;
779 const char *BufPtr
= NULL
;
791 iconv_t ic
= (iconv_t
)(-1) ;
794 if ((StrLength(Mime
->Data
) == 0) && (Mime
->length
> 0)) {
795 FreeStrBuf(&Mime
->Data
);
799 /* Boring old 80-column fixed format text gets handled this way... */
800 if ((strcasecmp(ChrPtr(Mime
->Charset
), "us-ascii") == 0) &&
801 (strcasecmp(ChrPtr(Mime
->Charset
), "UTF-8") == 0))
806 if (StrLength(Mime
->Charset
) != 0)
808 else if (StrLength(FoundCharset
) > 0)
810 else if (StrLength(WC
->DefaultCharset
) > 0)
811 cs
= WC
->DefaultCharset
;
816 ctdl_iconv_open("UTF-8", ChrPtr(cs
), &ic
);
817 if (ic
== (iconv_t
)(-1) ) {
818 lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
819 __FILE__
, __LINE__
, ChrPtr(Mime
->Charset
), strerror(errno
));
827 Target
= NewStrBufPlain(NULL
, StrLength(Mime
->Data
));
829 while ((n
= StrBufSipLine(Line
, Mime
->Data
, &BufPtr
), n
>= 0) && !done
)
835 len
= StrLength(Line
);
838 while ((ptr
< pte
) &&
847 if (i
> 0) StrBufCutLeft(Line
, i
);
849 if (StrLength(Line
) == 0) {
850 StrBufAppendBufPlain(Target
, HKEY("<tt></tt><br />\n"), 0);
854 for (i
= bn
; i
< bq
; i
++)
855 StrBufAppendBufPlain(Target
, HKEY("<blockquote>"), 0);
856 for (i
= bq
; i
< bn
; i
++)
857 StrBufAppendBufPlain(Target
, HKEY("</blockquote>"), 0);
859 if (ConvertIt
== 1) {
860 StrBufConvert(Line
, Line1
, &ic
);
863 StrBufAppendBufPlain(Target
, HKEY("<tt>"), 0);
864 UrlizeText(Line1
, Line
, Line2
);
866 StrEscAppend(Target
, Line1
, NULL
, 0, 0);
867 StrBufAppendBufPlain(Target
, HKEY("</tt><br />\n"), 0);
871 for (i
= 0; i
< bn
; i
++)
872 StrBufAppendBufPlain(Target
, HKEY("</blockquote>"), 0);
874 StrBufAppendBufPlain(Target
, HKEY("</i><br />"), 0);
876 if (ic
!= (iconv_t
)(-1) ) {
881 FreeStrBuf(&Mime
->Data
);
883 FlushStrBuf(Mime
->ContentType
);
884 StrBufAppendBufPlain(Mime
->ContentType
, HKEY("text/html"), 0);
885 FlushStrBuf(Mime
->Charset
);
886 StrBufAppendBufPlain(Mime
->Charset
, HKEY("UTF-8"), 0);
892 void render_MAIL_html(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
896 if (StrLength(Mime
->Data
) == 0)
899 Buf
= NewStrBufPlain(NULL
, StrLength(Mime
->Data
));
901 /* HTML is fun, but we've got to strip it first */
902 output_html(ChrPtr(Mime
->Charset
),
903 (WC
->wc_view
== VIEW_WIKI
? 1 : 0),
906 FreeStrBuf(&Mime
->Data
);
910 void render_MAIL_UNKNOWN(wc_mime_attachment
*Mime
, StrBuf
*RawData
, StrBuf
*FoundCharset
)
912 /* Unknown weirdness */
913 FlushStrBuf(Mime
->Data
);
914 StrBufAppendBufPlain(Mime
->Data
, _("I don't know how to display "), -1, 0);
915 StrBufAppendBuf(Mime
->Data
, Mime
->ContentType
, 0);
916 StrBufAppendBufPlain(Mime
->Data
, HKEY("<br />\n"), 0);
924 HashList
*iterate_get_mime_All(StrBuf
*Target
, WCTemplputParams
*TP
)
926 message_summary
*Msg
= (message_summary
*) CTX
;
927 return Msg
->Attachments
;
929 HashList
*iterate_get_mime_Submessages(StrBuf
*Target
, WCTemplputParams
*TP
)
931 message_summary
*Msg
= (message_summary
*) CTX
;
932 return Msg
->Submessages
;
934 HashList
*iterate_get_mime_AttachLinks(StrBuf
*Target
, WCTemplputParams
*TP
)
936 message_summary
*Msg
= (message_summary
*) CTX
;
937 return Msg
->AttachLinks
;
939 HashList
*iterate_get_mime_Attachments(StrBuf
*Target
, WCTemplputParams
*TP
)
941 message_summary
*Msg
= (message_summary
*) CTX
;
942 return Msg
->AllAttach
;
945 void tmplput_MIME_Name(StrBuf
*Target
, WCTemplputParams
*TP
)
947 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
948 StrBufAppendTemplate(Target
, TP
, mime
->Name
, 0);
951 void tmplput_MIME_FileName(StrBuf
*Target
, WCTemplputParams
*TP
)
953 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
954 StrBufAppendTemplate(Target
, TP
, mime
->FileName
, 0);
957 void tmplput_MIME_PartNum(StrBuf
*Target
, WCTemplputParams
*TP
)
959 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
960 StrBufAppendTemplate(Target
, TP
, mime
->PartNum
, 0);
963 void tmplput_MIME_MsgNum(StrBuf
*Target
, WCTemplputParams
*TP
)
965 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
966 StrBufAppendPrintf(Target
, "%ld", mime
->msgnum
);
969 void tmplput_MIME_Disposition(StrBuf
*Target
, WCTemplputParams
*TP
)
971 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
972 StrBufAppendTemplate(Target
, TP
, mime
->Disposition
, 0);
975 void tmplput_MIME_ContentType(StrBuf
*Target
, WCTemplputParams
*TP
)
977 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
978 StrBufAppendTemplate(Target
, TP
, mime
->ContentType
, 0);
981 void examine_charset(message_summary
*Msg
, StrBuf
*HdrLine
, StrBuf
*FoundCharset
)
983 Msg
->MsgBody
->Charset
= NewStrBufDup(HdrLine
);
986 void tmplput_MIME_Charset(StrBuf
*Target
, WCTemplputParams
*TP
)
988 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
989 StrBufAppendTemplate(Target
, TP
, mime
->Charset
, 0);
992 void tmplput_MIME_Data(StrBuf
*Target
, WCTemplputParams
*TP
)
994 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
995 if (mime
->Renderer
!= NULL
)
996 mime
->Renderer
->f(mime
, NULL
, NULL
);
997 StrBufAppendTemplate(Target
, TP
, mime
->Data
, 0);
998 /* TODO: check whether we need to load it now? */
1001 void tmplput_MIME_LoadData(StrBuf
*Target
, WCTemplputParams
*TP
)
1003 wcsession
*WCC
= WC
;
1004 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
1005 wc_mime_attachment
*att
;
1007 if ( (!strcasecmp(ChrPtr(mime
->Disposition
), "inline"))||
1008 (!strcasecmp(ChrPtr(mime
->Disposition
), "attachment")) )
1013 /* steal this mime part... */
1014 att
= malloc(sizeof(wc_mime_attachment
));
1015 memcpy(att
, mime
, sizeof(wc_mime_attachment
));
1016 memset(mime
, 0, sizeof(wc_mime_attachment
));
1018 if (att
->Data
== NULL
)
1021 if (WCC
->attachments
== NULL
)
1022 WCC
->attachments
= NewHash(1, NULL
);
1023 /* And add it to the list. */
1024 n
= snprintf(N
, sizeof N
, "%d", GetCount(WCC
->attachments
) + 1);
1025 Put(WCC
->attachments
, N
, n
, att
, DestroyMime
);
1029 void tmplput_MIME_Length(StrBuf
*Target
, WCTemplputParams
*TP
)
1031 wc_mime_attachment
*mime
= (wc_mime_attachment
*) CTX
;
1032 StrBufAppendPrintf(Target
, "%ld", mime
->length
);
1035 HashList
*iterate_get_registered_Attachments(StrBuf
*Target
, WCTemplputParams
*TP
)
1037 return WC
->attachments
;
1040 void servcmd_do_search(char *buf
, long bufsize
)
1042 snprintf(buf
, bufsize
, "MSGS SEARCH|%s", bstr("query"));
1045 void servcmd_headers(char *buf
, long bufsize
)
1047 snprintf(buf
, bufsize
, "MSGS ALL");
1050 void servcmd_readfwd(char *buf
, long bufsize
)
1052 snprintf(buf
, bufsize
, "MSGS ALL");
1055 void servcmd_readnew(char *buf
, long bufsize
)
1057 snprintf(buf
, bufsize
, "MSGS NEW");
1060 void servcmd_readold(char *buf
, long bufsize
)
1062 snprintf(buf
, bufsize
, "MSGS OLD");
1066 readloop_struct rlid
[] = {
1067 { {HKEY("do_search")}, servcmd_do_search
},
1068 { {HKEY("headers")}, servcmd_headers
},
1069 { {HKEY("readfwd")}, servcmd_readfwd
},
1070 { {HKEY("readnew")}, servcmd_readnew
},
1071 { {HKEY("readold")}, servcmd_readold
}
1076 void SetAccessCommand(long Oper
)
1078 wcsession
*WCC
= WC
;
1080 if (WCC
->UrlFragment1
!= NULL
) {
1081 FlushStrBuf(WCC
->UrlFragment1
);
1082 StrBufAppendBufPlain(WCC
->UrlFragment1
,
1083 rlid
[Oper
].name
.Key
, rlid
[Oper
].name
.len
, 0);
1086 WCC
->UrlFragment1
= NewStrBufPlain(rlid
[Oper
].name
.Key
, rlid
[Oper
].name
.len
);
1094 InitModule_MSGRENDERERS
1097 RegisterSortFunc(HKEY("date"),
1103 RegisterSortFunc(HKEY("subject"),
1109 RegisterSortFunc(HKEY("sender"),
1116 RegisterNamespace("SUMM:COUNT", 0, 0, tmplput_SUMM_COUNT
, CTX_NONE
);
1117 /* iterate over all known mails in WC->summ */
1118 RegisterIterator("MAIL:SUMM:MSGS", 0, NULL
, iterate_get_mailsumm_All
,
1119 NULL
,NULL
, CTX_MAILSUM
, CTX_NONE
, IT_NOFLAG
);
1121 RegisterNamespace("MAIL:SUMM:DATEBRIEF", 0, 0, tmplput_MAIL_SUMM_DATE_BRIEF
, CTX_MAILSUM
);
1122 RegisterNamespace("MAIL:SUMM:DATEFULL", 0, 0, tmplput_MAIL_SUMM_DATE_FULL
, CTX_MAILSUM
);
1123 RegisterNamespace("MAIL:SUMM:DATENO", 0, 0, tmplput_MAIL_SUMM_DATE_NO
, CTX_MAILSUM
);
1124 RegisterNamespace("MAIL:SUMM:N", 0, 0, tmplput_MAIL_SUMM_N
, CTX_MAILSUM
);
1125 RegisterNamespace("MAIL:SUMM:FROM", 0, 2, tmplput_MAIL_SUMM_FROM
, CTX_MAILSUM
);
1126 RegisterNamespace("MAIL:SUMM:TO", 0, 2, tmplput_MAIL_SUMM_TO
, CTX_MAILSUM
);
1127 RegisterNamespace("MAIL:SUMM:SUBJECT", 0, 4, tmplput_MAIL_SUMM_SUBJECT
, CTX_MAILSUM
);
1128 RegisterNamespace("MAIL:SUMM:NTATACH", 0, 0, tmplput_MAIL_SUMM_NATTACH
, CTX_MAILSUM
);
1129 RegisterNamespace("MAIL:SUMM:CCCC", 0, 2, tmplput_MAIL_SUMM_CCCC
, CTX_MAILSUM
);
1130 RegisterNamespace("MAIL:SUMM:H_NODE", 0, 2, tmplput_MAIL_SUMM_H_NODE
, CTX_MAILSUM
);
1131 RegisterNamespace("MAIL:SUMM:ALLRCPT", 0, 2, tmplput_MAIL_SUMM_ALLRCPT
, CTX_MAILSUM
);
1132 RegisterNamespace("MAIL:SUMM:ORGROOM", 0, 2, tmplput_MAIL_SUMM_ORGROOM
, CTX_MAILSUM
);
1133 RegisterNamespace("MAIL:SUMM:RFCA", 0, 2, tmplput_MAIL_SUMM_RFCA
, CTX_MAILSUM
);
1134 RegisterNamespace("MAIL:SUMM:OTHERNODE", 2, 0, tmplput_MAIL_SUMM_OTHERNODE
, CTX_MAILSUM
);
1135 RegisterNamespace("MAIL:SUMM:REFIDS", 0, 0, tmplput_MAIL_SUMM_REFIDS
, CTX_MAILSUM
);
1136 RegisterNamespace("MAIL:SUMM:INREPLYTO", 0, 2, tmplput_MAIL_SUMM_INREPLYTO
, CTX_MAILSUM
);
1137 RegisterNamespace("MAIL:BODY", 0, 2, tmplput_MAIL_BODY
, CTX_MAILSUM
);
1138 RegisterNamespace("MAIL:QUOTETEXT", 1, 2, tmplput_QUOTED_MAIL_BODY
, CTX_NONE
);
1139 RegisterConditional(HKEY("COND:MAIL:SUMM:RFCA"), 0, Conditional_MAIL_SUMM_RFCA
, CTX_MAILSUM
);
1140 RegisterConditional(HKEY("COND:MAIL:SUMM:CCCC"), 0, Conditional_MAIL_SUMM_CCCC
, CTX_MAILSUM
);
1141 RegisterConditional(HKEY("COND:MAIL:SUMM:UNREAD"), 0, Conditional_MAIL_SUMM_UNREAD
, CTX_MAILSUM
);
1142 RegisterConditional(HKEY("COND:MAIL:SUMM:H_NODE"), 0, Conditional_MAIL_SUMM_H_NODE
, CTX_MAILSUM
);
1143 RegisterConditional(HKEY("COND:MAIL:SUMM:OTHERNODE"), 0, Conditional_MAIL_SUMM_OTHERNODE
, CTX_MAILSUM
);
1144 RegisterConditional(HKEY("COND:MAIL:SUMM:SUBJECT"), 0, Conditional_MAIL_SUMM_SUBJECT
, CTX_MAILSUM
);
1145 RegisterConditional(HKEY("COND:MAIL:ANON"), 0, Conditional_ANONYMOUS_MESSAGE
, CTX_MAILSUM
);
1146 RegisterConditional(HKEY("COND:MAIL:TO"), 0, Conditional_MAIL_SUMM_TO
, CTX_MAILSUM
);
1147 RegisterConditional(HKEY("COND:MAIL:SUBJ"), 0, Conditional_MAIL_SUMM_SUBJ
, CTX_MAILSUM
);
1149 /* do we have mimetypes to iterate over? */
1150 RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH"), 0, Conditional_MAIL_MIME_ALL
, CTX_MAILSUM
);
1151 RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH:SUBMESSAGES"), 0, Conditional_MAIL_MIME_SUBMESSAGES
, CTX_MAILSUM
);
1152 RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH:LINKS"), 0, Conditional_MAIL_MIME_ATTACHLINKS
, CTX_MAILSUM
);
1153 RegisterConditional(HKEY("COND:MAIL:MIME:ATTACH:ATT"), 0, Conditional_MAIL_MIME_ATTACH
, CTX_MAILSUM
);
1154 RegisterIterator("MAIL:MIME:ATTACH", 0, NULL
, iterate_get_mime_All
,
1155 NULL
, NULL
, CTX_MIME_ATACH
, CTX_MAILSUM
, IT_NOFLAG
);
1156 RegisterIterator("MAIL:MIME:ATTACH:SUBMESSAGES", 0, NULL
, iterate_get_mime_Submessages
,
1157 NULL
, NULL
, CTX_MIME_ATACH
, CTX_MAILSUM
, IT_NOFLAG
);
1158 RegisterIterator("MAIL:MIME:ATTACH:LINKS", 0, NULL
, iterate_get_mime_AttachLinks
,
1159 NULL
, NULL
, CTX_MIME_ATACH
, CTX_MAILSUM
, IT_NOFLAG
);
1160 RegisterIterator("MAIL:MIME:ATTACH:ATT", 0, NULL
, iterate_get_mime_Attachments
,
1161 NULL
, NULL
, CTX_MIME_ATACH
, CTX_MAILSUM
, IT_NOFLAG
);
1163 /* Parts of a mime attachent */
1164 RegisterNamespace("MAIL:MIME:NAME", 0, 2, tmplput_MIME_Name
, CTX_MIME_ATACH
);
1165 RegisterNamespace("MAIL:MIME:FILENAME", 0, 2, tmplput_MIME_FileName
, CTX_MIME_ATACH
);
1166 RegisterNamespace("MAIL:MIME:PARTNUM", 0, 2, tmplput_MIME_PartNum
, CTX_MIME_ATACH
);
1167 RegisterNamespace("MAIL:MIME:MSGNUM", 0, 2, tmplput_MIME_MsgNum
, CTX_MIME_ATACH
);
1168 RegisterNamespace("MAIL:MIME:DISPOSITION", 0, 2, tmplput_MIME_Disposition
, CTX_MIME_ATACH
);
1169 RegisterNamespace("MAIL:MIME:CONTENTTYPE", 0, 2, tmplput_MIME_ContentType
, CTX_MIME_ATACH
);
1170 RegisterNamespace("MAIL:MIME:CHARSET", 0, 2, tmplput_MIME_Charset
, CTX_MIME_ATACH
);
1171 RegisterNamespace("MAIL:MIME:LENGTH", 0, 2, tmplput_MIME_Length
, CTX_MIME_ATACH
);
1172 RegisterNamespace("MAIL:MIME:DATA", 0, 2, tmplput_MIME_Data
, CTX_MIME_ATACH
);
1173 /* load the actual attachment into WC->attachments; no output!!! */
1174 RegisterNamespace("MAIL:MIME:LOADDATA", 0, 0, tmplput_MIME_LoadData
, CTX_MIME_ATACH
);
1176 /* iterate the WC->attachments; use the above tokens for their contents */
1177 RegisterIterator("MSG:ATTACHNAMES", 0, NULL
, iterate_get_registered_Attachments
,
1178 NULL
, NULL
, CTX_MIME_ATACH
, CTX_NONE
, IT_NOFLAG
);
1180 /* mime renderers translate an attachment into webcit viewable html text */
1181 RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL
);
1182 RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard
);
1183 RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard
);
1184 RegisterMimeRenderer(HKEY("text/calendar"), render_MIME_ICS
);
1185 RegisterMimeRenderer(HKEY("application/ics"), render_MIME_ICS
);
1186 RegisterMimeRenderer(HKEY("text/x-citadel-variformat"), render_MAIL_variformat
);
1187 RegisterMimeRenderer(HKEY("text/plain"), render_MAIL_text_plain
);
1188 RegisterMimeRenderer(HKEY("text"), render_MAIL_text_plain
);
1189 RegisterMimeRenderer(HKEY("text/html"), render_MAIL_html
);
1190 RegisterMimeRenderer(HKEY(""), render_MAIL_UNKNOWN
);
1192 /* these headers are citserver replies to MSG4 and friends. one evaluator for each */
1193 RegisterMsgHdr(HKEY("nhdr"), examine_nhdr
, 0);
1194 RegisterMsgHdr(HKEY("type"), examine_type
, 0);
1195 RegisterMsgHdr(HKEY("from"), examine_from
, 0);
1196 RegisterMsgHdr(HKEY("subj"), examine_subj
, 0);
1197 RegisterMsgHdr(HKEY("msgn"), examine_msgn
, 0);
1198 RegisterMsgHdr(HKEY("wefw"), examine_wefw
, 0);
1199 RegisterMsgHdr(HKEY("cccc"), examine_cccc
, 0);
1200 RegisterMsgHdr(HKEY("hnod"), examine_hnod
, 0);
1201 RegisterMsgHdr(HKEY("room"), examine_room
, 0);
1202 RegisterMsgHdr(HKEY("rfca"), examine_rfca
, 0);
1203 RegisterMsgHdr(HKEY("node"), examine_node
, 0);
1204 RegisterMsgHdr(HKEY("rcpt"), examine_rcpt
, 0);
1205 RegisterMsgHdr(HKEY("time"), examine_time
, 0);
1206 RegisterMsgHdr(HKEY("part"), examine_mime_part
, 0);
1207 RegisterMsgHdr(HKEY("text"), examine_text
, 1);
1208 /* these are the content-type headers we get infront of a message; put it into the same hash since it doesn't clash. */
1209 RegisterMsgHdr(HKEY("X-Citadel-MSG4-Partnum"), examine_msg4_partnum
, 0);
1210 RegisterMsgHdr(HKEY("Content-type"), examine_content_type
, 0);
1211 RegisterMsgHdr(HKEY("Content-length"), examine_content_lengh
, 0);
1212 RegisterMsgHdr(HKEY("Content-transfer-encoding"), examine_content_encoding
, 0); /* do we care? */
1213 RegisterMsgHdr(HKEY("charset"), examine_charset
, 0);
1215 /* Don't care about these... */
1216 RegisterMsgHdr(HKEY("pref"), examine_pref
, 0);
1217 RegisterMsgHdr(HKEY("suff"), examine_suff
, 0);
1218 RegisterMsgHdr(HKEY("path"), examine_path
, 0);