From 8465fb9bac3130da2e9c8558a98122cb300309b6 Mon Sep 17 00:00:00 2001 From: "nhotta%netscape.com" Date: Tue, 23 Oct 2001 23:25:02 +0000 Subject: [PATCH] Fix the window close problem for saveAs in .js, enable the charset alert in .cpp and some clean up, bug 89655, r=ducarroz, sr=bienvenu. --- mailnews/base/util/nsMsgI18N.cpp | 11 ++-- mailnews/base/util/nsMsgI18N.h | 2 +- .../resources/content/MsgComposeCommands.js | 9 ++- mailnews/compose/src/nsMsgCompUtils.cpp | 58 ++++++++++++------- mailnews/compose/src/nsMsgCompose.cpp | 4 +- mailnews/compose/src/nsMsgSend.cpp | 4 +- 6 files changed, 58 insertions(+), 30 deletions(-) diff --git a/mailnews/base/util/nsMsgI18N.cpp b/mailnews/base/util/nsMsgI18N.cpp index f4886cc67856..7ac0abdb3a71 100644 --- a/mailnews/base/util/nsMsgI18N.cpp +++ b/mailnews/base/util/nsMsgI18N.cpp @@ -522,8 +522,11 @@ PRBool nsMsgI18N7bit_data_part(const char *charset, const char *inString, const return result; } -PRBool nsMsgI18Ncheck_data_in_charset_range(const char *charset, const nsString& inString) +PRBool nsMsgI18Ncheck_data_in_charset_range(const char *charset, const PRUnichar* inString) { + if (!charset || !*charset || !inString || !*inString) + return PR_TRUE; + nsAutoString aCharset; aCharset.AssignWithConversion(charset); nsresult res; PRBool result = PR_TRUE; @@ -536,15 +539,15 @@ PRBool nsMsgI18Ncheck_data_in_charset_range(const char *charset, const nsString& // get an unicode converter res = ccm->GetUnicodeEncoder(&aCharset, getter_AddRefs(encoder)); if(NS_SUCCEEDED(res)) { - const PRUnichar *originalPtr = inString.get(); - PRInt32 originalLen = inString.Length(); + const PRUnichar *originalPtr = inString; + PRInt32 originalLen = nsCRT::strlen(inString); PRUnichar *currentSrcPtr = NS_CONST_CAST(PRUnichar *, originalPtr); char localBuff[512]; PRInt32 consumedLen = 0; PRInt32 srcLen; PRInt32 dstLength; - // convert to unicode + // convert from unicode while (consumedLen < originalLen) { srcLen = originalLen - consumedLen; dstLength = 512; diff --git a/mailnews/base/util/nsMsgI18N.h b/mailnews/base/util/nsMsgI18N.h index 3191e51c421d..c167af7eb5f4 100644 --- a/mailnews/base/util/nsMsgI18N.h +++ b/mailnews/base/util/nsMsgI18N.h @@ -91,7 +91,7 @@ NS_MSG_BASE PRBool nsMsgI18N7bit_data_part(const char *charset, const char *s * @return True if the string can be converted within the charset range. * False if one or more characters cannot be converted to the target charset. */ -NS_MSG_BASE PRBool nsMsgI18Ncheck_data_in_charset_range(const char *charset, const nsString& inString); +NS_MSG_BASE PRBool nsMsgI18Ncheck_data_in_charset_range(const char *charset, const PRUnichar* inString); /** * Return accept language. diff --git a/mailnews/compose/resources/content/MsgComposeCommands.js b/mailnews/compose/resources/content/MsgComposeCommands.js index 987ac7735178..ea28b72ea47e 100644 --- a/mailnews/compose/resources/content/MsgComposeCommands.js +++ b/mailnews/compose/resources/content/MsgComposeCommands.js @@ -61,6 +61,7 @@ var contentChanged = false; var gCurrentIdentity = null; var defaultSaveOperation = "draft"; var sendOrSaveOperationInProgress = false; +var gCloseWindowAfterSave = false; var isOffline = false; var sessionAdded = false; var currentAutocompleteDirectory = null; @@ -112,7 +113,12 @@ var stateListener = { { contentChanged = false; msgCompose.bodyModified = false; + + if (gCloseWindowAfterSave) + msgCompose.CloseWindow(); } + + gCloseWindowAfterSave = false; }, SaveInFolderDone: function(folderURI) { @@ -1843,8 +1849,9 @@ function ComposeCanClose() case 0: //Save if (LastToClose()) NotifyQuitApplication(); + gCloseWindowAfterSave = true; SaveAsDraft(); - break; + return false; case 1: //Cancel return false; case 2: //Don't Save diff --git a/mailnews/compose/src/nsMsgCompUtils.cpp b/mailnews/compose/src/nsMsgCompUtils.cpp index 001cc0c69ad8..ef4b5b594b68 100644 --- a/mailnews/compose/src/nsMsgCompUtils.cpp +++ b/mailnews/compose/src/nsMsgCompUtils.cpp @@ -255,24 +255,54 @@ mime_generate_headers (nsMsgCompFields *fields, const char* pReference; const char* pOtherHdr; + nsCAutoString headerBuf; // accumulate header strings for charset conversion check + headerBuf.Truncate(0); + NS_ASSERTION (fields, "null fields"); if (!fields) return nsnull; - /* Multiply by 3 here to make enough room for MimePartII conversion */ - pFrom = fields->GetFrom(); if (pFrom) size += 3 * PL_strlen (pFrom); - pReplyTo =fields->GetReplyTo(); if (pReplyTo) size += 3 * PL_strlen (pReplyTo); - pTo = fields->GetTo(); if (pTo) size += 3 * PL_strlen (pTo); - pCc = fields->GetCc(); if (pCc) size += 3 * PL_strlen (pCc); + pFrom = fields->GetFrom(); + if (pFrom) + headerBuf.Append(pFrom); + pReplyTo =fields->GetReplyTo(); + if (pReplyTo) + headerBuf.Append(pReplyTo); + pTo = fields->GetTo(); + if (pTo) + headerBuf.Append(pTo); + pCc = fields->GetCc(); + if (pCc) + headerBuf.Append(pCc); pNewsGrp = fields->GetNewsgroups(); if (pNewsGrp) size += 3 * PL_strlen (pNewsGrp); pFollow= fields->GetFollowupTo(); if (pFollow) size += 3 * PL_strlen (pFollow); - pSubject = fields->GetSubject(); if (pSubject) size += 3 * PL_strlen (pSubject); - pReference = fields->GetReferences(); if (pReference) size += 3 * PL_strlen (pReference); - pOrg= fields->GetOrganization(); if (pOrg) size += 3 * PL_strlen (pOrg); + pSubject = fields->GetSubject(); + if (pSubject) + headerBuf.Append(pSubject); + pReference = fields->GetReferences(); if (pReference) size += 3 * PL_strlen (pReference); + pOrg= fields->GetOrganization(); + if (pOrg) + headerBuf.Append(pOrg); pOtherHdr= fields->GetOtherRandomHeaders(); if (pOtherHdr) size += 3 * PL_strlen (pOtherHdr); pPriority = fields->GetPriority(); if (pPriority) size += 3 * PL_strlen (pPriority); pMessageID = fields->GetMessageId(); if (pMessageID) size += PL_strlen (pMessageID); + /* Multiply by 3 here to make enough room for MimePartII conversion */ + size += 3 * headerBuf.Length(); + + const char *pBcc = fields->GetBcc(); + if (pBcc) + headerBuf.Append(pBcc); + // alert the user if headers contain characters out of charset range (e.g. multilingual data) + if (!nsMsgI18Ncheck_data_in_charset_range(charset, NS_ConvertUTF8toUCS2(headerBuf.get()).get())) { + PRBool proceedTheSend; + rv = nsMsgAskBooleanQuestionByID(aPrompt, NS_MSG_MULTILINGUAL_SEND, &proceedTheSend); + if (!proceedTheSend) { + *status = NS_ERROR_ABORT; + return nsnull; + } + } + /* Add a bunch of slop for the static parts of the headers. */ /* size += 2048; */ size += 2560; @@ -643,18 +673,6 @@ mime_generate_headers (nsMsgCompFields *fields, } if (pSubject && *pSubject) { - // alert the user if the subject contains characters out of charset range (e.g. multilingual data) - nsAutoString u; // need to convert from UTF-8 to UCS2 - if (NS_OK == nsMsgI18NConvertToUnicode(nsCAutoString(msgCompHeaderInternalCharset()), nsCAutoString(pSubject), u) && - !nsMsgI18Ncheck_data_in_charset_range(charset, u) && - nsIMsgSend::nsMsgDeliverNow == deliver_mode) { - PRBool proceedTheSend; - rv = nsMsgAskBooleanQuestionByID(aPrompt, NS_MSG_MULTILINGUAL_SEND, &proceedTheSend); - if (!proceedTheSend) { - *status = NS_ERROR_BUT_DONT_SHOW_ALERT; - return nsnull; - } - } char *convbuf; PUSH_STRING ("Subject: "); diff --git a/mailnews/compose/src/nsMsgCompose.cpp b/mailnews/compose/src/nsMsgCompose.cpp index 4d8a26eced60..7419a2b2359d 100644 --- a/mailnews/compose/src/nsMsgCompose.cpp +++ b/mailnews/compose/src/nsMsgCompose.cpp @@ -888,12 +888,12 @@ nsresult nsMsgCompose::SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *ide if (NS_SUCCEEDED(rv) && nsnull != outCString) { // body contains multilingual data, confirm send to the user - if (NS_ERROR_UENC_NOMAPPING == rv && nsIMsgSend::nsMsgDeliverNow == deliverMode) { + if (NS_ERROR_UENC_NOMAPPING == rv) { PRBool proceedTheSend; rv = nsMsgAskBooleanQuestionByID(prompt, NS_MSG_MULTILINGUAL_SEND, &proceedTheSend); if (!proceedTheSend) { PR_FREEIF(outCString); - return NS_ERROR_BUT_DONT_SHOW_ALERT; + return NS_ERROR_ABORT; } } m_compFields->SetBody(outCString); diff --git a/mailnews/compose/src/nsMsgSend.cpp b/mailnews/compose/src/nsMsgSend.cpp index 8b07d5e3e12f..616e43d46d10 100644 --- a/mailnews/compose/src/nsMsgSend.cpp +++ b/mailnews/compose/src/nsMsgSend.cpp @@ -1392,7 +1392,7 @@ nsMsgComposeAndSend::GetBodyFromEditor() PR_FREEIF(outCString); rv = nsMsgI18NSaveAsCharset(TEXT_PLAIN, aCharset, bodyText, &outCString); - if (NS_ERROR_UENC_NOMAPPING == rv && nsIMsgSend::nsMsgDeliverNow == m_deliver_mode) { + if (NS_ERROR_UENC_NOMAPPING == rv) { PRBool proceedTheSend; nsCOMPtr prompt; GetDefaultPrompt(getter_AddRefs(prompt)); @@ -1401,7 +1401,7 @@ nsMsgComposeAndSend::GetBodyFromEditor() PR_FREEIF(attachment1_body); PR_FREEIF(outCString); Recycle(bodyText); - return NS_ERROR_BUT_DONT_SHOW_ALERT; + return NS_ERROR_ABORT; } } }