// // This will search a string bundle (eventually) to find a descriptive header // name to match what was found in the mail message. aHeaderName is passed in // in all caps and a dropback default name is provided. The caller needs to free // the memory returned by this function. // char * nsMimeBaseEmitter::LocalizeHeaderName(const char *aHeaderName, const char *aDefaultName) { char *retVal = nullptr; // prefer to use translated strings if not for quoting if (mFormat != nsMimeOutput::nsMimeMessageQuoting && mFormat != nsMimeOutput::nsMimeMessageBodyQuoting) { // map name to id and get the translated string int32_t id = MapHeaderNameToID(aHeaderName); if (id > 0) retVal = MimeGetStringByID(id); } // get the string from the other bundle (usually not translated) if (!retVal) retVal = MimeGetStringByName(aHeaderName); if (retVal) return retVal; else return strdup(aDefaultName); }
static int MimeExternalBody_parse_eof (MimeObject *obj, bool abort_p) { int status = 0; MimeExternalBody *bod = (MimeExternalBody *) obj; if (obj->closed_p) return 0; /* Run parent method first, to flush out any buffered data. */ status = ((MimeObjectClass*)&MIME_SUPERCLASS)->parse_eof(obj, abort_p); if (status < 0) return status; #ifdef XP_MACOSX if (obj->parent && mime_typep(obj->parent, (MimeObjectClass*) &mimeMultipartAppleDoubleClass)) goto done; #endif /* XP_MACOSX */ if (!abort_p && obj->output_p && obj->options && obj->options->write_html_p) { bool all_headers_p = obj->options->headers == MimeHeadersAll; MimeDisplayOptions *newopt = obj->options; /* copy it */ char *ct = MimeHeaders_get(obj->headers, HEADER_CONTENT_TYPE, PR_FALSE, PR_FALSE); char *at, *lexp, *size, *perm; char *url, *dir, *mode, *name, *site, *svr, *subj; char *h = 0, *lname = 0, *lurl = 0, *body = 0; MimeHeaders *hdrs = 0; if (!ct) return MIME_OUT_OF_MEMORY; at = MimeHeaders_get_parameter(ct, "access-type", NULL, NULL); lexp = MimeHeaders_get_parameter(ct, "expiration", NULL, NULL); size = MimeHeaders_get_parameter(ct, "size", NULL, NULL); perm = MimeHeaders_get_parameter(ct, "permission", NULL, NULL); dir = MimeHeaders_get_parameter(ct, "directory", NULL, NULL); mode = MimeHeaders_get_parameter(ct, "mode", NULL, NULL); name = MimeHeaders_get_parameter(ct, "name", NULL, NULL); site = MimeHeaders_get_parameter(ct, "site", NULL, NULL); svr = MimeHeaders_get_parameter(ct, "server", NULL, NULL); subj = MimeHeaders_get_parameter(ct, "subject", NULL, NULL); url = MimeHeaders_get_parameter(ct, "url", NULL, NULL); PR_FREEIF(ct); /* the *internal* content-type */ ct = MimeHeaders_get(bod->hdrs, HEADER_CONTENT_TYPE, PR_TRUE, PR_FALSE); PRUint32 hlen = ((at ? strlen(at) : 0) + (lexp ? strlen(lexp) : 0) + (size ? strlen(size) : 0) + (perm ? strlen(perm) : 0) + (dir ? strlen(dir) : 0) + (mode ? strlen(mode) : 0) + (name ? strlen(name) : 0) + (site ? strlen(site) : 0) + (svr ? strlen(svr) : 0) + (subj ? strlen(subj) : 0) + (ct ? strlen(ct) : 0) + (url ? strlen(url) : 0) + 100); h = (char *) PR_MALLOC(hlen); if (!h) { status = MIME_OUT_OF_MEMORY; goto FAIL; } /* If there's a URL parameter, remove all whitespace from it. (The URL parameter to one of these headers is stored with lines broken every 40 characters or less; it's assumed that all significant whitespace was URL-hex-encoded, and all the rest of it was inserted just to keep the lines short.) */ if (url) { char *in, *out; for (in = url, out = url; *in; in++) if (!IS_SPACE(*in)) *out++ = *in; *out = 0; } hdrs = MimeHeaders_new(); if (!hdrs) { status = MIME_OUT_OF_MEMORY; goto FAIL; } # define FROB(STR,VAR) \ if (VAR) \ { \ PL_strncpyz(h, STR ": ", hlen); \ PL_strcatn(h, hlen, VAR); \ PL_strcatn(h, hlen, MSG_LINEBREAK); \ status = MimeHeaders_parse_line(h, strlen(h), hdrs); \ if (status < 0) goto FAIL; \ } FROB("Access-Type", at); FROB("URL", url); FROB("Site", site); FROB("Server", svr); FROB("Directory", dir); FROB("Name", name); FROB("Type", ct); FROB("Size", size); FROB("Mode", mode); FROB("Permission", perm); FROB("Expiration", lexp); FROB("Subject", subj); # undef FROB PL_strncpyz(h, MSG_LINEBREAK, hlen); status = MimeHeaders_parse_line(h, strlen(h), hdrs); if (status < 0) goto FAIL; lurl = MimeExternalBody_make_url(ct, at, lexp, size, perm, dir, mode, name, url, site, svr, subj, bod->body); if (lurl) { lname = MimeGetStringByID(MIME_MSG_LINK_TO_DOCUMENT); } else { lname = MimeGetStringByID(MIME_MSG_DOCUMENT_INFO); all_headers_p = PR_TRUE; } all_headers_p = PR_TRUE; /* #### just do this all the time? */ if (bod->body && all_headers_p) { char *s = bod->body; while (IS_SPACE(*s)) s++; if (*s) { char *s2; const char *pre = "<P><PRE>"; const char *suf = "</PRE>"; PRInt32 i; for(i = strlen(s)-1; i >= 0 && IS_SPACE(s[i]); i--) s[i] = 0; s2 = MsgEscapeHTML(s); if (!s2) goto FAIL; body = (char *) PR_MALLOC(strlen(pre) + strlen(s2) + strlen(suf) + 1); if (!body) { NS_Free(s2); goto FAIL; } PL_strcpy(body, pre); PL_strcat(body, s2); PL_strcat(body, suf); } } newopt->fancy_headers_p = PR_TRUE; newopt->headers = (all_headers_p ? MimeHeadersAll : MimeHeadersSome); FAIL: if (hdrs) MimeHeaders_free(hdrs); PR_FREEIF(h); PR_FREEIF(lname); PR_FREEIF(lurl); PR_FREEIF(body); PR_FREEIF(ct); PR_FREEIF(at); PR_FREEIF(lexp); PR_FREEIF(size); PR_FREEIF(perm); PR_FREEIF(dir); PR_FREEIF(mode); PR_FREEIF(name); PR_FREEIF(url); PR_FREEIF(site); PR_FREEIF(svr); PR_FREEIF(subj); } #ifdef XP_MACOSX done: #endif return status; }
static char * MimeMessage_partial_message_html(const char *data, void *closure, MimeHeaders *headers) { MimeMessage *msg = (MimeMessage *)closure; nsCAutoString orig_url(data); char *uidl = MimeHeaders_get(headers, HEADER_X_UIDL, PR_FALSE, PR_FALSE); char *msgId = MimeHeaders_get(headers, HEADER_MESSAGE_ID, PR_FALSE, PR_FALSE); char *msgIdPtr = PL_strstr(msgId, "<"); int msgBase; PRInt32 pos = orig_url.Find("mailbox-message"); if (pos != -1) orig_url.Cut(pos + 7, 8); pos = orig_url.Find("#"); if (pos != -1) orig_url.Replace(pos, 1, "?number=", 8); if (msgIdPtr) msgIdPtr++; else msgIdPtr = msgId; char *gtPtr = PL_strstr(msgIdPtr, ">"); if (gtPtr) *gtPtr = 0; msgBase = (msg->bodyLength > MSG_LINEBREAK_LEN) ? MIME_MSG_PARTIAL_FMT_1 : MIME_MSG_PARTIAL_FMT2_1; nsCString partialMsgHtml; nsCString item; item.Adopt(MimeGetStringByID(msgBase)); partialMsgHtml += item; item.Adopt(MimeGetStringByID(msgBase+1)); partialMsgHtml += item; partialMsgHtml.Append(orig_url); if (msgIdPtr) { partialMsgHtml.AppendLiteral("&messageid="); MsgEscapeString(nsDependentCString(msgIdPtr), nsINetUtil::ESCAPE_URL_PATH, item); partialMsgHtml.Append(item); } if (uidl) { partialMsgHtml.AppendLiteral("&uidl="); MsgEscapeString(nsDependentCString(uidl), nsINetUtil::ESCAPE_XALPHAS, item); partialMsgHtml.Append(item); } item.Adopt(MimeGetStringByID(msgBase+2)); partialMsgHtml += item; return ToNewCString(partialMsgHtml); }
static int MimeExternalObject_parse_begin (MimeObject *obj) { int status; status = ((MimeObjectClass*)&MIME_SUPERCLASS)->parse_begin(obj); if (status < 0) return status; // If we're writing this object, and we're doing it in raw form, then // now is the time to inform the backend what the type of this data is. // if (obj->output_p && obj->options && !obj->options->write_html_p && !obj->options->state->first_data_written_p) { status = MimeObject_output_init(obj, 0); if (status < 0) return status; NS_ASSERTION(obj->options->state->first_data_written_p, "1.1 <*****@*****.**> 19 Mar 1999 12:00"); } // // If we're writing this object as HTML, do all the work now -- just write // out a table with a link in it. (Later calls to the `parse_buffer' method // will simply discard the data of the object itself.) // if (obj->options && obj->output_p && obj->options->write_html_p && obj->options->output_fn) { MimeDisplayOptions newopt = *obj->options; // copy it char *id = 0; char *id_url = 0; char *id_name = 0; nsCString id_imap; PRBool all_headers_p = obj->options->headers == MimeHeadersAll; id = mime_part_address (obj); if (obj->options->missing_parts) id_imap.Adopt(mime_imap_part_address (obj)); if (! id) return MIME_OUT_OF_MEMORY; if (obj->options && obj->options->url) { const char *url = obj->options->url; if (!id_imap.IsEmpty() && id) { // if this is an IMAP part. id_url = mime_set_url_imap_part(url, id_imap.get(), id); } else { // This is just a normal MIME part as usual. id_url = mime_set_url_part(url, id, PR_TRUE); } if (!id_url) { PR_Free(id); return MIME_OUT_OF_MEMORY; } } if (!strcmp (id, "0")) { PR_Free(id); id = MimeGetStringByID(MIME_MSG_ATTACHMENT); } else { const char *p = "Part "; PRUint32 slen = strlen(p) + strlen(id) + 1; char *s = (char *)PR_MALLOC(slen); if (!s) { PR_Free(id); PR_Free(id_url); return MIME_OUT_OF_MEMORY; } // we have a valid id if (id) id_name = mime_find_suggested_name_of_part(id, obj); PL_strncpyz(s, p, slen); PL_strcatn(s, slen, id); PR_Free(id); id = s; } if (all_headers_p && // Don't bother showing all headers on this part if it's the only // part in the message: in that case, we've already shown these // headers. obj->options->state && obj->options->state->root == obj->parent) all_headers_p = PR_FALSE; newopt.fancy_headers_p = PR_TRUE; newopt.headers = (all_headers_p ? MimeHeadersAll : MimeHeadersSome); /****** RICHIE SHERRY GOTTA STILL DO THIS FOR QUOTING! status = MimeHeaders_write_attachment_box (obj->headers, &newopt, obj->content_type, obj->encoding, id_name? id_name : id, id_url, 0) *****/ // obj->options really owns the storage for this. newopt.part_to_load = nsnull; newopt.default_charset = nsnull; PR_FREEIF(id); PR_FREEIF(id_url); PR_FREEIF(id_name); if (status < 0) return status; } return 0; }