From 11edc27a4834af2caf2262f2c8f98da56e481b2d Mon Sep 17 00:00:00 2001 From: Rachel Martin Date: Thu, 17 Feb 2022 12:28:23 +0200 Subject: [PATCH] Bug 1751784 - Re-initialize static C++ variables in nsMsgDBFolder.cpp and nsMsgDBView.cpp when locale changes. r=benc --HG-- extra : amend_source : c280a960d023b6604b6c482047885a373a98f990 --- mail/components/MailGlue.jsm | 12 ++ mailnews/base/public/nsIMsgDBView.idl | 13 ++ mailnews/base/public/nsIMsgFolder.idl | 4 + mailnews/base/public/nsMsgBaseCID.h | 12 ++ mailnews/base/src/ServiceList.h | 2 + mailnews/base/src/Services.cpp | 1 + mailnews/base/src/nsMsgDBFolder.cpp | 14 ++- mailnews/base/src/nsMsgDBFolder.h | 1 + mailnews/base/src/nsMsgDBView.cpp | 166 +++++++++++++------------- mailnews/base/src/nsMsgDBView.h | 56 ++++++--- mailnews/base/src/nsMsgGroupView.cpp | 54 +++------ mailnews/base/src/nsMsgGroupView.h | 8 -- mailnews/build/nsMailModule.cpp | 4 + 13 files changed, 192 insertions(+), 155 deletions(-) diff --git a/mail/components/MailGlue.jsm b/mail/components/MailGlue.jsm index c7f337f32c..51078c8e7f 100644 --- a/mail/components/MailGlue.jsm +++ b/mail/components/MailGlue.jsm @@ -343,6 +343,9 @@ MailGlue.prototype = { Cc["@mozilla.org/msgFolder/msgFolderService;1"] .getService(Ci.nsIMsgFolderService) .initializeFolderStrings(); + Cc["@mozilla.org/msgDBView/msgDBViewService;1"] + .getService(Ci.nsIMsgDBViewService) + .initializeDBViewStrings(); this._beforeUIStartup(); break; case "mail-startup-done": @@ -356,6 +359,15 @@ MailGlue.prototype = { Cc["@mozilla.org/msgFolder/msgFolderService;1"] .getService(Ci.nsIMsgFolderService) .initializeFolderStrings(); + Cc["@mozilla.org/msgDBView/msgDBViewService;1"] + .getService(Ci.nsIMsgDBViewService) + .initializeDBViewStrings(); + let windows = Services.wm.getEnumerator("mail:3pane"); + while (windows.hasMoreElements()) { + let win = windows.getNext(); + win.document.getElementById("threadTree")?.invalidate(); + } + // XXX TODO: Work required here to refresh the folder tree. break; case "handle-xul-text-link": this._handleLink(aSubject, aData); diff --git a/mailnews/base/public/nsIMsgDBView.idl b/mailnews/base/public/nsIMsgDBView.idl index 80d1c27bad..a2695e19a2 100644 --- a/mailnews/base/public/nsIMsgDBView.idl +++ b/mailnews/base/public/nsIMsgDBView.idl @@ -196,6 +196,19 @@ interface nsMsgNavigationType : nsISupports const nsMsgNavigationTypeValue toggleSubthreadKilled = 23; }; +/* + * The contract ID for this component is @mozilla.org/msgDBView/msgDBViewService;1. + */ +[scriptable, uuid(bcf6afbe-7d4f-11ec-9092-eb4fed0a5aaa)] +interface nsIMsgDBViewService : nsISupports +{ + /** + * JS-callable service to initialize static variables in nsMsgDBView.cpp + * upon initialization or when locale changes. + */ + void initializeDBViewStrings(); +}; + [scriptable, uuid(fe8a2326-4dd0-11e5-8b8a-206a8aa7a25c)] interface nsIMsgDBView : nsISupports { diff --git a/mailnews/base/public/nsIMsgFolder.idl b/mailnews/base/public/nsIMsgFolder.idl index e4222ede11..ed704ad676 100644 --- a/mailnews/base/public/nsIMsgFolder.idl +++ b/mailnews/base/public/nsIMsgFolder.idl @@ -34,6 +34,10 @@ typedef long nsMsgDispositionState; [scriptable, uuid(5639c204-48ac-4115-897f-3b16821fe118)] interface nsIMsgFolderService : nsISupports { + /** + * JS-callable service to initialize static variables in nsMsgDBFolder.cpp + * upon initialization or when locale changes. + */ void initializeFolderStrings(); }; diff --git a/mailnews/base/public/nsMsgBaseCID.h b/mailnews/base/public/nsMsgBaseCID.h index 2c4e83ec05..c31218fc36 100644 --- a/mailnews/base/public/nsMsgBaseCID.h +++ b/mailnews/base/public/nsMsgBaseCID.h @@ -356,6 +356,18 @@ } \ } +// +// nsMsgDBViewService +// +#define NS_MSGDBVIEWSERVICE_CONTRACTID \ + "@mozilla.org/msgDBView/msgDBViewService;1" +#define NS_MSGDBVIEWSERVICE_CID \ + { \ + 0xbcf6afbe, 0x7d4f, 0x11ec, { \ + 0x90, 0x92, 0xeb, 0x4f, 0xed, 0x0a, 0x5a, 0xaa \ + } \ + } + // // nsMsgAccountManager // diff --git a/mailnews/base/src/ServiceList.h b/mailnews/base/src/ServiceList.h index 45e5f35e7a..e506691d8b 100644 --- a/mailnews/base/src/ServiceList.h +++ b/mailnews/base/src/ServiceList.h @@ -13,6 +13,8 @@ MOZ_SERVICE(CopyService, nsIMsgCopyService, "@mozilla.org/messenger/messagecopyservice;1") MOZ_SERVICE(DBService, nsIMsgDBService, "@mozilla.org/msgDatabase/msgDBService;1") +MOZ_SERVICE(DBViewService, nsIMsgDBViewService, + "@mozilla.org/msgDBView/msgDBViewService;1") MOZ_SERVICE(FolderService, nsIMsgFolderService, "@mozilla.org/msgFolder/msgFolderService;1") MOZ_SERVICE(FilterService, nsIMsgFilterService, diff --git a/mailnews/base/src/Services.cpp b/mailnews/base/src/Services.cpp index da0c7fba4c..bc560bb52b 100644 --- a/mailnews/base/src/Services.cpp +++ b/mailnews/base/src/Services.cpp @@ -19,6 +19,7 @@ #include "nsIMsgComposeService.h" #include "nsIMsgCopyService.h" #include "nsIMsgDatabase.h" +#include "nsIMsgDBView.h" #include "nsIMsgFilterService.h" #include "nsIMsgFolderNotificationService.h" #include "nsIMsgHeaderParser.h" diff --git a/mailnews/base/src/nsMsgDBFolder.cpp b/mailnews/base/src/nsMsgDBFolder.cpp index f0ac827a91..8b4b27523b 100644 --- a/mailnews/base/src/nsMsgDBFolder.cpp +++ b/mailnews/base/src/nsMsgDBFolder.cpp @@ -155,6 +155,7 @@ NS_IMPL_ISUPPORTS(nsMsgFolderService, nsIMsgFolderService) NS_IMETHODIMP nsMsgFolderService::InitializeFolderStrings() { nsMsgDBFolder::initializeStrings(); nsMsgDBFolder::gInitializeStringsDone = true; + nsMsgDBFolder::gIsEnglishApp = -1; return NS_OK; } @@ -174,6 +175,10 @@ nsString nsMsgDBFolder::kLocalizedBrandShortName; nsrefcnt nsMsgDBFolder::mInstanceCount = 0; bool nsMsgDBFolder::gInitializeStringsDone = false; +// This is used in `nonEnglishApp()` to determine localised +// folders strings. +// -1: not retrieved yet, 1: English, 0: non-English. +int nsMsgDBFolder::gIsEnglishApp; // We define strings for folder properties and events. // Properties: @@ -3109,18 +3114,15 @@ NS_IMETHODIMP nsMsgDBFolder::GetPrettyName(nsAString& name) { return GetName(name); } -// -1: not retrieved yet, 1: English, 0: non-English. -static int isEnglish = -1; - static bool nonEnglishApp() { - if (isEnglish == -1) { + if (nsMsgDBFolder::gIsEnglishApp == -1) { nsAutoCString locale; mozilla::intl::LocaleService::GetInstance()->GetAppLocaleAsBCP47(locale); - isEnglish = + nsMsgDBFolder::gIsEnglishApp = (locale.EqualsLiteral("en") || StringBeginsWith(locale, "en-"_ns)) ? 1 : 0; } - return isEnglish ? false : true; + return nsMsgDBFolder::gIsEnglishApp ? false : true; } static bool hasTrashName(const nsAString& name) { diff --git a/mailnews/base/src/nsMsgDBFolder.h b/mailnews/base/src/nsMsgDBFolder.h index 3946e53682..61d5532f40 100644 --- a/mailnews/base/src/nsMsgDBFolder.h +++ b/mailnews/base/src/nsMsgDBFolder.h @@ -114,6 +114,7 @@ class nsMsgDBFolder : public nsSupportsWeakReference, nsresult GetMsgPreviewTextFromStream(nsIMsgDBHdr* msgHdr, nsIInputStream* stream); nsresult HandleAutoCompactEvent(nsIMsgWindow* aMsgWindow); + static int gIsEnglishApp; protected: virtual ~nsMsgDBFolder(); diff --git a/mailnews/base/src/nsMsgDBView.cpp b/mailnews/base/src/nsMsgDBView.cpp index 75c6d24425..be6ac6d593 100644 --- a/mailnews/base/src/nsMsgDBView.cpp +++ b/mailnews/base/src/nsMsgDBView.cpp @@ -52,23 +52,35 @@ #include "mozilla/intl/AppDateTimeFormat.h" using namespace mozilla::mailnews; -nsrefcnt nsMsgDBView::gInstanceCount = 0; -char16_t* nsMsgDBView::kHighestPriorityString = nullptr; -char16_t* nsMsgDBView::kHighPriorityString = nullptr; -char16_t* nsMsgDBView::kLowestPriorityString = nullptr; -char16_t* nsMsgDBView::kLowPriorityString = nullptr; -char16_t* nsMsgDBView::kNormalPriorityString = nullptr; -char16_t* nsMsgDBView::kReadString = nullptr; -char16_t* nsMsgDBView::kRepliedString = nullptr; -char16_t* nsMsgDBView::kForwardedString = nullptr; -char16_t* nsMsgDBView::kRedirectedString = nullptr; -char16_t* nsMsgDBView::kNewString = nullptr; +nsString nsMsgDBView::kHighestPriorityString; +nsString nsMsgDBView::kHighPriorityString; +nsString nsMsgDBView::kLowestPriorityString; +nsString nsMsgDBView::kLowPriorityString; +nsString nsMsgDBView::kNormalPriorityString; +nsString nsMsgDBView::kReadString; +nsString nsMsgDBView::kRepliedString; +nsString nsMsgDBView::kForwardedString; +nsString nsMsgDBView::kRedirectedString; +nsString nsMsgDBView::kNewString; + +nsString nsMsgDBView::kTodayString; +nsString nsMsgDBView::kYesterdayString; +nsString nsMsgDBView::kLastWeekString; +nsString nsMsgDBView::kTwoWeeksAgoString; +nsString nsMsgDBView::kOldMailString; +nsString nsMsgDBView::kFutureDateString; + +bool nsMsgDBView::m_dateFormatsInitialized = false; nsDateFormatSelectorComm nsMsgDBView::m_dateFormatDefault = kDateFormatShort; nsDateFormatSelectorComm nsMsgDBView::m_dateFormatThisWeek = kDateFormatShort; nsDateFormatSelectorComm nsMsgDBView::m_dateFormatToday = kDateFormatNone; +nsString nsMsgDBView::m_connectorPattern; +nsCOMPtr nsMsgDBView::mMessengerStringBundle; +nsString nsMsgDBView::mLabelPrefDescriptions[PREF_LABELS_MAX]; + static const uint32_t kMaxNumSortColumns = 2; static void GetCachedName(const nsCString& unparsedString, @@ -94,6 +106,19 @@ class viewSortInfo { bool ascendingSort; }; +NS_IMPL_ISUPPORTS(nsMsgDBViewService, nsIMsgDBViewService) +NS_IMETHODIMP nsMsgDBViewService::InitializeDBViewStrings() { + nsMsgDBView::InitializeLiterals(); + nsMsgDBView::InitLabelStrings(); + nsMsgDBView::m_connectorPattern.Truncate(); + nsMsgDBView::mMessengerStringBundle = nullptr; + // Initialize date display format. + if (!nsMsgDBView::m_dateFormatsInitialized) { + nsMsgDBView::InitDisplayFormats(); + } + return NS_OK; +} + NS_IMPL_ADDREF(nsMsgDBView) NS_IMPL_RELEASE(nsMsgDBView) @@ -142,48 +167,32 @@ nsMsgDBView::nsMsgDBView() { mRemovingRow = false; m_saveRestoreSelectionDepth = 0; mRecentlyDeletedArrayIndex = 0; - // Initialize any static atoms or unicode strings. - if (gInstanceCount == 0) { - InitializeLiterals(); - InitDisplayFormats(); - } - - InitLabelStrings(); - gInstanceCount++; } void nsMsgDBView::InitializeLiterals() { // Priority strings. - kHighestPriorityString = GetString(u"priorityHighest"); - kHighPriorityString = GetString(u"priorityHigh"); - kLowestPriorityString = GetString(u"priorityLowest"); - kLowPriorityString = GetString(u"priorityLow"); - kNormalPriorityString = GetString(u"priorityNormal"); + GetString(u"priorityHighest", kHighestPriorityString); + GetString(u"priorityHigh", kHighPriorityString); + GetString(u"priorityLowest", kLowestPriorityString); + GetString(u"priorityLow", kLowPriorityString); + GetString(u"priorityNormal", kNormalPriorityString); - kReadString = GetString(u"read"); - kRepliedString = GetString(u"replied"); - kForwardedString = GetString(u"forwarded"); - kRedirectedString = GetString(u"redirected"); - kNewString = GetString(u"new"); + GetString(u"read", kReadString); + GetString(u"replied", kRepliedString); + GetString(u"forwarded", kForwardedString); + GetString(u"redirected", kRedirectedString); + GetString(u"new", kNewString); + + GetString(u"today", kTodayString); + GetString(u"yesterday", kYesterdayString); + GetString(u"last7Days", kLastWeekString); + GetString(u"last14Days", kTwoWeeksAgoString); + GetString(u"older", kOldMailString); + GetString(u"futureDate", kFutureDateString); } nsMsgDBView::~nsMsgDBView() { if (m_db) m_db->RemoveListener(this); - - gInstanceCount--; - if (gInstanceCount <= 0) { - free(kHighestPriorityString); - free(kHighPriorityString); - free(kLowestPriorityString); - free(kLowPriorityString); - free(kNormalPriorityString); - - free(kReadString); - free(kRepliedString); - free(kForwardedString); - free(kRedirectedString); - free(kNewString); - } } nsresult nsMsgDBView::InitLabelStrings() { @@ -193,34 +202,33 @@ nsresult nsMsgDBView::InitLabelStrings() { for (int32_t i = 0; i < PREF_LABELS_MAX; i++) { prefString.Assign(PREF_LABELS_DESCRIPTION); prefString.AppendInt(i + 1); - rv = GetPrefLocalizedString(prefString.get(), mLabelPrefDescriptions[i]); + rv = GetPrefLocalizedString(prefString.get(), + nsMsgDBView::mLabelPrefDescriptions[i]); } return rv; } // Helper function used to fetch strings from the messenger string bundle -char16_t* nsMsgDBView::GetString(const char16_t* aStringName) { +void nsMsgDBView::GetString(const char16_t* aStringName, nsAString& aValue) { nsresult res = NS_ERROR_UNEXPECTED; - nsAutoString str; - if (!mMessengerStringBundle) { + if (!nsMsgDBView::mMessengerStringBundle) { static const char propertyURL[] = MESSENGER_STRING_URL; nsCOMPtr sBundleService = mozilla::services::GetStringBundleService(); if (sBundleService) res = sBundleService->CreateBundle( - propertyURL, getter_AddRefs(mMessengerStringBundle)); + propertyURL, getter_AddRefs(nsMsgDBView::mMessengerStringBundle)); } - if (mMessengerStringBundle) + if (nsMsgDBView::mMessengerStringBundle) res = mMessengerStringBundle->GetStringFromName( - NS_ConvertUTF16toUTF8(aStringName).get(), str); + NS_ConvertUTF16toUTF8(aStringName).get(), aValue); - if (NS_SUCCEEDED(res)) - return ToNewUnicode(str); - else - return NS_xstrdup(aStringName); + if (NS_FAILED(res)) { + aValue = aStringName; + } } // Helper function used to fetch localized strings from the prefs @@ -391,7 +399,9 @@ nsresult nsMsgDBView::FetchAuthor(nsIMsgDBHdr* aHdr, nsAString& aSenderString) { if (multipleAuthors) { aSenderString.AppendLiteral(" "); - aSenderString.Append(GetString(u"andOthers")); + nsAutoString val; + GetString(u"andOthers", val); + aSenderString.Append(val); } UpdateCachedName(aHdr, "sender_name", aSenderString); @@ -629,12 +639,7 @@ nsresult nsMsgDBView::FetchDate(nsIMsgDBHdr* aHdr, nsAString& aDateString, components, &explodedMsgTime, weekdayString); NS_ENSURE_SUCCESS(rv, rv); - // Note that this `static` value will need revisiting once M-C - // can switch locales without a restart of the application. - // For now, it's a cheap cache to avoid getting locale and - // connector pattern all the time. - static nsString connectorPattern; - if (connectorPattern.IsEmpty()) { + if (nsMsgDBView::m_connectorPattern.IsEmpty()) { nsAutoCString locale; AutoTArray regionalPrefsLocales; mozilla::intl::LocaleService::GetInstance()->GetRegionalPrefsLocales( @@ -643,10 +648,10 @@ nsresult nsMsgDBView::FetchDate(nsIMsgDBHdr* aHdr, nsAString& aDateString, nsAutoCString str; mozilla::intl::OSPreferences::GetInstance() ->GetDateTimeConnectorPattern(locale, str); - connectorPattern = NS_ConvertUTF8toUTF16(str); + nsMsgDBView::m_connectorPattern = NS_ConvertUTF8toUTF16(str); } - nsAutoString pattern(connectorPattern); + nsAutoString pattern(nsMsgDBView::m_connectorPattern); int32_t ind = pattern.Find(u"{1}"_ns); if (ind != kNotFound) { pattern.Replace(ind, 3, weekdayString); @@ -860,7 +865,7 @@ nsresult nsMsgDBView::FetchLabel(nsIMsgDBHdr* aHdr, nsAString& aLabelString) { } // We need to subtract 1 because mLabelPrefDescriptions is 0 based. - aLabelString = mLabelPrefDescriptions[label - 1]; + aLabelString = nsMsgDBView::mLabelPrefDescriptions[label - 1]; return NS_OK; } @@ -1691,17 +1696,13 @@ nsMsgDBView::GetCellValue(int32_t aRow, nsTreeColumn* aCol, nsAString& aValue) { case 'a': if (colID.EqualsLiteral("attachmentCol") && flags & nsMsgMessageFlags::Attachment) { - nsString tmp_str; - tmp_str.Adopt(GetString(u"messageHasAttachment")); - aValue.Assign(tmp_str); + GetString(u"messageHasAttachment", aValue); } break; case 'f': if (colID.EqualsLiteral("flaggedCol") && flags & nsMsgMessageFlags::Marked) { - nsString tmp_str; - tmp_str.Adopt(GetString(u"messageHasFlag")); - aValue.Assign(tmp_str); + GetString(u"messageHasFlag", aValue); } break; case 'j': @@ -1727,11 +1728,10 @@ nsMsgDBView::GetCellValue(int32_t aRow, nsTreeColumn* aCol, nsAString& aValue) { if (isContainer) { IsContainerEmpty(aRow, &isContainerEmpty); if (!isContainerEmpty) { - nsString tmp_str; IsContainerOpen(aRow, &isContainerOpen); - tmp_str.Adopt(GetString(isContainerOpen ? u"messageExpanded" - : u"messageCollapsed")); - aValue.Assign(tmp_str); + GetString( + isContainerOpen ? u"messageExpanded" : u"messageCollapsed", + aValue); } } } @@ -1739,9 +1739,7 @@ nsMsgDBView::GetCellValue(int32_t aRow, nsTreeColumn* aCol, nsAString& aValue) { case 'u': if (colID.EqualsLiteral("unreadButtonColHeader") && !(flags & nsMsgMessageFlags::Read)) { - nsString tmp_str; - tmp_str.Adopt(GetString(u"messageUnread")); - aValue.Assign(tmp_str); + GetString(u"messageUnread", aValue); } break; default: @@ -3114,11 +3112,11 @@ nsresult nsMsgDBView::DeleteMessages(nsIMsgWindow* window, nsString confirmString; nsString checkboxText; nsString buttonApplyNowText; - dialogTitle.Adopt(GetString(u"confirmMsgDelete.title")); - checkboxText.Adopt(GetString(u"confirmMsgDelete.dontAsk.label")); - buttonApplyNowText.Adopt(GetString(u"confirmMsgDelete.delete.label")); + GetString(u"confirmMsgDelete.title", dialogTitle); + GetString(u"confirmMsgDelete.dontAsk.label", checkboxText); + GetString(u"confirmMsgDelete.delete.label", buttonApplyNowText); - confirmString.Adopt(GetString(warningName.get())); + GetString(warningName.get(), confirmString); const uint32_t buttonFlags = (nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_0) + @@ -7438,9 +7436,7 @@ static void getDateFormatPref(nsIPrefBranch *_prefBranch, } nsresult nsMsgDBView::InitDisplayFormats() { - m_dateFormatDefault = kDateFormatShort; - m_dateFormatThisWeek = kDateFormatShort; - m_dateFormatToday = kDateFormatNone; + m_dateFormatsInitialized = true; nsresult rv = NS_OK; nsCOMPtr prefs = diff --git a/mailnews/base/src/nsMsgDBView.h b/mailnews/base/src/nsMsgDBView.h index 8a796b2f6f..8d5247ee29 100644 --- a/mailnews/base/src/nsMsgDBView.h +++ b/mailnews/base/src/nsMsgDBView.h @@ -85,6 +85,17 @@ struct IdKey : public IdUint32 { nsTArray key; }; +class nsMsgDBViewService final : public nsIMsgDBViewService { + public: + NS_DECL_ISUPPORTS + NS_DECL_NSIMSGDBVIEWSERVICE + + nsMsgDBViewService(){}; + + protected: + ~nsMsgDBViewService(){}; +}; + // This is an abstract implementation class. // The actual view objects will be instances of sub-classes of this class. class nsMsgDBView : public nsIMsgDBView, @@ -92,6 +103,7 @@ class nsMsgDBView : public nsIMsgDBView, public nsITreeView, public nsIJunkMailClassificationListener { public: + friend class nsMsgDBViewService; nsMsgDBView(); NS_DECL_ISUPPORTS @@ -112,19 +124,25 @@ class nsMsgDBView : public nsIMsgDBView, protected: virtual ~nsMsgDBView(); - static nsrefcnt gInstanceCount; + static nsString kHighestPriorityString; + static nsString kHighPriorityString; + static nsString kLowestPriorityString; + static nsString kLowPriorityString; + static nsString kNormalPriorityString; - static char16_t* kHighestPriorityString; - static char16_t* kHighPriorityString; - static char16_t* kLowestPriorityString; - static char16_t* kLowPriorityString; - static char16_t* kNormalPriorityString; + static nsString kReadString; + static nsString kRepliedString; + static nsString kForwardedString; + static nsString kRedirectedString; + static nsString kNewString; - static char16_t* kReadString; - static char16_t* kRepliedString; - static char16_t* kForwardedString; - static char16_t* kRedirectedString; - static char16_t* kNewString; + // Used for group views. + static nsString kTodayString; + static nsString kYesterdayString; + static nsString kLastWeekString; + static nsString kTwoWeeksAgoString; + static nsString kOldMailString; + static nsString kFutureDateString; RefPtr mTree; nsCOMPtr mJSTree; @@ -392,16 +410,17 @@ class nsMsgDBView : public nsIMsgDBView, bool* resultToggleState); bool OfflineMsgSelected(nsTArray const& selection); bool NonDummyMsgSelected(nsTArray const& selection); - char16_t* GetString(const char16_t* aStringName); - nsresult GetPrefLocalizedString(const char* aPrefName, nsString& aResult); + static void GetString(const char16_t* aStringName, nsAString& aValue); + static nsresult GetPrefLocalizedString(const char* aPrefName, + nsString& aResult); nsresult AppendKeywordProperties(const nsACString& keywords, nsAString& properties, bool* tagAdded); - nsresult InitLabelStrings(void); + static nsresult InitLabelStrings(void); nsresult CopyDBView(nsMsgDBView* aNewMsgDBView, nsIMessenger* aMessengerInstance, nsIMsgWindow* aMsgWindow, nsIMsgDBViewCommandUpdater* aCmdUpdater); - void InitializeLiterals(); + static void InitializeLiterals(); virtual int32_t FindLevelInThread(nsIMsgDBHdr* msgHdr, nsMsgViewIndex startOfThread, nsMsgViewIndex viewIndex); @@ -474,10 +493,10 @@ class nsMsgDBView : public nsIMsgDBView, nsWeakPtr mMsgWindowWeak; // We push command update notifications to the UI from this. nsCOMPtr mCommandUpdater; - nsCOMPtr mMessengerStringBundle; + static nsCOMPtr mMessengerStringBundle; // Used for the preference labels. - nsString mLabelPrefDescriptions[PREF_LABELS_MAX]; + static nsString mLabelPrefDescriptions[PREF_LABELS_MAX]; nsString mLabelPrefColors[PREF_LABELS_MAX]; // Used to determine when to start and end junk plugin batches. @@ -521,9 +540,12 @@ class nsMsgDBView : public nsIMsgDBView, static nsresult InitDisplayFormats(); private: + static bool m_dateFormatsInitialized; static nsDateFormatSelectorComm m_dateFormatDefault; static nsDateFormatSelectorComm m_dateFormatThisWeek; static nsDateFormatSelectorComm m_dateFormatToday; + static nsString m_connectorPattern; + bool ServerSupportsFilterAfterTheFact(); nsresult PerformActionsOnJunkMsgs(bool msgsAreJunk); diff --git a/mailnews/base/src/nsMsgGroupView.cpp b/mailnews/base/src/nsMsgGroupView.cpp index 3a8b74af7c..2bfd999a23 100644 --- a/mailnews/base/src/nsMsgGroupView.cpp +++ b/mailnews/base/src/nsMsgGroupView.cpp @@ -759,7 +759,6 @@ nsMsgGroupView::CellTextForColumn(int32_t aRow, const nsAString& aColumnName, bool rcvDate = false; msgHdr->GetFlags(&flags); aValue.Truncate(); - nsString tmp_str; switch (m_sortType) { case nsMsgViewSortType::byReceived: rcvDate = true; @@ -769,41 +768,23 @@ nsMsgGroupView::CellTextForColumn(int32_t aRow, const nsAString& aColumnName, GetAgeBucketValue(msgHdr, &ageBucket, rcvDate); switch (ageBucket) { case 1: - if (m_kTodayString.IsEmpty()) - m_kTodayString.Adopt(GetString(u"today")); - - aValue.Assign(m_kTodayString); + aValue.Assign(nsMsgDBView::kTodayString); break; case 2: - if (m_kYesterdayString.IsEmpty()) - m_kYesterdayString.Adopt(GetString(u"yesterday")); - - aValue.Assign(m_kYesterdayString); + aValue.Assign(nsMsgDBView::kYesterdayString); break; case 3: - if (m_kLastWeekString.IsEmpty()) - m_kLastWeekString.Adopt(GetString(u"last7Days")); - - aValue.Assign(m_kLastWeekString); + aValue.Assign(nsMsgDBView::kLastWeekString); break; case 4: - if (m_kTwoWeeksAgoString.IsEmpty()) - m_kTwoWeeksAgoString.Adopt(GetString(u"last14Days")); - - aValue.Assign(m_kTwoWeeksAgoString); + aValue.Assign(nsMsgDBView::kTwoWeeksAgoString); break; case 5: - if (m_kOldMailString.IsEmpty()) - m_kOldMailString.Adopt(GetString(u"older")); - - aValue.Assign(m_kOldMailString); + aValue.Assign(nsMsgDBView::kOldMailString); break; default: // Future date, error/spoofed. - if (m_kFutureDateString.IsEmpty()) - m_kFutureDateString.Adopt(GetString(u"futureDate")); - - aValue.Assign(m_kFutureDateString); + aValue.Assign(nsMsgDBView::kFutureDateString); break; } break; @@ -817,22 +798,19 @@ nsMsgGroupView::CellTextForColumn(int32_t aRow, const nsAString& aColumnName, case nsMsgViewSortType::byStatus: rv = FetchStatus(m_flags[aRow], aValue); if (aValue.IsEmpty()) { - tmp_str.Adopt(GetString(u"messagesWithNoStatus")); - aValue.Assign(tmp_str); + GetString(u"messagesWithNoStatus", aValue); } break; case nsMsgViewSortType::byTags: rv = FetchTags(msgHdr, aValue); if (aValue.IsEmpty()) { - tmp_str.Adopt(GetString(u"untaggedMessages")); - aValue.Assign(tmp_str); + GetString(u"untaggedMessages", aValue); } break; case nsMsgViewSortType::byPriority: FetchPriority(msgHdr, aValue); if (aValue.IsEmpty()) { - tmp_str.Adopt(GetString(u"noPriority")); - aValue.Assign(tmp_str); + GetString(u"noPriority", aValue); } break; case nsMsgViewSortType::byAccount: @@ -842,16 +820,14 @@ nsMsgGroupView::CellTextForColumn(int32_t aRow, const nsAString& aColumnName, FetchRecipients(msgHdr, aValue); break; case nsMsgViewSortType::byAttachments: - tmp_str.Adopt(GetString(flags & nsMsgMessageFlags::Attachment - ? u"attachments" - : u"noAttachments")); - aValue.Assign(tmp_str); + GetString(flags & nsMsgMessageFlags::Attachment ? u"attachments" + : u"noAttachments", + aValue); break; case nsMsgViewSortType::byFlagged: - tmp_str.Adopt(GetString(flags & nsMsgMessageFlags::Marked - ? u"groupFlagged" - : u"notFlagged")); - aValue.Assign(tmp_str); + GetString( + flags & nsMsgMessageFlags::Marked ? u"groupFlagged" : u"notFlagged", + aValue); break; // byLocation is a special case; we don't want to have duplicate // all this logic in nsMsgSearchDBView, and its hash key is what we diff --git a/mailnews/base/src/nsMsgGroupView.h b/mailnews/base/src/nsMsgGroupView.h index b7daca9c9e..eb1df8c4e9 100644 --- a/mailnews/base/src/nsMsgGroupView.h +++ b/mailnews/base/src/nsMsgGroupView.h @@ -74,14 +74,6 @@ class nsMsgGroupView : public nsMsgDBView { nsInterfaceHashtable m_groupsTable; PRExplodedTime m_lastCurExplodedTime{0}; bool m_dayChanged; - - private: - nsString m_kTodayString; - nsString m_kYesterdayString; - nsString m_kLastWeekString; - nsString m_kTwoWeeksAgoString; - nsString m_kOldMailString; - nsString m_kFutureDateString; }; #endif diff --git a/mailnews/build/nsMailModule.cpp b/mailnews/build/nsMailModule.cpp index 478519470d..a212ef45a9 100644 --- a/mailnews/build/nsMailModule.cpp +++ b/mailnews/build/nsMailModule.cpp @@ -297,6 +297,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgSearchDBView) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgXFVirtualFolderDBView) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgQuickSearchDBView) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgGroupView) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgDBViewService) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgOfflineManager) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgProgress) NS_GENERIC_FACTORY_CONSTRUCTOR(nsSpamSettings) @@ -339,6 +340,7 @@ NS_DEFINE_NAMED_CID(NS_MSGSEARCHDBVIEW_CID); NS_DEFINE_NAMED_CID(NS_MSGQUICKSEARCHDBVIEW_CID); NS_DEFINE_NAMED_CID(NS_MSG_XFVFDBVIEW_CID); NS_DEFINE_NAMED_CID(NS_MSG_GROUPDBVIEW_CID); +NS_DEFINE_NAMED_CID(NS_MSGDBVIEWSERVICE_CID); NS_DEFINE_NAMED_CID(NS_MSGOFFLINEMANAGER_CID); NS_DEFINE_NAMED_CID(NS_MSGPROGRESS_CID); NS_DEFINE_NAMED_CID(NS_SPAMSETTINGS_CID); @@ -691,6 +693,7 @@ const mozilla::Module::CIDEntry kMailNewsCIDs[] = { {&kNS_MSG_XFVFDBVIEW_CID, false, NULL, nsMsgXFVirtualFolderDBViewConstructor}, {&kNS_MSG_GROUPDBVIEW_CID, false, NULL, nsMsgGroupViewConstructor}, + {&kNS_MSGDBVIEWSERVICE_CID, false, NULL, nsMsgDBViewServiceConstructor}, {&kNS_MSGOFFLINEMANAGER_CID, false, NULL, nsMsgOfflineManagerConstructor}, {&kNS_MSGPROGRESS_CID, false, NULL, nsMsgProgressConstructor}, {&kNS_SPAMSETTINGS_CID, false, NULL, nsSpamSettingsConstructor}, @@ -879,6 +882,7 @@ const mozilla::Module::ContractIDEntry kMailNewsContracts[] = { {NS_MSGQUICKSEARCHDBVIEW_CONTRACTID, &kNS_MSGQUICKSEARCHDBVIEW_CID}, {NS_MSGXFVFDBVIEW_CONTRACTID, &kNS_MSG_XFVFDBVIEW_CID}, {NS_MSGGROUPDBVIEW_CONTRACTID, &kNS_MSG_GROUPDBVIEW_CID}, + {NS_MSGDBVIEWSERVICE_CONTRACTID, &kNS_MSGDBVIEWSERVICE_CID}, {NS_MSGOFFLINEMANAGER_CONTRACTID, &kNS_MSGOFFLINEMANAGER_CID}, {NS_MSGPROGRESS_CONTRACTID, &kNS_MSGPROGRESS_CID}, {NS_SPAMSETTINGS_CONTRACTID, &kNS_SPAMSETTINGS_CID},