From 8a586a7ce525df976cda0ba61ce84e55c080fdfa Mon Sep 17 00:00:00 2001 From: "rhp%netscape.com" Date: Mon, 17 Jan 2000 23:24:04 +0000 Subject: [PATCH] Fix for multiple replacement of HTML entities - Bug #: 23904 - r: jefft git-svn-id: svn://10.0.0.236/trunk@58046 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/mailnews/compose/src/nsMsgCompose.cpp | 70 +++++++++++-------- mozilla/mailnews/compose/src/nsMsgCompose.h | 2 + 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/mozilla/mailnews/compose/src/nsMsgCompose.cpp b/mozilla/mailnews/compose/src/nsMsgCompose.cpp index b1b8150084f..f510badcf71 100644 --- a/mozilla/mailnews/compose/src/nsMsgCompose.cpp +++ b/mozilla/mailnews/compose/src/nsMsgCompose.cpp @@ -90,6 +90,7 @@ nsMsgCompose::nsMsgCompose() { NS_INIT_REFCNT(); + mEntityConversionDone = PR_FALSE; mQuotingToFollow = PR_FALSE; mWhatHolder = 1; // RICHIE - hack for old quoting mQuoteURI = ""; @@ -515,20 +516,24 @@ nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, PRInt32 bodyLength; char *attachment1_type = TEXT_HTML; // we better be "text/html" at this point - // Convert body to mail charset - char *outCString; - nsString aCharset = m_compFields->GetCharacterSet(); - - if (aCharset != "") + if (!mEntityConversionDone) { - // Apply entity conversion then convert to a mail charset. - char charset[65]; - rv = nsMsgI18NSaveAsCharset(attachment1_type, aCharset.ToCString(charset, 65), - nsString(bodyString).GetUnicode(), &outCString); - if (NS_SUCCEEDED(rv)) + // Convert body to mail charset + char *outCString; + nsString aCharset = m_compFields->GetCharacterSet(); + + if ( aCharset != "") { - bodyString = outCString; - newBody = PR_TRUE; + // Apply entity conversion then convert to a mail charset. + char charset[65]; + rv = nsMsgI18NSaveAsCharset(attachment1_type, aCharset.ToCString(charset, 65), + nsString(bodyString).GetUnicode(), &outCString); + if (NS_SUCCEEDED(rv)) + { + bodyString = outCString; + newBody = PR_TRUE; + mEntityConversionDone = PR_TRUE; + } } } @@ -640,24 +645,28 @@ nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, flags |= nsIDocumentEncoder::OutputFormatFlowed; } - rv = m_editor->GetContentsAs(format.GetUnicode(), flags, &bodyText); - - if (NS_SUCCEEDED(rv) && NULL != bodyText) + if (!mEntityConversionDone) { - msgBody = bodyText; - nsAllocator::Free(bodyText); + rv = m_editor->GetContentsAs(format.GetUnicode(), flags, &bodyText); + + if (NS_SUCCEEDED(rv) && NULL != bodyText) + { + msgBody = bodyText; + nsAllocator::Free(bodyText); - // Convert body to mail charset not to utf-8 (because we don't manipulate body text) - char *outCString = NULL; - rv = nsMsgI18NSaveAsCharset(contentType, m_compFields->GetCharacterSet(), - msgBody.GetUnicode(), &outCString); - if (NS_SUCCEEDED(rv) && NULL != outCString) - { - m_compFields->SetBody(outCString); - PR_Free(outCString); - } - else - m_compFields->SetBody(nsAutoCString(msgBody)); + // Convert body to mail charset not to utf-8 (because we don't manipulate body text) + char *outCString = NULL; + rv = nsMsgI18NSaveAsCharset(contentType, m_compFields->GetCharacterSet(), + msgBody.GetUnicode(), &outCString); + if (NS_SUCCEEDED(rv) && NULL != outCString) + { + mEntityConversionDone = PR_TRUE; + m_compFields->SetBody(outCString); + PR_Free(outCString); + } + else + m_compFields->SetBody(nsAutoCString(msgBody)); + } } } @@ -1250,11 +1259,12 @@ NS_IMETHODIMP QuotingOutputStreamListener::OnDataAvailable(nsIChannel * /* aChan u = nsTextFormatter::smprintf(fmt.GetUnicode(), newBuf); // this converts UTF-8 to UCS-2 if (u) { - mMsgBody.Append(u); + PRInt32 newLen = nsCRT::strlen(u); + mMsgBody.Append(u, newLen); PR_FREEIF(u); } else - mMsgBody += newBuf; + mMsgBody.Append(newBuf, numWritten); } PR_FREEIF(newBuf); diff --git a/mozilla/mailnews/compose/src/nsMsgCompose.h b/mozilla/mailnews/compose/src/nsMsgCompose.h index 24ef7208fa7..0f86cdde38d 100644 --- a/mozilla/mailnews/compose/src/nsMsgCompose.h +++ b/mozilla/mailnews/compose/src/nsMsgCompose.h @@ -113,6 +113,8 @@ class nsMsgCompose : public nsIMsgCompose nsCOMPtr mMsgSend; // for composition back end + PRBool mEntityConversionDone; + // Deal with quoting issues... nsCOMPtr mQuote; PRBool mQuotingToFollow; // Quoting indicator