X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmsg_renderers.c;h=d04959865188d830015890c6bfa9f9c1b66cefed;hb=22e4e5ffb65d6973b0a613d5b410f3a9dcf6a71c;hp=9fd7285dc9fe0f8b4dd4eadc0fb255b2c30e184c;hpb=cb5a93cd63fc4cc1453502a7f4cb02ff388c106c;p=citadel.git diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c index 9fd7285dc..d04959865 100644 --- a/webcit/msg_renderers.c +++ b/webcit/msg_renderers.c @@ -329,6 +329,7 @@ void examine_msgn(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) CheckConvertBufs(WCC); FreeStrBuf(&Msg->reply_inreplyto); Msg->reply_inreplyto = NewStrBufPlain(NULL, StrLength(HdrLine)); + Msg->reply_inreplyto_hash = ThreadIdHash(HdrLine); StrBuf_RFC822_2_Utf8(Msg->reply_inreplyto, HdrLine, WCC->DefaultCharset, @@ -355,6 +356,7 @@ void examine_wefw(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset) CheckConvertBufs(WCC); FreeStrBuf(&Msg->reply_references); Msg->reply_references = NewStrBufPlain(NULL, StrLength(HdrLine)); + Msg->reply_references_hash = ThreadIdHash(HdrLine); StrBuf_RFC822_2_Utf8(Msg->reply_references, HdrLine, WCC->DefaultCharset, @@ -596,7 +598,7 @@ void render_MAIL(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset) Mime->Data = NewStrBufPlain(NULL, Mime->length); else FlushStrBuf(Mime->Data); - read_message(Mime->Data, HKEY("view_submessage"), Mime->msgnum, Mime->PartNum, &TemplateMime); + read_message(Mime->Data, HKEY("view_submessage"), Mime->msgnum, Mime->PartNum, &TemplateMime, TP); /* if ( (!IsEmptyStr(mime_submessages)) && (!section[0]) ) { for (i=0; iData) == 0) - MimeLoadData(Mime); - if (StrLength(Mime->Data) > 0) { - StrBuf *Buf; - Buf = NewStrBuf(); - /** If it's my vCard I can edit it */ - if ( (!strcasecmp(ChrPtr(WCC->CurRoom.name), USERCONFIGROOM)) - || (!strcasecmp(&(ChrPtr(WCC->CurRoom.name)[11]), USERCONFIGROOM)) - || (WC->CurRoom.view == VIEW_ADDRESSBOOK) - ) { - StrBufAppendPrintf(Buf, "", - Mime->msgnum, ChrPtr(Mime->PartNum)); - StrBufAppendPrintf(Buf, "[%s]", _("edit")); - } - - /* In all cases, display the full card */ - display_vcard(Buf, Mime, 0, 1, NULL, -1); - FreeStrBuf(&Mime->Data); - Mime->Data = Buf; - } - -} - void render_MIME_ICS(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCharset) { wc_mime_attachment *Mime = (wc_mime_attachment *) CTX(CTX_MIME_ATACH); @@ -877,6 +852,43 @@ void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCh } } + +int ReadOneMessageSummary(message_summary *Msg, StrBuf *FoundCharset, StrBuf *Buf) +{ + void *vHdr; + headereval *Hdr; + const char *buf; + const char *ebuf; + int nBuf; + long len; + + serv_printf("MSG0 %ld|1", Msg->msgnum); /* ask for headers only */ + + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 1) { + return 0; + } + + while (len = StrBuf_ServGetln(Buf), + (len >= 0) && + ((len != 3) || + strcmp(ChrPtr(Buf), "000"))) + { + buf = ChrPtr(Buf); + ebuf = strchr(ChrPtr(Buf), '='); + nBuf = ebuf - buf; + + if (GetHash(MsgHeaderHandler, buf, nBuf, &vHdr) && + (vHdr != NULL)) { + Hdr = (headereval*)vHdr; + StrBufCutLeft(Buf, nBuf + 1); + Hdr->evaluator(Msg, Buf, FoundCharset); + } + else syslog(LOG_INFO, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf)); + } + return 1; +} + void tmplput_MAIL_SUMM_N(StrBuf *Target, WCTemplputParams *TP) { message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM); @@ -887,12 +899,20 @@ void tmplput_MAIL_SUMM_N(StrBuf *Target, WCTemplputParams *TP) void tmplput_MAIL_SUMM_PERMALINK(StrBuf *Target, WCTemplputParams *TP) { message_summary *Msg = (message_summary*) CTX(CTX_MAILSUM); - char perma_link[1024]; - - strcpy(perma_link, "/readfwd?go="); - urlesc(&perma_link[12], sizeof(perma_link) - 12, (char *)ChrPtr(WC->CurRoom.name) ); - sprintf(&perma_link[strlen(perma_link)], "?start_reading_at=%ld#%ld", Msg->msgnum, Msg->msgnum); - StrBufAppendPrintf(Target, "%s", perma_link); + StrBuf *perma_link; + const StrBuf *View; + + perma_link = NewStrBufPlain(HKEY("/readfwd?go=")); + StrBufUrlescAppend(perma_link, WC->CurRoom.name, NULL); + View = sbstr("view"); + if (View != NULL) { + StrBufAppendBufPlain(perma_link, HKEY("?view="), 0); + StrBufAppendBuf(perma_link, View, 0); + } + StrBufAppendBufPlain(perma_link, HKEY("?start_reading_at="), 0); + StrBufAppendPrintf(perma_link, "%ld#%ld", Msg->msgnum, Msg->msgnum); + StrBufAppendBuf(Target, perma_link, 0); + FreeStrBuf(&perma_link); } @@ -928,7 +948,7 @@ void tmplput_QUOTED_MAIL_BODY(StrBuf *Target, WCTemplputParams *TP) MsgNum = LBstr(TKEY(0)); Buf = NewStrBuf(); - read_message(Buf, HKEY("view_message_replyquote"), MsgNum, NULL, &Mime); + read_message(Buf, HKEY("view_message_replyquote"), MsgNum, NULL, &Mime, TP); StrBufAppendTemplate(Target, TP, Buf, 1); FreeStrBuf(&Buf); } @@ -941,7 +961,7 @@ void tmplput_EDIT_MAIL_BODY(StrBuf *Target, WCTemplputParams *TP) MsgNum = LBstr(TKEY(0)); Buf = NewStrBuf(); - read_message(Buf, HKEY("view_message_edit"), MsgNum, NULL, &Mime); + read_message(Buf, HKEY("view_message_edit"), MsgNum, NULL, &Mime, TP); StrBufAppendTemplate(Target, TP, Buf, 1); FreeStrBuf(&Buf); } @@ -964,7 +984,7 @@ void tmplput_EDIT_WIKI_BODY(StrBuf *Target, WCTemplputParams *TP) free(wikipage); if (msgnum >= 0L) { Buf = NewStrBuf(); - read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime); + read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime, TP); StrBufAppendTemplate(Target, TP, Buf, 1); FreeStrBuf(&Buf); } @@ -1168,7 +1188,6 @@ void render_MAIL_markdown(StrBuf *Target, WCTemplputParams *TP, StrBuf *FoundCha FreeStrBuf(&Mime->Data); Mime->Data = NewStrBufPlain(md_as_html, -1); } -// free(md_as_html); mkd_cleanup(doc); } } @@ -1355,182 +1374,12 @@ readloop_struct rlid[] = { }; -int ParseMessageListHeaders_Detail(StrBuf *Line, - const char **pos, - message_summary *Msg, - StrBuf *ConversionBuffer) -{ - wcsession *WCC = WC; - long len; - long totallen; - - CheckConvertBufs(WCC); - - totallen = StrLength(Line); - Msg->from = NewStrBufPlain(NULL, totallen); - len = StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|'); - if (len > 0) { - /* Handle senders with RFC2047 encoding */ - StrBuf_RFC822_2_Utf8(Msg->from, - ConversionBuffer, - WCC->DefaultCharset, - NULL, - WCC->ConvertBuf1, - WCC->ConvertBuf2); - } - - /* node name */ - len = StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|'); - if ((len > 0 ) && - ( ((WCC->CurRoom.QRFlags & QR_NETWORK) - || ((strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_nodename)) - && (strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_fqdn)))))))) - { - StrBufAppendBufPlain(Msg->from, HKEY(" @ "), 0); - StrBufAppendBuf(Msg->from, ConversionBuffer, 0); - } - - /* Internet address (not used) - * StrBufExtract_token(Msg->inetaddr, Line, 4, '|'); - */ - StrBufSkip_NTokenS(Line, pos, '|', 1); - Msg->subj = NewStrBufPlain(NULL, totallen); - - FlushStrBuf(ConversionBuffer); - /* we assume the subject is the last parameter inside of the list; - * thus we don't use the tokenizer to fetch it, since it will hick up - * on tokenizer chars inside of the subjects - StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|'); - */ - len = 0; - if (*pos != StrBufNOTNULL) { - len = totallen - (*pos - ChrPtr(Line)); - StrBufPlain(ConversionBuffer, *pos, len); - *pos = StrBufNOTNULL; - if ((len > 0) && - (*(ChrPtr(ConversionBuffer) + len - 1) == '|')) - StrBufCutRight(ConversionBuffer, 1); - } - - if (len == 0) - StrBufAppendBufPlain(Msg->subj, _("(no subject)"), -1,0); - else { - StrBuf_RFC822_2_Utf8(Msg->subj, - ConversionBuffer, - WCC->DefaultCharset, - NULL, - WCC->ConvertBuf1, - WCC->ConvertBuf2); - } - - return 1; -} - - -int mailview_GetParamsGetServerCall(SharedMessageStatus *Stat, - void **ViewSpecific, - long oper, - char *cmd, - long len, - char *filter, - long flen) -{ - DoTemplate(HKEY("msg_listview"),NULL,&NoCtx); - - return 200; -} - -int mailview_Cleanup(void **ViewSpecific) -{ - /* Note: wDumpContent() will output one additional tag. */ - /* We ought to move this out into template */ - wDumpContent(1); - - return 0; -} - - -int json_GetParamsGetServerCall(SharedMessageStatus *Stat, - void **ViewSpecific, - long oper, - char *cmd, - long len, - char *filter, - long flen) -{ - Stat->defaultsortorder = 2; - Stat->sortit = 1; - Stat->load_seen = 1; - /* Generally using maxmsgs|startmsg is not required - in mailbox view, but we have a 'safemode' for clients - (*cough* Exploder) that simply can't handle too many */ - if (havebstr("maxmsgs")) Stat->maxmsgs = ibstr("maxmsgs"); - else Stat->maxmsgs = 9999999; - if (havebstr("startmsg")) Stat->startmsg = lbstr("startmsg"); - snprintf(cmd, len, "MSGS %s|%s||1", - (oper == do_search) ? "SEARCH" : "ALL", - (oper == do_search) ? bstr("query") : "" - ); - - return 200; -} -int json_MessageListHdr(SharedMessageStatus *Stat, void **ViewSpecific) -{ - /* TODO: make a generic function */ - hprintf("HTTP/1.1 200 OK\r\n"); - hprintf("Content-type: application/json; charset=utf-8\r\n"); - hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)); - hprintf("Connection: close\r\n"); - hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n"); - begin_burst(); - return 0; -} - -int json_RenderView_or_Tail(SharedMessageStatus *Stat, - void **ViewSpecific, - long oper) -{ - DoTemplate(HKEY("mailsummary_json"),NULL, NULL); - - return 0; -} - -int json_Cleanup(void **ViewSpecific) -{ - /* Note: wDumpContent() will output one additional tag. */ - /* We ought to move this out into template */ - end_burst(); - - return 0; -} - - - void InitModule_MSGRENDERERS (void) { RegisterCTX(CTX_MAILSUM); RegisterCTX(CTX_MIME_ATACH); - RegisterReadLoopHandlerset( - VIEW_MAILBOX, - mailview_GetParamsGetServerCall, - NULL, /* TODO: is this right? */ - NULL, - ParseMessageListHeaders_Detail, - NULL, - NULL, - mailview_Cleanup); - - RegisterReadLoopHandlerset( - VIEW_JSON_LIST, - json_GetParamsGetServerCall, - json_MessageListHdr, - NULL, /* TODO: is this right? */ - ParseMessageListHeaders_Detail, - NULL, - json_RenderView_or_Tail, - json_Cleanup); RegisterSortFunc(HKEY("date"), NULL, 0, @@ -1625,8 +1474,6 @@ InitModule_MSGRENDERERS /* mime renderers translate an attachment into webcit viewable html text */ RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL, 0, 150); - RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard, 1, 201); - RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard, 1, 200); //* RegisterMimeRenderer(HKEY("text/calendar"), render_MIME_ICS, 1, 501); RegisterMimeRenderer(HKEY("application/ics"), render_MIME_ICS, 1, 500);