nsresult nsMsgDisplayMessageByID(nsIPrompt * aPrompt, PRInt32 msgID, const PRUnichar * windowTitle) { nsresult rv; nsCOMPtr<nsIStringBundleService> bundleService(do_GetService("@mozilla.org/intl/stringbundle;1", &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIStringBundle> bundle; rv = bundleService->CreateBundle("chrome://messenger/locale/messengercompose/composeMsgs.properties", getter_AddRefs(bundle)); NS_ENSURE_SUCCESS(rv, rv); nsString msg; bundle->GetStringFromID(NS_IS_MSG_ERROR(msgID) ? NS_ERROR_GET_CODE(msgID) : msgID, getter_Copies(msg)); return nsMsgDisplayMessageByString(aPrompt, msg.get(), windowTitle); }
/* nsresult displayReport (in nsIPrompt prompt, in boolean showErrorOnly, in boolean dontShowReportTwice); */ NS_IMETHODIMP nsMsgSendReport::DisplayReport(nsIPrompt *prompt, PRBool showErrorOnly, PRBool dontShowReportTwice, nsresult *_retval) { NS_ENSURE_ARG_POINTER(_retval); nsresult currError = NS_OK; mProcessReport[mCurrentProcess]->GetError(&currError); *_retval = currError; if (dontShowReportTwice && mAlreadyDisplayReport) return NS_OK; if (showErrorOnly && NS_SUCCEEDED(currError)) return NS_OK; nsXPIDLString currMessage; mProcessReport[mCurrentProcess]->GetMessage(getter_Copies(currMessage)); nsCOMPtr<nsIMsgStringService> composebundle (do_GetService(NS_MSG_COMPOSESTRINGSERVICE_CONTRACTID)); if (!composebundle) { //TODO need to display a generic hardcoded message mAlreadyDisplayReport = PR_TRUE; return NS_OK; } nsXPIDLString dialogTitle; nsXPIDLString dialogMessage; if (NS_SUCCEEDED(currError)) { //TODO display a success error message return NS_OK; } //Do we have an explanation of the error? if no, try to build one... if (currMessage.IsEmpty()) { switch (currError) { case NS_BINDING_ABORTED: case NS_ERROR_SEND_FAILED: case NS_ERROR_SEND_FAILED_BUT_NNTP_OK: case NS_MSG_FAILED_COPY_OPERATION: case NS_MSG_UNABLE_TO_SEND_LATER: case NS_MSG_UNABLE_TO_SAVE_DRAFT: case NS_MSG_UNABLE_TO_SAVE_TEMPLATE: //Ignore, don't need to repeat ourself. break; case NS_ERROR_MSG_MULTILINGUAL_SEND: // already displayed an alert, no additional message is needed // return to the compose window mAlreadyDisplayReport = PR_TRUE; return NS_OK; default: nsAutoString errorMsg; nsMsgBuildErrorMessageByID(currError, errorMsg); if (! errorMsg.IsEmpty()) currMessage.Assign(errorMsg); break; } } if (mDeliveryMode == nsIMsgCompDeliverMode::Now || mDeliveryMode == nsIMsgCompDeliverMode::SendUnsent) { // SMTP is taking care of it's own error message and will return NS_ERROR_BUT_DONT_SHOW_ALERT as error code. // In that case, we must not show an alert ourself. if (currError == NS_ERROR_BUT_DONT_SHOW_ALERT) { mAlreadyDisplayReport = PR_TRUE; return NS_OK; } composebundle->GetStringByID(NS_MSG_SEND_ERROR_TITLE, getter_Copies(dialogTitle)); PRInt32 preStrId = NS_ERROR_SEND_FAILED; PRBool askToGoBackToCompose = PR_FALSE; switch (mCurrentProcess) { case process_BuildMessage : preStrId = NS_ERROR_SEND_FAILED; askToGoBackToCompose = PR_FALSE; break; case process_NNTP : preStrId = NS_ERROR_SEND_FAILED; askToGoBackToCompose = PR_FALSE; break; case process_SMTP : PRBool nntpProceeded; mProcessReport[process_NNTP]->GetProceeded(&nntpProceeded); if (nntpProceeded) preStrId = NS_ERROR_SEND_FAILED_BUT_NNTP_OK; else preStrId = NS_ERROR_SEND_FAILED; askToGoBackToCompose = PR_FALSE; break; case process_Copy: preStrId = NS_MSG_FAILED_COPY_OPERATION; askToGoBackToCompose = (mDeliveryMode == nsIMsgCompDeliverMode::Now); break; case process_FCC: preStrId = NS_MSG_FAILED_COPY_OPERATION; askToGoBackToCompose = (mDeliveryMode == nsIMsgCompDeliverMode::Now); break; } composebundle->GetStringByID(preStrId, getter_Copies(dialogMessage)); //Do we already have an error message? if (!askToGoBackToCompose && currMessage.IsEmpty()) { //we don't have an error description but we can put a generic explanation composebundle->GetStringByID(NS_MSG_GENERIC_FAILURE_EXPLANATION, getter_Copies(currMessage)); } if (!currMessage.IsEmpty()) { nsAutoString temp((const PRUnichar *)dialogMessage); // Because of bug 74726, we cannot use directly an XPIDLString //Don't need to repeat ourself! if (! currMessage.Equals(temp)) { if (! dialogMessage.IsEmpty()) temp.AppendLiteral("\n"); temp.Append(currMessage); dialogMessage.Assign(temp); } } if (askToGoBackToCompose) { PRBool oopsGiveMeBackTheComposeWindow = PR_TRUE; nsXPIDLString text1; composebundle->GetStringByID(NS_MSG_ASK_TO_COMEBACK_TO_COMPOSE, getter_Copies(text1)); nsAutoString temp((const PRUnichar *)dialogMessage); // Because of bug 74726, we cannot use directly an XPIDLString if (! dialogMessage.IsEmpty()) temp.AppendLiteral("\n"); temp.Append(text1); dialogMessage.Assign(temp); nsMsgAskBooleanQuestionByString(prompt, dialogMessage, &oopsGiveMeBackTheComposeWindow, dialogTitle); if (!oopsGiveMeBackTheComposeWindow) *_retval = NS_OK; } else nsMsgDisplayMessageByString(prompt, dialogMessage, dialogTitle); } else { PRInt32 titleID; PRInt32 preStrId; switch (mDeliveryMode) { case nsIMsgCompDeliverMode::Later: titleID = NS_MSG_SENDLATER_ERROR_TITLE; preStrId = NS_MSG_UNABLE_TO_SEND_LATER; break; case nsIMsgCompDeliverMode::AutoSaveAsDraft: case nsIMsgCompDeliverMode::SaveAsDraft: titleID = NS_MSG_SAVE_DRAFT_TITLE; preStrId = NS_MSG_UNABLE_TO_SAVE_DRAFT; break; case nsIMsgCompDeliverMode::SaveAsTemplate: titleID = NS_MSG_SAVE_TEMPLATE_TITLE; preStrId = NS_MSG_UNABLE_TO_SAVE_TEMPLATE; break; default: /* This should never happend! */ titleID = NS_MSG_SEND_ERROR_TITLE; preStrId = NS_ERROR_SEND_FAILED; break; } composebundle->GetStringByID(titleID, getter_Copies(dialogTitle)); composebundle->GetStringByID(preStrId, getter_Copies(dialogMessage)); //Do we have an error message... if (currMessage.IsEmpty()) { //we don't have an error description but we can put a generic explanation composebundle->GetStringByID(NS_MSG_GENERIC_FAILURE_EXPLANATION, getter_Copies(currMessage)); } if (!currMessage.IsEmpty()) { nsAutoString temp((const PRUnichar *)dialogMessage); // Because of bug 74726, we cannot use directly an XPIDLString if (! dialogMessage.IsEmpty()) temp.AppendLiteral("\n"); temp.Append(currMessage); dialogMessage.Assign(temp); } nsMsgDisplayMessageByString(prompt, dialogMessage, dialogTitle); } mAlreadyDisplayReport = PR_TRUE; return NS_OK; }
/* nsresult displayReport (in nsIPrompt prompt, in boolean showErrorOnly, in boolean dontShowReportTwice); */ NS_IMETHODIMP nsMsgSendReport::DisplayReport(nsIPrompt *prompt, bool showErrorOnly, bool dontShowReportTwice, nsresult *_retval) { NS_ENSURE_ARG_POINTER(_retval); nsresult currError = NS_OK; mProcessReport[mCurrentProcess]->GetError(&currError); *_retval = currError; if (dontShowReportTwice && mAlreadyDisplayReport) return NS_OK; if (showErrorOnly && NS_SUCCEEDED(currError)) return NS_OK; nsString currMessage; mProcessReport[mCurrentProcess]->GetMessage(getter_Copies(currMessage)); nsresult rv; // don't step on currError. nsCOMPtr<nsIStringBundleService> bundleService(do_GetService("@mozilla.org/intl/stringbundle;1", &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIStringBundle> bundle; rv = bundleService->CreateBundle("chrome://messenger/locale/messengercompose/composeMsgs.properties", getter_AddRefs(bundle)); if (NS_FAILED(rv)) { //TODO need to display a generic hardcoded message mAlreadyDisplayReport = true; return NS_OK; } nsString dialogTitle; nsString dialogMessage; if (NS_SUCCEEDED(currError)) { //TODO display a success error message return NS_OK; } //Do we have an explanation of the error? if no, try to build one... if (currMessage.IsEmpty()) { switch (currError) { case NS_BINDING_ABORTED: case NS_ERROR_SEND_FAILED: case NS_ERROR_SEND_FAILED_BUT_NNTP_OK: case NS_MSG_FAILED_COPY_OPERATION: case NS_MSG_UNABLE_TO_SEND_LATER: case NS_MSG_UNABLE_TO_SAVE_DRAFT: case NS_MSG_UNABLE_TO_SAVE_TEMPLATE: //Ignore, don't need to repeat ourself. break; default: nsMsgGetMessageByID(currError, currMessage); break; } } if (mDeliveryMode == nsIMsgCompDeliverMode::Now || mDeliveryMode == nsIMsgCompDeliverMode::SendUnsent) { // SMTP is taking care of it's own error message and will return NS_ERROR_BUT_DONT_SHOW_ALERT as error code. // In that case, we must not show an alert ourself. if (currError == NS_ERROR_BUT_DONT_SHOW_ALERT) { mAlreadyDisplayReport = true; return NS_OK; } bundle->GetStringFromID(NS_MSG_SEND_ERROR_TITLE, getter_Copies(dialogTitle)); PRInt32 preStrId = NS_ERROR_SEND_FAILED; bool askToGoBackToCompose = false; switch (mCurrentProcess) { case process_BuildMessage : preStrId = NS_ERROR_SEND_FAILED; askToGoBackToCompose = false; break; case process_NNTP : preStrId = NS_ERROR_SEND_FAILED; askToGoBackToCompose = false; break; case process_SMTP : bool nntpProceeded; mProcessReport[process_NNTP]->GetProceeded(&nntpProceeded); if (nntpProceeded) preStrId = NS_ERROR_SEND_FAILED_BUT_NNTP_OK; else preStrId = NS_ERROR_SEND_FAILED; askToGoBackToCompose = false; break; case process_Copy: preStrId = NS_MSG_FAILED_COPY_OPERATION; askToGoBackToCompose = (mDeliveryMode == nsIMsgCompDeliverMode::Now); break; case process_FCC: preStrId = NS_MSG_FAILED_COPY_OPERATION; askToGoBackToCompose = (mDeliveryMode == nsIMsgCompDeliverMode::Now); break; } bundle->GetStringFromID(preStrId, getter_Copies(dialogMessage)); //Do we already have an error message? if (!askToGoBackToCompose && currMessage.IsEmpty()) { //we don't have an error description but we can put a generic explanation bundle->GetStringFromID(NS_MSG_GENERIC_FAILURE_EXPLANATION, getter_Copies(currMessage)); } if (!currMessage.IsEmpty()) { //Don't need to repeat ourself! if (!currMessage.Equals(dialogMessage)) { if (!dialogMessage.IsEmpty()) dialogMessage.Append(PRUnichar('\n')); dialogMessage.Append(currMessage); } } if (askToGoBackToCompose) { bool oopsGiveMeBackTheComposeWindow = true; nsString text1; bundle->GetStringFromID(NS_MSG_ASK_TO_COMEBACK_TO_COMPOSE, getter_Copies(text1)); if (!dialogMessage.IsEmpty()) dialogMessage.AppendLiteral("\n"); dialogMessage.Append(text1); nsMsgAskBooleanQuestionByString(prompt, dialogMessage.get(), &oopsGiveMeBackTheComposeWindow, dialogTitle.get()); if (!oopsGiveMeBackTheComposeWindow) *_retval = NS_OK; } else nsMsgDisplayMessageByString(prompt, dialogMessage.get(), dialogTitle.get()); } else { PRInt32 titleID; PRInt32 preStrId; switch (mDeliveryMode) { case nsIMsgCompDeliverMode::Later: titleID = NS_MSG_SENDLATER_ERROR_TITLE; preStrId = NS_MSG_UNABLE_TO_SEND_LATER; break; case nsIMsgCompDeliverMode::AutoSaveAsDraft: case nsIMsgCompDeliverMode::SaveAsDraft: titleID = NS_MSG_SAVE_DRAFT_TITLE; preStrId = NS_MSG_UNABLE_TO_SAVE_DRAFT; break; case nsIMsgCompDeliverMode::SaveAsTemplate: titleID = NS_MSG_SAVE_TEMPLATE_TITLE; preStrId = NS_MSG_UNABLE_TO_SAVE_TEMPLATE; break; default: /* This should never happend! */ titleID = NS_MSG_SEND_ERROR_TITLE; preStrId = NS_ERROR_SEND_FAILED; break; } bundle->GetStringFromID(titleID, getter_Copies(dialogTitle)); // preStrId could be a string ID or it could be an error code...yuck. bundle->GetStringFromID(NS_IS_MSG_ERROR(preStrId) ? NS_ERROR_GET_CODE(preStrId) : preStrId, getter_Copies(dialogMessage)); //Do we have an error message... if (currMessage.IsEmpty()) { //we don't have an error description but we can put a generic explanation bundle->GetStringFromID(NS_MSG_GENERIC_FAILURE_EXPLANATION, getter_Copies(currMessage)); } if (!currMessage.IsEmpty()) { if (!dialogMessage.IsEmpty()) dialogMessage.Append(PRUnichar('\n')); dialogMessage.Append(currMessage); } nsMsgDisplayMessageByString(prompt, dialogMessage.get(), dialogTitle.get()); } mAlreadyDisplayReport = true; return NS_OK; }
/* nsresult displayReport (in nsIPrompt prompt, in boolean showErrorOnly, in * boolean dontShowReportTwice); */ NS_IMETHODIMP nsMsgSendReport::DisplayReport(nsIPrompt *prompt, bool showErrorOnly, bool dontShowReportTwice, nsresult *_retval) { NS_ENSURE_ARG_POINTER(_retval); NS_ENSURE_TRUE(mCurrentProcess >= 0 && mCurrentProcess <= SEND_LAST_PROCESS, NS_ERROR_NOT_INITIALIZED); nsresult currError = NS_OK; mProcessReport[mCurrentProcess]->GetError(&currError); *_retval = currError; if (dontShowReportTwice && mAlreadyDisplayReport) return NS_OK; if (showErrorOnly && NS_SUCCEEDED(currError)) return NS_OK; nsString currMessage; mProcessReport[mCurrentProcess]->GetMessage(getter_Copies(currMessage)); nsresult rv; // don't step on currError. nsCOMPtr<nsIStringBundleService> bundleService = mozilla::services::GetStringBundleService(); NS_ENSURE_TRUE(bundleService, NS_ERROR_UNEXPECTED); nsCOMPtr<nsIStringBundle> bundle; rv = bundleService->CreateBundle( "chrome://messenger/locale/messengercompose/composeMsgs.properties", getter_AddRefs(bundle)); if (NS_FAILED(rv)) { // TODO need to display a generic hardcoded message mAlreadyDisplayReport = true; return NS_OK; } nsString dialogTitle; nsString dialogMessage; if (NS_SUCCEEDED(currError)) { // TODO display a success error message return NS_OK; } // Do we have an explanation of the error? if no, try to build one... if (currMessage.IsEmpty()) { #ifdef __GNUC__ // Temporary workaround until bug 783526 is fixed. # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wswitch" #endif switch (currError) { case NS_BINDING_ABORTED: case NS_MSG_UNABLE_TO_SEND_LATER: case NS_MSG_UNABLE_TO_SAVE_DRAFT: case NS_MSG_UNABLE_TO_SAVE_TEMPLATE: // Ignore, don't need to repeat ourself. break; default: const char *errorString = errorStringNameForErrorCode(currError); nsMsgGetMessageByName(errorString, currMessage); break; } #ifdef __GNUC__ # pragma GCC diagnostic pop #endif } if (mDeliveryMode == nsIMsgCompDeliverMode::Now || mDeliveryMode == nsIMsgCompDeliverMode::SendUnsent) { // SMTP is taking care of it's own error message and will return // NS_ERROR_BUT_DONT_SHOW_ALERT as error code. In that case, we must not // show an alert ourself. if (currError == NS_ERROR_BUT_DONT_SHOW_ALERT) { mAlreadyDisplayReport = true; return NS_OK; } bundle->GetStringFromName("sendMessageErrorTitle", dialogTitle); const char *preStrName = "sendFailed"; bool askToGoBackToCompose = false; switch (mCurrentProcess) { case process_BuildMessage: preStrName = "sendFailed"; askToGoBackToCompose = false; break; case process_NNTP: preStrName = "sendFailed"; askToGoBackToCompose = false; break; case process_SMTP: bool nntpProceeded; mProcessReport[process_NNTP]->GetProceeded(&nntpProceeded); if (nntpProceeded) preStrName = "sendFailedButNntpOk"; else preStrName = "sendFailed"; askToGoBackToCompose = false; break; case process_Copy: preStrName = "failedCopyOperation"; askToGoBackToCompose = (mDeliveryMode == nsIMsgCompDeliverMode::Now); break; case process_FCC: preStrName = "failedCopyOperation"; askToGoBackToCompose = (mDeliveryMode == nsIMsgCompDeliverMode::Now); break; } bundle->GetStringFromName(preStrName, dialogMessage); // Do we already have an error message? if (!askToGoBackToCompose && currMessage.IsEmpty()) { // we don't have an error description but we can put a generic explanation bundle->GetStringFromName("genericFailureExplanation", currMessage); } if (!currMessage.IsEmpty()) { // Don't need to repeat ourself! if (!currMessage.Equals(dialogMessage)) { if (!dialogMessage.IsEmpty()) dialogMessage.Append(char16_t('\n')); dialogMessage.Append(currMessage); } } if (askToGoBackToCompose) { bool oopsGiveMeBackTheComposeWindow = true; nsString text1; bundle->GetStringFromName("returnToComposeWindowQuestion", text1); if (!dialogMessage.IsEmpty()) dialogMessage.AppendLiteral("\n"); dialogMessage.Append(text1); nsMsgAskBooleanQuestionByString(prompt, dialogMessage.get(), &oopsGiveMeBackTheComposeWindow, dialogTitle.get()); if (!oopsGiveMeBackTheComposeWindow) *_retval = NS_OK; } else nsMsgDisplayMessageByString(prompt, dialogMessage.get(), dialogTitle.get()); } else { const char *title; const char *messageName; switch (mDeliveryMode) { case nsIMsgCompDeliverMode::Later: title = "sendLaterErrorTitle"; messageName = "unableToSendLater"; break; case nsIMsgCompDeliverMode::AutoSaveAsDraft: case nsIMsgCompDeliverMode::SaveAsDraft: title = "saveDraftErrorTitle"; messageName = "unableToSaveDraft"; break; case nsIMsgCompDeliverMode::SaveAsTemplate: title = "saveTemplateErrorTitle"; messageName = "unableToSaveTemplate"; break; default: /* This should never happen! */ title = "sendMessageErrorTitle"; messageName = "sendFailed"; break; } bundle->GetStringFromName(title, dialogTitle); bundle->GetStringFromName(messageName, dialogMessage); // Do we have an error message... if (currMessage.IsEmpty()) { // we don't have an error description but we can put a generic explanation bundle->GetStringFromName("genericFailureExplanation", currMessage); } if (!currMessage.IsEmpty()) { if (!dialogMessage.IsEmpty()) dialogMessage.Append(char16_t('\n')); dialogMessage.Append(currMessage); } nsMsgDisplayMessageByString(prompt, dialogMessage.get(), dialogTitle.get()); } mAlreadyDisplayReport = true; return NS_OK; }