diff --git a/mozilla/mailnews/base/public/nsIMsgWindow.idl b/mozilla/mailnews/base/public/nsIMsgWindow.idl index c4ad7f6cc18..5195e0b34f5 100644 --- a/mozilla/mailnews/base/public/nsIMsgWindow.idl +++ b/mozilla/mailnews/base/public/nsIMsgWindow.idl @@ -74,6 +74,8 @@ interface nsIMsgWindow : nsISupports { readonly attribute nsIPrompt promptDialog; readonly attribute nsIAuthPrompt authPromptDialog; attribute wstring mailCharacterSet; + // Remember the message's charaset was overridden, so it can be inherited (e.g for quoting). + attribute boolean charsetOverride; /* has a running url been stopped? If you care about checking this flag, you need to clear it before you start your operation since diff --git a/mozilla/mailnews/base/resources/content/shareglue.js b/mozilla/mailnews/base/resources/content/shareglue.js index a6b50a1052e..0a23c857732 100644 --- a/mozilla/mailnews/base/resources/content/shareglue.js +++ b/mozilla/mailnews/base/resources/content/shareglue.js @@ -34,6 +34,7 @@ function MessengerSetDefaultCharacterSet(aCharset) // dump(aCharset);dump("\n"); messenger.SetDocumentCharset(aCharset); msgWindow.mailCharacterSet = aCharset; + msgWindow.charsetOverride = true; // folder charset to be set by folder property not by charset menu // var folderResource = GetSelectedFolderResource(); diff --git a/mozilla/mailnews/base/src/nsMsgWindow.cpp b/mozilla/mailnews/base/src/nsMsgWindow.cpp index 6f9e55a1987..a7a49f4fa31 100644 --- a/mozilla/mailnews/base/src/nsMsgWindow.cpp +++ b/mozilla/mailnews/base/src/nsMsgWindow.cpp @@ -80,6 +80,7 @@ NS_IMPL_THREADSAFE_ISUPPORTS3(nsMsgWindow, nsMsgWindow::nsMsgWindow() { + mCharsetOverride = PR_FALSE; m_stopped = PR_FALSE; NS_INIT_ISUPPORTS(); } @@ -338,6 +339,19 @@ NS_IMETHODIMP nsMsgWindow::SetMailCharacterSet(const PRUnichar * aMailCharacterS return NS_OK; } +NS_IMETHODIMP nsMsgWindow::GetCharsetOverride(PRBool *aCharsetOverride) +{ + NS_ENSURE_ARG_POINTER(aCharsetOverride); + *aCharsetOverride = mCharsetOverride; + return NS_OK; +} + +NS_IMETHODIMP nsMsgWindow::SetCharsetOverride(PRBool aCharsetOverride) +{ + mCharsetOverride = aCharsetOverride; + return NS_OK; +} + NS_IMETHODIMP nsMsgWindow::SetDOMWindow(nsIDOMWindowInternal *aWindow) { if (!aWindow) diff --git a/mozilla/mailnews/base/src/nsMsgWindow.h b/mozilla/mailnews/base/src/nsMsgWindow.h index 04ed1f9127c..d44ccb7980c 100644 --- a/mozilla/mailnews/base/src/nsMsgWindow.h +++ b/mozilla/mailnews/base/src/nsMsgWindow.h @@ -77,6 +77,7 @@ protected: nsWeakPtr mMessageWindowDocShellWeak; nsString mMailCharacterSet; + PRBool mCharsetOverride; PRBool m_stopped; // small helper function used to optimize our use of a weak reference // on the message window docshell. Under no circumstances should you be holding on to diff --git a/mozilla/mailnews/compose/src/nsMsgCompose.cpp b/mozilla/mailnews/compose/src/nsMsgCompose.cpp index 6840b508f23..57d1c88f9f9 100644 --- a/mozilla/mailnews/compose/src/nsMsgCompose.cpp +++ b/mozilla/mailnews/compose/src/nsMsgCompose.cpp @@ -212,7 +212,7 @@ static void TranslateLineEnding(nsString& data) data.SetLength(wPtr - sPtr); } -static void GetTopmostMsgWindowCharacterSet(nsXPIDLString& charset) +static void GetTopmostMsgWindowCharacterSet(nsXPIDLString& charset, PRBool* charsetOverride) { // HACK: if we are replying to a message and that message used a charset over ride // (as specified in the top most window (assuming the reply originated from that window) @@ -226,6 +226,7 @@ static void GetTopmostMsgWindowCharacterSet(nsXPIDLString& charset) { nsXPIDLString mailCharset; msgWindow->GetMailCharacterSet(getter_Copies(charset)); + msgWindow->GetCharsetOverride(charsetOverride); } } } @@ -244,6 +245,7 @@ nsMsgCompose::nsMsgCompose() m_window = nsnull; m_editor = nsnull; mQuoteStreamListener=nsnull; + mCharsetOverride = PR_FALSE; m_compFields = nsnull; //m_compFields will be set during nsMsgCompose::Initialize mType = nsIMsgCompType::New; @@ -1396,7 +1398,7 @@ nsresult nsMsgCompose::CreateMessage(const char * originalMsgURI, // use a charset of the original message nsXPIDLString mailCharset; - GetTopmostMsgWindowCharacterSet(mailCharset); + GetTopmostMsgWindowCharacterSet(mailCharset, &mCharsetOverride); if (mailCharset && (* (const PRUnichar *) mailCharset) ) { charset.Adopt(ToNewUTF8String(nsDependentString(mailCharset))); @@ -1452,7 +1454,7 @@ nsresult nsMsgCompose::CreateMessage(const char * originalMsgURI, // use a charset of the original message nsXPIDLString mailCharset; - GetTopmostMsgWindowCharacterSet(mailCharset); + GetTopmostMsgWindowCharacterSet(mailCharset, &mCharsetOverride); if (mailCharset && (* (const PRUnichar *) mailCharset) ) { charset.Adopt(ToNewUTF8String(nsDependentString(mailCharset))); @@ -2079,7 +2081,8 @@ nsMsgCompose::QuoteOriginalMessage(const char *originalMsgURI, PRInt32 what) // mQuoteStreamListener->SetComposeObj(this); - rv = mQuote->QuoteMessage(originalMsgURI, what != 1, mQuoteStreamListener, m_compFields->GetCharacterSet()); + rv = mQuote->QuoteMessage(originalMsgURI, what != 1, mQuoteStreamListener, + mCharsetOverride ? m_compFields->GetCharacterSet() : ""); return rv; } diff --git a/mozilla/mailnews/compose/src/nsMsgCompose.h b/mozilla/mailnews/compose/src/nsMsgCompose.h index 10a26fbf66c..be5af563699 100644 --- a/mozilla/mailnews/compose/src/nsMsgCompose.h +++ b/mozilla/mailnews/compose/src/nsMsgCompose.h @@ -143,6 +143,7 @@ private: nsMsgDocumentStateListener *mDocumentListener; MSG_ComposeType mType; // Message type nsCOMPtr mStateListeners; // contents are nsISupports + PRBool mCharsetOverride; nsCOMPtr mExternalSendListener; nsCString mSmtpPassword; diff --git a/mozilla/mailnews/mime/src/nsStreamConverter.cpp b/mozilla/mailnews/mime/src/nsStreamConverter.cpp index ab41cf0228a..6482b1773a8 100644 --- a/mozilla/mailnews/mime/src/nsStreamConverter.cpp +++ b/mozilla/mailnews/mime/src/nsStreamConverter.cpp @@ -208,7 +208,10 @@ bridge_new_new_uri(void *bridgeStream, nsIURI *aURI, PRInt32 aOutputType) nsCOMPtr msgWindow; msgurl->GetMsgWindow(getter_AddRefs(msgWindow)); if (msgWindow) + { msgWindow->SetMailCharacterSet(NS_ConvertASCIItoUCS2(*default_charset).get()); + msgWindow->SetCharsetOverride(*override_charset); + } } // if the pref says always override and no manual override then set the folder charset to override