From e12232bf2b1df2218549441e97d4071a678d4cab Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Sat, 15 Nov 2008 13:09:57 +0000 Subject: [PATCH] * finish message displaying. --- webcit/context_loop.c | 1 + webcit/messages.c | 56 ++++--- webcit/msg_renderers.c | 143 ++++++++++-------- webcit/static/t/view_message.html | 10 +- .../static/t/view_message_inline_attach.html | 4 - webcit/webcit.c | 4 + webcit/webcit.h | 12 +- 7 files changed, 130 insertions(+), 100 deletions(-) diff --git a/webcit/context_loop.c b/webcit/context_loop.c index c2943f07e..9bbb477c4 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -454,6 +454,7 @@ void context_loop(int *sock) #ifdef TECH_PREVIEW if ((strncmp(ChrPtr(ReqLine), "/sslg", 5) != 0) && (strncmp(ChrPtr(ReqLine), "/static/", 8) != 0) && + (strncmp(ChrPtr(ReqLine), "/tiny_mce/", 10) != 0) && (strncmp(ChrPtr(ReqLine), "/wholist_section", 16) != 0) && (strstr(ChrPtr(ReqLine), "wholist_section") == NULL)) { #endif diff --git a/webcit/messages.c b/webcit/messages.c index 171373b4a..f263d5c1b 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -228,10 +228,12 @@ int summcmp_rdate(const void *s1, const void *s2) { * printable_view Nonzero to display a printable view * section Optional for encapsulated message/rfc822 submessage */ -void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *section) { +int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *PartNum) { StrBuf *Buf; StrBuf *Token; StrBuf *FoundCharset; + HashPos *it; + void *vMime; message_summary *Msg = NULL; headereval *Hdr; void *vHdr; @@ -240,20 +242,21 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i char reply_references[1024] = ""; int Done = 0; int state=0; - + long len; + const char *Key; Buf = NewStrBuf(); - lprintf(1, "-------------------MSG4 %ld|%s--------------\n", msgnum, ChrPtr(section)); - serv_printf("MSG4 %ld|%s", msgnum, ChrPtr(section)); + lprintf(1, "-------------------MSG4 %ld|%s--------------\n", msgnum, ChrPtr(PartNum)); + serv_printf("MSG4 %ld|%s", msgnum, ChrPtr(PartNum)); StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, NULL) != 1) { StrBufAppendPrintf(Target, ""); StrBufAppendPrintf(Target, _("ERROR:")); StrBufAppendPrintf(Target, " %s
\n", &buf[4]); FreeStrBuf(&Buf); - return; + return 0; } - svputlong("MsgPrintable", printable_view); + /** begin everythingamundo table */ @@ -261,6 +264,9 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i Msg = (message_summary *)malloc(sizeof(message_summary)); memset(Msg, 0, sizeof(message_summary)); Msg->msgnum = msgnum; + Msg->PartNum = PartNum; + Msg->MsgBody = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment)); + memset(Msg->MsgBody, 0, sizeof(wc_mime_attachment)); FoundCharset = NewStrBuf(); while ((StrBuf_ServGetln(Buf)>=0) && !Done) { if ( (StrLength(Buf)==3) && @@ -268,6 +274,7 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i { Done = 1; if (state < 2) { + lprintf(1, _("unexpected end of message")); StrBufAppendPrintf(Target, ""); StrBufAppendPrintf(Target, _("unexpected end of message")); StrBufAppendPrintf(Target, " (1)

\n"); @@ -276,7 +283,7 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i FreeStrBuf(&Token); DestroyMessageSummary(Msg); FreeStrBuf(&FoundCharset); - return; + return 0; } else { break; @@ -305,9 +312,9 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i case 1:/* Message Mime Header */ if (StrLength(Buf) == 0) { state++; - if (Msg->MsgBody.ContentType == NULL) + if (Msg->MsgBody->ContentType == NULL) /* end of header or no header? */ - Msg->MsgBody.ContentType = NewStrBufPlain(HKEY("text/plain")); + Msg->MsgBody->ContentType = NewStrBufPlain(HKEY("text/plain")); /* usual end of mime header */ } else @@ -326,34 +333,38 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i } case 2: /* Message Body */ - if (Msg->MsgBody.size_known > 0) { - StrBuf_ServGetBLOB(Msg->MsgBody.Data, Msg->MsgBody.length); + if (Msg->MsgBody->size_known > 0) { + StrBuf_ServGetBLOB(Msg->MsgBody->Data, Msg->MsgBody->length); state ++; /// todo: check next line, if not 000, append following lines } else if (1){ - if (StrLength(Msg->MsgBody.Data) > 0) - StrBufAppendBufPlain(Msg->MsgBody.Data, "\n", 1, 0); - StrBufAppendBuf(Msg->MsgBody.Data, Buf, 0); + if (StrLength(Msg->MsgBody->Data) > 0) + StrBufAppendBufPlain(Msg->MsgBody->Data, "\n", 1, 0); + StrBufAppendBuf(Msg->MsgBody->Data, Buf, 0); } break; case 3: - StrBufAppendBuf(Msg->MsgBody.Data, Buf, 0); + StrBufAppendBuf(Msg->MsgBody->Data, Buf, 0); break; } } + + if (Msg->AllAttach == NULL) + Msg->AllAttach = NewHash(1,NULL); + 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, ';'); + StrBufExtract_token(Buf, Msg->MsgBody->ContentType, 0, ';'); StrBufTrim(Buf); if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) && (vHdr != NULL)) { RenderMimeFunc Render; Render = (RenderMimeFunc)vHdr; - Render(&Msg->MsgBody, NULL, FoundCharset); + Render(Msg->MsgBody, NULL, FoundCharset); } - if (StrLength(Msg->reply_references)> 0) { /* Trim down excessively long lists of thread references. We eliminate the * second one in the list so that the thread root remains intact. @@ -397,12 +408,21 @@ void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, i StrBufAppendBuf(Msg->reply_to, Msg->from, 0); } } + it = GetNewHashPos(); + while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) && + (vMime != NULL)) { + wc_mime_attachment *Mime = (wc_mime_attachment*) vMime; + evaluate_mime_part(Msg, Mime); + } + DeleteHashPos(&it); + DoTemplate(tmpl, tmpllen, Target, Msg, CTX_MAILSUM); DestroyMessageSummary(Msg); FreeStrBuf(&FoundCharset); FreeStrBuf(&Token); FreeStrBuf(&Buf); + return 1; } diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c index 8f6232abd..6b81166f9 100644 --- a/webcit/msg_renderers.c +++ b/webcit/msg_renderers.c @@ -46,9 +46,6 @@ void DestroyMessageSummary(void *vMsg) DeleteHash(&Msg->Submessages); DeleteHash(&Msg->AttachLinks); DeleteHash(&Msg->AllAttach); - - DestroyMimeParts(&Msg->MsgBody); - free(Msg); } @@ -315,82 +312,97 @@ void render_MIME_ICS(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCha void examine_mime_part(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) { - wc_mime_attachment *mime; + wc_mime_attachment *Mime; StrBuf *Buf; - void *vMimeRenderer; - int IsSubSub; - - mime = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment)); - memset(mime, 0, sizeof(wc_mime_attachment)); - mime->msgnum = Msg->msgnum; + + Mime = (wc_mime_attachment*) malloc(sizeof(wc_mime_attachment)); + memset(Mime, 0, sizeof(wc_mime_attachment)); + Mime->msgnum = Msg->msgnum; Buf = NewStrBuf(); - mime->Name = NewStrBuf(); - StrBufExtract_token(mime->Name, HdrLine, 0, '|'); + Mime->Name = NewStrBuf(); + StrBufExtract_token(Mime->Name, HdrLine, 0, '|'); + StrBufTrim(Mime->Name); StrBufExtract_token(Buf, HdrLine, 1, '|'); - mime->FileName = NewStrBuf(); - StrBuf_RFC822_to_Utf8(mime->FileName, Buf, WC->DefaultCharset, FoundCharset); - - mime->PartNum = NewStrBuf(); - StrBufExtract_token(mime->PartNum, HdrLine, 2, '|'); - IsSubSub = (strchr(ChrPtr(mime->PartNum), '.') != NULL); - - mime->Disposition = NewStrBuf(); - StrBufExtract_token(mime->Disposition, HdrLine, 3, '|'); - - mime->ContentType = NewStrBuf(); - StrBufExtract_token(mime->ContentType, HdrLine, 4, '|'); - - mime->length = StrBufExtract_int(HdrLine, 5, '|'); - - StrBufTrim(mime->Name); - StrBufTrim(mime->FileName); + Mime->FileName = NewStrBuf(); + StrBuf_RFC822_to_Utf8(Mime->FileName, Buf, WC->DefaultCharset, FoundCharset); + StrBufTrim(Mime->FileName); + + Mime->PartNum = NewStrBuf(); + StrBufExtract_token(Mime->PartNum, HdrLine, 2, '|'); + StrBufTrim(Mime->PartNum); + if (strchr(ChrPtr(Mime->PartNum), '.') != NULL) + Mime->level = 2; + else + Mime->level = 1; + + Mime->Disposition = NewStrBuf(); + StrBufExtract_token(Mime->Disposition, HdrLine, 3, '|'); + + Mime->ContentType = NewStrBuf(); + StrBufExtract_token(Mime->ContentType, HdrLine, 4, '|'); + StrBufTrim(Mime->ContentType); + StrBufLowerCase(Mime->ContentType); + + Mime->length = StrBufExtract_int(HdrLine, 5, '|'); + + if ( (StrLength(Mime->FileName) == 0) && (StrLength(Mime->Name) > 0) ) { + StrBufAppendBuf(Mime->FileName, Mime->Name, 0); + } - if ( (StrLength(mime->FileName) == 0) && (StrLength(mime->Name) > 0) ) { - StrBufAppendBuf(mime->FileName, mime->Name, 0); + if (StrLength(Msg->PartNum) > 0) { + StrBuf *tmp; + StrBufPrintf(Buf, "%s.%s", ChrPtr(Msg->PartNum), ChrPtr(Mime->PartNum)); + tmp = Mime->PartNum; + Mime->PartNum = Buf; + Buf = tmp; } if (Msg->AllAttach == NULL) Msg->AllAttach = NewHash(1,NULL); - Put(Msg->AllAttach, SKEY(mime->PartNum), mime, DestroyMime); + Put(Msg->AllAttach, SKEY(Mime->PartNum), Mime, DestroyMime); + FreeStrBuf(&Buf); +} - if (IsSubSub){ - FreeStrBuf(&Buf); - return; - } - if (GetHash(MimeRenderHandler, SKEY(mime->ContentType), &vMimeRenderer) && +void evaluate_mime_part(message_summary *Msg, wc_mime_attachment *Mime) +{ + void *vMimeRenderer; + + /* just print the root-node */ + if ((Mime->level == 1) && + GetHash(MimeRenderHandler, SKEY(Mime->ContentType), &vMimeRenderer) && vMimeRenderer != NULL) { - mime->Renderer = (RenderMimeFunc) vMimeRenderer; + Mime->Renderer = (RenderMimeFunc) vMimeRenderer; if (Msg->Submessages == NULL) Msg->Submessages = NewHash(1,NULL); - Put(Msg->Submessages, SKEY(mime->PartNum), mime, reference_free_handler); + Put(Msg->Submessages, SKEY(Mime->PartNum), Mime, reference_free_handler); } - else if ((!strcasecmp(ChrPtr(mime->Disposition), "inline")) - && (!strncasecmp(ChrPtr(mime->ContentType), "image/", 6)) ){ + else if ((Mime->level == 1) && + (!strcasecmp(ChrPtr(Mime->Disposition), "inline")) + && (!strncasecmp(ChrPtr(Mime->ContentType), "image/", 6)) ){ if (Msg->AttachLinks == NULL) Msg->AttachLinks = NewHash(1,NULL); - Put(Msg->AttachLinks, SKEY(mime->PartNum), mime, reference_free_handler); + Put(Msg->AttachLinks, SKEY(Mime->PartNum), Mime, reference_free_handler); } - else if ((StrLength(mime->ContentType) > 0) && - ( (!strcasecmp(ChrPtr(mime->Disposition), "attachment")) - || (!strcasecmp(ChrPtr(mime->Disposition), "inline")) - || (!strcasecmp(ChrPtr(mime->Disposition), "")))) + else if ((Mime->level == 1) && + (StrLength(Mime->ContentType) > 0) && + ( (!strcasecmp(ChrPtr(Mime->Disposition), "attachment")) + || (!strcasecmp(ChrPtr(Mime->Disposition), "inline")) + || (!strcasecmp(ChrPtr(Mime->Disposition), "")))) { if (Msg->AttachLinks == NULL) Msg->AttachLinks = NewHash(1,NULL); - Put(Msg->AttachLinks, SKEY(mime->PartNum), mime, reference_free_handler); - if (strcasecmp(ChrPtr(mime->ContentType), "application/octet-stream") == 0) { - FlushStrBuf(mime->ContentType); - StrBufAppendBufPlain(mime->ContentType, - GuessMimeByFilename(SKEY(mime->FileName)), + Put(Msg->AttachLinks, SKEY(Mime->PartNum), Mime, reference_free_handler); + if (strcasecmp(ChrPtr(Mime->ContentType), "application/octet-stream") == 0) { + FlushStrBuf(Mime->ContentType); + StrBufAppendBufPlain(Mime->ContentType, + GuessMimeByFilename(SKEY(Mime->FileName)), -1, 0); } } - - FreeStrBuf(&Buf); } void tmplput_MAIL_SUMM_NATTACH(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType) @@ -425,14 +437,14 @@ int Conditional_MAIL_SUMM_H_NODE(WCTemplateToken *Tokens, void *Context, int Con void examine_text(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) -{////TODO: read messages here - Msg->MsgBody.Data = NewStrBuf(); +{ + Msg->MsgBody->Data = NewStrBuf(); } void examine_msg4_partnum(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) { - Msg->MsgBody.PartNum = NewStrBufDup(HdrLine); - StrBufTrim(Msg->MsgBody.PartNum);/////TODO: striplt == trim? + Msg->MsgBody->PartNum = NewStrBufDup(HdrLine); + StrBufTrim(Msg->MsgBody->PartNum);/////TODO: striplt == trim? } void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) @@ -442,18 +454,18 @@ void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine, StrBuf *Fou void examine_content_lengh(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) { - Msg->MsgBody.length = StrTol(HdrLine); - Msg->MsgBody.size_known = 1; + Msg->MsgBody->length = StrTol(HdrLine); + Msg->MsgBody->size_known = 1; } void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) {////TODO int len, i; - Msg->MsgBody.ContentType = NewStrBufDup(HdrLine); - StrBufTrim(Msg->MsgBody.ContentType);/////todo==striplt? - len = StrLength(Msg->MsgBody.ContentType); + Msg->MsgBody->ContentType = NewStrBufDup(HdrLine); + StrBufTrim(Msg->MsgBody->ContentType);/////todo==striplt? + len = StrLength(Msg->MsgBody->ContentType); for (i=0; iMsgBody.ContentType) + i, "charset=", 8)) {/// TODO: WHUT? + if (!strncasecmp(ChrPtr(Msg->MsgBody->ContentType) + i, "charset=", 8)) {/// TODO: WHUT? // safestrncpy(mime_charset, &mime_content_type[i+8], /// sizeof mime_charset); } @@ -519,7 +531,7 @@ void tmplput_QUOTED_MAIL_BODY(StrBuf *Target, int nArgs, WCTemplateToken *Token, void tmplput_MAIL_BODY(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType) { message_summary *Msg = (message_summary*) Context; - StrBufAppendBuf(Target, Msg->MsgBody.Data, 0); + StrBufAppendBuf(Target, Msg->MsgBody->Data, 0); } @@ -553,7 +565,8 @@ void render_MAIL_text_plain(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *F if ((StrLength(Mime->Data) == 0) && (Mime->length > 0)) { FreeStrBuf(&Mime->Data); Mime->Data = NewStrBufPlain(NULL, Mime->length); - read_message(Mime->Data, HKEY("view_submessage"), Mime->msgnum, 0, Mime->PartNum); + if (!read_message(Mime->Data, HKEY("view_submessage"), Mime->msgnum, 0, Mime->PartNum)) + return; } /* Boring old 80-column fixed format text gets handled this way... */ diff --git a/webcit/static/t/view_message.html b/webcit/static/t/view_message.html index 6b01cc698..69e086d7d 100644 --- a/webcit/static/t/view_message.html +++ b/webcit/static/t/view_message.html @@ -5,13 +5,13 @@ onMouseOut=document.getElementById("msg").style.visibility="hidden
- "> + ">""<> ***

- -
+ -
diff --git a/webcit/static/t/view_message_inline_attach.html b/webcit/static/t/view_message_inline_attach.html index 9c02dcb5b..aa57ae280 100644 --- a/webcit/static/t/view_message_inline_attach.html +++ b/webcit/static/t/view_message_inline_attach.html @@ -1,5 +1 @@ -" border=0 align=middle> - (, bytes) -[ " target="wc.."> | - "> ]
diff --git a/webcit/webcit.c b/webcit/webcit.c index c4fd3648c..1983f166f 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -758,10 +758,12 @@ void http_redirect(const char *whichpage) { void http_transmit_thing(const char *content_type, int is_static) { +#ifndef TECH_PREVIEW lprintf(9, "http_transmit_thing(%s)%s\n", content_type, (is_static ? " (static)" : "") ); +#endif output_headers(0, 0, 0, 0, 0, is_static); hprintf("Content-type: %s\r\n" @@ -856,7 +858,9 @@ void output_static(char *what) close(fd); +#ifndef TECH_PREVIEW lprintf(9, "output_static('%s') %s\n", what, content_type); +#endif http_transmit_thing(content_type, 1); } if (yesbstr("force_close_session")) { diff --git a/webcit/webcit.h b/webcit/webcit.h index 15b7318e5..4e1f24c49 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -401,6 +401,7 @@ void free_attachment(void *vattach); typedef struct wc_mime_attachment wc_mime_attachment; typedef void (*RenderMimeFunc)(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset); struct wc_mime_attachment { + int level; StrBuf *Name; StrBuf *FileName; StrBuf *PartNum; @@ -440,6 +441,7 @@ typedef struct _message_summary { StrBuf *Room; StrBuf *Rfca; StrBuf *OtherNode; + const StrBuf *PartNum; HashList *Attachments; /**< list of Accachments */ HashList *Submessages; @@ -452,17 +454,13 @@ typedef struct _message_summary { /** The mime part of the message */ - wc_mime_attachment MsgBody; - - - /** Referencces; don't neeed to be freed: */ - wc_mime_attachment *cal_partnum_ref; - wc_mime_attachment *vcard_partnum_ref; + wc_mime_attachment *MsgBody; } message_summary; void DestroyMessageSummary(void *vMsg); typedef void (*ExamineMsgHeaderFunc)(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset); +void evaluate_mime_part(message_summary *Msg, wc_mime_attachment *Mime); @@ -783,7 +781,7 @@ void dump_vars(void); void embed_main_menu(void); void serv_read(char *buf, int bytes); void readloop(char *oper); -void read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *section); +int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *section); void do_addrbook_view(addrbookent *addrbook, int num_ab); void display_vcard(StrBuf *Target, const char *vcard_source, char alpha, int full, char *storename, long msgnum); void text_to_server(char *ptr); -- 2.39.2