NS_IMETHODIMP sbStatusPropertyBuilder::Get(sbIPropertyInfo** _retval) { NS_ENSURE_ARG_POINTER(_retval); NS_ENSURE_STATE(!mPropertyID.IsEmpty()); nsString displayName; nsresult rv = GetFinalDisplayName(displayName); NS_ENSURE_SUCCESS(rv, rv); nsString label; if (!mLabelKey.IsEmpty()) { rv = GetStringFromName(mBundle, mLabelKey, label); NS_ENSURE_SUCCESS(rv, rv); } else { label = mLabel; } nsString completedLabel; if (!mCompletedLabelKey.IsEmpty()) { rv = GetStringFromName(mBundle, mCompletedLabelKey, completedLabel); NS_ENSURE_SUCCESS(rv, rv); } else { completedLabel = mCompletedLabel; } nsString failedLabel; if (!mFailedLabelKey.IsEmpty()) { rv = GetStringFromName(mBundle, mFailedLabelKey, failedLabel); NS_ENSURE_SUCCESS(rv, rv); } else { failedLabel = mFailedLabel; } nsRefPtr<sbStatusPropertyInfo> pi = new sbStatusPropertyInfo(mPropertyID, displayName, mDisplayNameKey, label, completedLabel, failedLabel, mRemoteReadable, mRemoteWritable, mUserViewable, mUserEditable); NS_ENSURE_TRUE(pi, NS_ERROR_OUT_OF_MEMORY); rv = pi->Init(); NS_ENSURE_SUCCESS(rv, rv); NS_ADDREF(*_retval = pi); return NS_OK; }
/* void GetStringFromName (in wstring aName, out wstring aResult); */ NS_IMETHODIMP nsStringBundle::GetStringFromName(const PRUnichar *aName, PRUnichar **aResult) { NS_ENSURE_ARG_POINTER(aName); NS_ENSURE_ARG_POINTER(aResult); nsresult rv; rv = LoadProperties(); if (NS_FAILED(rv)) return rv; nsAutoCMonitor(this); *aResult = nsnull; nsAutoString tmpstr; rv = GetStringFromName(nsDependentString(aName), tmpstr); if (NS_FAILED(rv)) { #if 0 // it is not uncommon for apps to request a string name which may not exist // so be quiet about it. NS_WARNING("String missing from string bundle"); printf(" '%s' missing from bundle %s\n", NS_ConvertUTF16toUTF8(aName).get(), mPropertiesURL.get()); #endif return rv; } *aResult = ToNewUnicode(tmpstr); NS_ENSURE_TRUE(*aResult, NS_ERROR_OUT_OF_MEMORY); return NS_OK; }
NS_IMETHODIMP nsExtensibleStringBundle::FormatStringFromName(const PRUnichar *aName, const PRUnichar ** aParams, PRUint32 aLength, PRUnichar ** aResult) { nsXPIDLString formatStr; GetStringFromName(aName, getter_Copies(formatStr)); return nsStringBundle::FormatString(formatStr, aParams, aLength, aResult); }
nsresult sbStringBundle::ApplySubstitutions(nsAString& aString) { nsresult rv; // Apply embedded bundle strings. nsAutoString processedString(aString); PRInt32 subStartIndex = 0; PRInt32 subEndIndex = -1; while (1) { // Find the next embedded bundle string. PRInt32 subLength; subStartIndex = processedString.Find("&", static_cast<PRUint32>(subStartIndex)); if (subStartIndex < 0) break; subEndIndex = processedString.Find(";", static_cast<PRUint32>(subStartIndex)); if (subEndIndex < 0) break; subLength = subEndIndex + 1 - subStartIndex; // Get the bundle string name. nsAutoString subName(Substring(processedString, subStartIndex + 1, subLength - 2)); // Get the bundle string, special casing "&". nsAutoString subString; if (subName.Equals(NS_LITERAL_STRING("amp"))) { subString.Assign(NS_LITERAL_STRING("&")); } else { rv = GetStringFromName(subName.get(), getter_Copies(subString)); if (NS_FAILED(rv)) subString.Truncate(); } // Apply the embedded bundle string. processedString.Replace(subStartIndex, subLength, subString); // Continue processing after the bundle string. subStartIndex += subString.Length(); } // Return results. aString.Assign(processedString); return NS_OK; }
// this function supports at most 10 parameters.. see below for why NS_IMETHODIMP nsStringBundle::FormatStringFromName(const PRUnichar *aName, const PRUnichar **aParams, PRUint32 aLength, PRUnichar **aResult) { NS_ENSURE_ARG_POINTER(aName); NS_ASSERTION(aParams && aLength, "FormatStringFromName() without format parameters: use GetStringFromName() instead"); NS_ENSURE_ARG_POINTER(aResult); nsresult rv; rv = LoadProperties(); if (NS_FAILED(rv)) return rv; nsAutoString formatStr; rv = GetStringFromName(nsDependentString(aName), formatStr); if (NS_FAILED(rv)) return rv; return FormatString(formatStr.get(), aParams, aLength, aResult); }
nsresult nsMsgMdnGenerator::CreateFirstPart() { DEBUG_MDN("nsMsgMdnGenerator::CreateFirstPart"); char *convbuf = nsnull, *tmpBuffer = nsnull; char *parm = nsnull; nsString firstPart1; nsString firstPart2; nsresult rv = NS_OK; nsCOMPtr <nsIMsgCompUtils> compUtils; if (m_mimeSeparator.IsEmpty()) { compUtils = do_GetService(NS_MSGCOMPUTILS_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = compUtils->MimeMakeSeparator("mdn", getter_Copies(m_mimeSeparator)); NS_ENSURE_SUCCESS(rv, rv); } if (m_mimeSeparator.IsEmpty()) return NS_ERROR_OUT_OF_MEMORY; tmpBuffer = (char *) PR_CALLOC(256); if (!tmpBuffer) return NS_ERROR_OUT_OF_MEMORY; PRExplodedTime now; PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &now); int gmtoffset = (now.tm_params.tp_gmt_offset + now.tm_params.tp_dst_offset) / 60; /* Use PR_FormatTimeUSEnglish() to format the date in US English format, then figure out what our local GMT offset is, and append it (since PR_FormatTimeUSEnglish() can't do that.) Generate four digit years as per RFC 1123 (superceding RFC 822.) */ PR_FormatTimeUSEnglish(tmpBuffer, 100, "Date: %a, %d %b %Y %H:%M:%S ", &now); PR_snprintf(tmpBuffer + strlen(tmpBuffer), 100, "%c%02d%02d" CRLF, (gmtoffset >= 0 ? '+' : '-'), ((gmtoffset >= 0 ? gmtoffset : -gmtoffset) / 60), ((gmtoffset >= 0 ? gmtoffset : -gmtoffset) % 60)); rv = WriteString(tmpBuffer); PR_Free(tmpBuffer); if (NS_FAILED(rv)) return rv; PRBool conformToStandard = PR_FALSE; if (compUtils) compUtils->GetMsgMimeConformToStandard(&conformToStandard); nsString fullName; m_identity->GetFullName(fullName); nsCString fullAddress; nsCOMPtr<nsIMsgHeaderParser> parser (do_GetService(NS_MAILNEWS_MIME_HEADER_PARSER_CONTRACTID)); if (parser) { // convert fullName to UTF8 before passing it to MakeFullAddressString parser->MakeFullAddressString(NS_ConvertUTF16toUTF8(fullName).get(), m_email.get(), getter_Copies(fullAddress)); } convbuf = nsMsgI18NEncodeMimePartIIStr( (!fullAddress.IsEmpty()) ? fullAddress.get(): m_email.get(), PR_TRUE, m_charset.get(), 0, conformToStandard); parm = PR_smprintf("From: %s" CRLF, convbuf ? convbuf : m_email.get()); rv = FormatStringFromName(NS_LITERAL_STRING("MsgMdnMsgSentTo").get(), NS_ConvertASCIItoUTF16(m_email).get(), getter_Copies(firstPart1)); if (NS_FAILED(rv)) return rv; PUSH_N_FREE_STRING (parm); PR_Free(convbuf); if (compUtils) { nsCString msgId; rv = compUtils->MsgGenerateMessageId(m_identity, getter_Copies(msgId)); tmpBuffer = PR_smprintf("Message-ID: %s" CRLF, msgId.get()); PUSH_N_FREE_STRING(tmpBuffer); } nsString receipt_string; switch (m_disposeType) { case nsIMsgMdnGenerator::eDisplayed: rv = GetStringFromName( NS_LITERAL_STRING("MdnDisplayedReceipt").get(), getter_Copies(receipt_string)); break; case nsIMsgMdnGenerator::eDispatched: rv = GetStringFromName( NS_LITERAL_STRING("MdnDispatchedReceipt").get(), getter_Copies(receipt_string)); break; case nsIMsgMdnGenerator::eProcessed: rv = GetStringFromName( NS_LITERAL_STRING("MdnProcessedReceipt").get(), getter_Copies(receipt_string)); break; case nsIMsgMdnGenerator::eDeleted: rv = GetStringFromName( NS_LITERAL_STRING("MdnDeletedReceipt").get(), getter_Copies(receipt_string)); break; case nsIMsgMdnGenerator::eDenied: rv = GetStringFromName( NS_LITERAL_STRING("MdnDeniedReceipt").get(), getter_Copies(receipt_string)); break; case nsIMsgMdnGenerator::eFailed: rv = GetStringFromName( NS_LITERAL_STRING("MdnFailedReceipt").get(), getter_Copies(receipt_string)); break; default: rv = NS_ERROR_INVALID_ARG; break; } if (NS_FAILED(rv)) return rv; receipt_string.AppendLiteral(" - "); char * encodedReceiptString = nsMsgI18NEncodeMimePartIIStr(NS_ConvertUTF16toUTF8(receipt_string).get(), PR_FALSE, "UTF-8", 0, conformToStandard); nsCString subject; m_headers->ExtractHeader(HEADER_SUBJECT, PR_FALSE, getter_Copies(subject)); convbuf = nsMsgI18NEncodeMimePartIIStr(subject.Length() ? subject.get() : "[no subject]", PR_FALSE, m_charset.get(), 0, conformToStandard); tmpBuffer = PR_smprintf("Subject: %s%s" CRLF, encodedReceiptString, (convbuf ? convbuf : (subject.Length() ? subject.get() : "[no subject]"))); PUSH_N_FREE_STRING(tmpBuffer); PR_Free(convbuf); PR_Free(encodedReceiptString); convbuf = nsMsgI18NEncodeMimePartIIStr(m_dntRrt.get(), PR_TRUE, m_charset.get(), 0, conformToStandard); tmpBuffer = PR_smprintf("To: %s" CRLF, convbuf ? convbuf : m_dntRrt.get()); PUSH_N_FREE_STRING(tmpBuffer); PR_Free(convbuf); // *** This is not in the spec. I am adding this so we could do // threading m_headers->ExtractHeader(HEADER_MESSAGE_ID, PR_FALSE, getter_Copies(m_messageId)); if (!m_messageId.IsEmpty()) { if (*m_messageId.get() == '<') tmpBuffer = PR_smprintf("References: %s" CRLF, m_messageId.get()); else tmpBuffer = PR_smprintf("References: <%s>" CRLF, m_messageId.get()); PUSH_N_FREE_STRING(tmpBuffer); } tmpBuffer = PR_smprintf("%s" CRLF, "MIME-Version: 1.0"); PUSH_N_FREE_STRING(tmpBuffer); tmpBuffer = PR_smprintf("Content-Type: multipart/report; \ report-type=disposition-notification;\r\n\tboundary=\"%s\"" CRLF CRLF, m_mimeSeparator.get()); PUSH_N_FREE_STRING(tmpBuffer); tmpBuffer = PR_smprintf("--%s" CRLF, m_mimeSeparator.get()); PUSH_N_FREE_STRING(tmpBuffer); tmpBuffer = PR_smprintf("Content-Type: text/plain; charset=UTF-8" CRLF); PUSH_N_FREE_STRING(tmpBuffer); tmpBuffer = PR_smprintf("Content-Transfer-Encoding: %s" CRLF CRLF, ENCODING_8BIT); PUSH_N_FREE_STRING(tmpBuffer); if (!firstPart1.IsEmpty()) { tmpBuffer = PR_smprintf("%s" CRLF CRLF, NS_ConvertUTF16toUTF8(firstPart1).get()); PUSH_N_FREE_STRING(tmpBuffer); } switch (m_disposeType) { case nsIMsgMdnGenerator::eDisplayed: rv = GetStringFromName( NS_LITERAL_STRING("MsgMdnDisplayed").get(), getter_Copies(firstPart2)); break; case nsIMsgMdnGenerator::eDispatched: rv = GetStringFromName( NS_LITERAL_STRING("MsgMdnDispatched").get(), getter_Copies(firstPart2)); break; case nsIMsgMdnGenerator::eProcessed: rv = GetStringFromName( NS_LITERAL_STRING("MsgMdnProcessed").get(), getter_Copies(firstPart2)); break; case nsIMsgMdnGenerator::eDeleted: rv = GetStringFromName( NS_LITERAL_STRING("MsgMdnDeleted").get(), getter_Copies(firstPart2)); break; case nsIMsgMdnGenerator::eDenied: rv = GetStringFromName( NS_LITERAL_STRING("MsgMdnDenied").get(), getter_Copies(firstPart2)); break; case nsIMsgMdnGenerator::eFailed: rv = GetStringFromName( NS_LITERAL_STRING("MsgMdnFailed").get(), getter_Copies(firstPart2)); break; default: rv = NS_ERROR_INVALID_ARG; break; } if (NS_FAILED(rv)) return rv; if (!firstPart2.IsEmpty()) { tmpBuffer = PR_smprintf("%s" CRLF CRLF, NS_ConvertUTF16toUTF8(firstPart2).get()); PUSH_N_FREE_STRING(tmpBuffer); } return rv; }
nsresult nsMsgMdnGenerator::CreateMdnMsg() { DEBUG_MDN("nsMsgMdnGenerator::CreateMdnMsg"); nsresult rv; if (!m_autoSend) { nsCOMPtr<nsIPrompt> dialog; rv = m_window->GetPromptDialog(getter_AddRefs(dialog)); if (NS_SUCCEEDED(rv)) { nsString wishToSend; nsString ignoreRequest; nsString sendReceipt; PRInt32 buttonPressed = 0; rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnWishToSend").get(), getter_Copies(wishToSend)); NS_ENSURE_SUCCESS(rv, rv); rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnIgnoreRequest").get(), getter_Copies(ignoreRequest)); NS_ENSURE_SUCCESS(rv, rv); rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnSendReceipt").get(), getter_Copies(sendReceipt)); NS_ENSURE_SUCCESS(rv, rv); // Default the dialog to "Ignore Request". rv = dialog->ConfirmEx(nsnull, wishToSend.get(), (nsIPrompt::BUTTON_POS_1_DEFAULT) + (nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_0) + (nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_1), sendReceipt.get(), ignoreRequest.get(), nsnull, nsnull, nsnull, &buttonPressed); NS_ENSURE_SUCCESS(rv, rv); m_reallySendMdn = !buttonPressed; // "Send Receipt" is in position 0 } } if (!m_reallySendMdn) return NS_OK; nsCOMPtr<nsIFile> tmpFile; rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "mdnmsg", getter_AddRefs(m_file)); NS_ENSURE_SUCCESS(rv, rv); rv = m_file->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); nsCOMPtr <nsILocalFile> localFile = do_QueryInterface(m_file); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewLocalFileOutputStream(getter_AddRefs(m_outputStream), localFile, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664); NS_ASSERTION(NS_SUCCEEDED(rv),"creating mdn: failed to output stream"); if (NS_FAILED(rv)) return NS_OK; rv = CreateFirstPart(); if (NS_SUCCEEDED(rv)) { rv = CreateSecondPart(); if (NS_SUCCEEDED(rv)) rv = CreateThirdPart(); } if (m_outputStream) { m_outputStream->Flush(); m_outputStream->Close(); } if (NS_FAILED(rv)) m_file->Remove(PR_FALSE); else rv = SendMdnMsg(); return NS_OK; }