/*----------------------------------------------------------------------------*/
-void examine_nhdr(message_summary *Msg, StrBuf *HdrLine)
+void examine_nhdr(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
Msg->nhdr = 0;
if (!strncasecmp(ChrPtr(HdrLine), "yes", 8))
Msg->nhdr = 1;
}
-void examine_type(message_summary *Msg, StrBuf *HdrLine)
+void examine_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
Msg->format_type = StrToi(HdrLine);
}
-void examine_from(message_summary *Msg, StrBuf *HdrLine)
+void examine_from(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->from);
Msg->from = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->from, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->from, HdrLine, WC->DefaultCharset, FoundCharset);
}
void tmplput_MAIL_SUMM_FROM(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
{
-void examine_subj(message_summary *Msg, StrBuf *HdrLine)
+void examine_subj(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->subj);
Msg->subj = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->subj, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->subj, HdrLine, WC->DefaultCharset, FoundCharset);
lprintf(1,"%s", ChrPtr(Msg->subj));
}
void tmplput_MAIL_SUMM_SUBJECT(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
}
-void examine_msgn(message_summary *Msg, StrBuf *HdrLine)
+void examine_msgn(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->reply_inreplyto);
Msg->reply_inreplyto = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->reply_inreplyto, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->reply_inreplyto, HdrLine, WC->DefaultCharset, FoundCharset);
}
void tmplput_MAIL_SUMM_INREPLYTO(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
{
}
-void examine_wefw(message_summary *Msg, StrBuf *HdrLine)
+void examine_wefw(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->reply_references);
Msg->reply_references = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->reply_references, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->reply_references, HdrLine, WC->DefaultCharset, FoundCharset);
}
void tmplput_MAIL_SUMM_REFIDS(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
{
}
-void examine_cccc(message_summary *Msg, StrBuf *HdrLine)
+void examine_cccc(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->cccc);
Msg->cccc = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->cccc, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->cccc, HdrLine, WC->DefaultCharset, FoundCharset);
if (Msg->AllRcpt == NULL)
Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
if (StrLength(Msg->AllRcpt) > 0) {
-void examine_room(message_summary *Msg, StrBuf *HdrLine)
+void examine_room(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
if ((StrLength(HdrLine) > 0) &&
(strcasecmp(ChrPtr(HdrLine), WC->wc_roomname))) {
}
-void examine_rfca(message_summary *Msg, StrBuf *HdrLine)
+void examine_rfca(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->Rfca);
Msg->Rfca = NewStrBufDup(HdrLine);
}
-void examine_node(message_summary *Msg, StrBuf *HdrLine)
+void examine_node(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
if ( (StrLength(HdrLine) > 0) &&
((WC->room_flags & QR_NETWORK)
}
-void examine_rcpt(message_summary *Msg, StrBuf *HdrLine)
+void examine_rcpt(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->to);
Msg->to = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->to, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->to, HdrLine, WC->DefaultCharset, FoundCharset);
if (Msg->AllRcpt == NULL)
Msg->AllRcpt = NewStrBufPlain(NULL, StrLength(HdrLine));
if (StrLength(Msg->AllRcpt) > 0) {
-void examine_time(message_summary *Msg, StrBuf *HdrLine)
+void examine_time(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
Msg->date = StrTol(HdrLine);
}
-void examine_mime_part(message_summary *Msg, StrBuf *HdrLine)
+void examine_mime_part(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
wc_mime_attachment *mime;
StrBuf *Buf;
mime->Name = NewStrBuf();
StrBufExtract_token(mime->Name, HdrLine, 0, '|');
StrBufExtract_token(Buf, HdrLine, 1, '|');
- StrBuf_RFC822_to_Utf8(mime->FileName, Buf, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(mime->FileName, Buf, WC->DefaultCharset, FoundCharset);
mime->PartNum = NewStrBuf();
StrBufExtract_token(mime->PartNum, HdrLine, 2, '|');
mime->Disposition = NewStrBuf();
-void examine_hnod(message_summary *Msg, StrBuf *HdrLine)
+void examine_hnod(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
FreeStrBuf(&Msg->hnod);
Msg->hnod = NewStrBufPlain(NULL, StrLength(HdrLine));
- StrBuf_RFC822_to_Utf8(Msg->hnod, HdrLine, WC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->hnod, HdrLine, WC->DefaultCharset, FoundCharset);
}
void tmplput_MAIL_SUMM_H_NODE(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
{
-void examine_text(message_summary *Msg, StrBuf *HdrLine)
+void examine_text(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{////TODO: read messages here
Msg->MsgBody.Data = NewStrBuf();
}
-void examine_msg4_partnum(message_summary *Msg, StrBuf *HdrLine)
+void examine_msg4_partnum(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
Msg->MsgBody.PartNum = NewStrBufDup(HdrLine);
StrBufTrim(Msg->MsgBody.PartNum);/////TODO: striplt == trim?
}
-void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine)
+void examine_content_encoding(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
////TODO: do we care?
}
-void examine_content_lengh(message_summary *Msg, StrBuf *HdrLine)
+void examine_content_lengh(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
Msg->MsgBody.length = StrTol(HdrLine);
Msg->MsgBody.size_known = 1;
}
-void examine_content_type(message_summary *Msg, StrBuf *HdrLine)
+void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{////TODO
int len, i;
Msg->MsgBody.ContentType = NewStrBufDup(HdrLine);
}
-void render_MAIL_variformat(wc_mime_attachment *Mime, StrBuf *RawData)
+void render_MAIL_variformat(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
{
/* Messages in legacy Citadel variformat get handled thusly... */
StrBuf *Target = NewStrBufPlain(NULL, StrLength(Mime->Data));
Mime->Data = Target;
}
-void render_MAIL_text_plain(wc_mime_attachment *Mime, StrBuf *RawData)
+void render_MAIL_text_plain(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
{
+ StrBuf *cs = NULL;
const char *ptr, *pte;
const char *BufPtr = NULL;
StrBuf *Line = NewStrBuf();
#ifdef HAVE_ICONV
if (ConvertIt) {
- ctdl_iconv_open("UTF-8", ChrPtr(Mime->Charset), &ic);
- if (ic == (iconv_t)(-1) ) {
- lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
- __FILE__, __LINE__, ChrPtr(Mime->Charset), strerror(errno));
+ if (StrLength(Mime->Charset) != 0)
+ cs = Mime->Charset;
+ else if (StrLength(FoundCharset) > 0)
+ cs = FoundCharset;
+ else if (StrLength(WC->DefaultCharset) > 0)
+ cs = WC->DefaultCharset;
+ if (cs == 0) {
+ ConvertIt = 0;
+ }
+ else {
+ ctdl_iconv_open("UTF-8", ChrPtr(cs), &ic);
+ if (ic == (iconv_t)(-1) ) {
+ lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
+ __FILE__, __LINE__, ChrPtr(Mime->Charset), strerror(errno));
+ }
}
}
#endif
StrBufAppendBufPlain(Target, HKEY("<blockquote>"), 0);
for (i = bq; i < bn; i++)
StrBufAppendBufPlain(Target, HKEY("</blockquote>"), 0);
-
+
+ if (ConvertIt == 1) {
+ StrBufConvert(Line, Line1, &ic);
+ }
+
StrBufAppendBufPlain(Target, HKEY("<tt>"), 0);
UrlizeText(Line1, Line, Line2);
FreeStrBuf(&Line2);
}
-void render_MAIL_html(wc_mime_attachment *Mime, StrBuf *RawData)
+void render_MAIL_html(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
{
StrBuf *Buf;
/* HTML is fun, but we've got to strip it first */
Mime->Data = Buf;
}
-void render_MAIL_UNKNOWN(wc_mime_attachment *Mime, StrBuf *RawData)
+void render_MAIL_UNKNOWN(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
{
/* Unknown weirdness */
FlushStrBuf(Mime->Data);
struct wcsession *WCC = WC;
StrBuf *Buf;
StrBuf *Token;
+ StrBuf *FoundCharset;
message_summary *Msg;
headereval *Hdr;
void *vHdr;
Token = NewStrBuf();
Msg = (message_summary *)malloc(sizeof(message_summary));
memset(Msg, 0, sizeof(message_summary));
-
+ FoundCharset = NewStrBuf();
while ((StrBuf_ServGetln(Buf)>=0) && !Done) {
if ( (StrLength(Buf)==3) &&
!strcmp(ChrPtr(Buf), "000"))
FreeStrBuf(&Buf);
FreeStrBuf(&Token);
DestroyMessageSummary(Msg);
+ FreeStrBuf(&FoundCharset);
return;
}
else {
if (GetHash(MsgHeaderHandler, SKEY(Token), &vHdr) &&
(vHdr != NULL)) {
Hdr = (headereval*)vHdr;
- Hdr->evaluator(Msg, Buf);
+ Hdr->evaluator(Msg, Buf, FoundCharset);
if (Hdr->Type == 1) {
state++;
}
if (GetHash(MsgHeaderHandler, SKEY(Token), &vHdr) &&
(vHdr != NULL)) {
Hdr = (headereval*)vHdr;
- Hdr->evaluator(Msg, Buf);
+ Hdr->evaluator(Msg, Buf, FoundCharset);
}
break;
}
(vHdr != NULL)) {
RenderMimeFunc Render;
Render = (RenderMimeFunc)vHdr;
- Render(&Msg->MsgBody, NULL);
+ Render(&Msg->MsgBody, NULL, FoundCharset);
}
StrBuf *tmp;
tmp = Msg->cccc;
Msg->cccc = Buf;
- StrBuf_RFC822_to_Utf8(Msg->cccc, tmp, WCC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->cccc, tmp, WCC->DefaultCharset, FoundCharset);
Buf = tmp;
}
if (StrLength(Msg->subj)> 0) {
StrBuf *tmp;
tmp = Msg->subj;
Msg->subj = Buf;
- StrBuf_RFC822_to_Utf8(Msg->subj, tmp, WCC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->subj, tmp, WCC->DefaultCharset, FoundCharset);
Buf = tmp;
}
if (num_attach_links > 0) {
free(attach_links);
}
-
+ FreeStrBuf(&FoundCharset);
}
*/
int load_msg_ptrs(char *servcmd, int with_headers)
{
+ StrBuf* FoundCharset = NULL;
struct wcsession *WCC = WC;
message_summary *Msg;
StrBuf *Buf, *Buf2;
StrBufExtract_token(Buf2, Buf, 2, '|');
if (StrLength(Buf2) != 0) {
/** Handle senders with RFC2047 encoding */
- StrBuf_RFC822_to_Utf8(Msg->from, Buf2, WCC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->from, Buf2, WCC->DefaultCharset, FoundCharset);
}
/** Nodename */
if (StrLength(Buf2) == 0)
StrBufAppendBufPlain(Msg->subj, _("(no subj)"), 0, -1);
else {
- StrBuf_RFC822_to_Utf8(Msg->subj, Buf2, WCC->DefaultCharset);
+ StrBuf_RFC822_to_Utf8(Msg->subj, Buf2, WCC->DefaultCharset, FoundCharset);
if ((StrLength(Msg->subj) > 75) &&
(StrBuf_Utf8StrLen(Msg->subj) > 75)) {
StrBuf_Utf8StrCut(Msg->subj, 72);