From df12b41dabaf760250867417c6f52792fd87dffe Mon Sep 17 00:00:00 2001 From: "nhotta%netscape.com" Date: Mon, 11 Sep 2000 23:29:50 +0000 Subject: [PATCH] Added a callback to listen the pref change by UI, added a function to nsIDBFolderInfo to check if default charset is used, bug 50054, r=bienvenu. --- mailnews/base/util/nsMsgDBFolder.cpp | 5 +- mailnews/db/msgdb/public/nsIDBFolderInfo.idl | 1 + mailnews/db/msgdb/src/nsDBFolderInfo.cpp | 50 ++++++++++++++++++-- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/mailnews/base/util/nsMsgDBFolder.cpp b/mailnews/base/util/nsMsgDBFolder.cpp index 09ede30f0c0a..c08c39c0d2d7 100644 --- a/mailnews/base/util/nsMsgDBFolder.cpp +++ b/mailnews/base/util/nsMsgDBFolder.cpp @@ -463,7 +463,10 @@ nsresult nsMsgDBFolder::ReadDBFolderInfo(PRBool force) //folderInfo->GetImapTotalPendingMessages(&mNumPendingTotalMessages); //folderInfo->GetImapUnreadPendingMessages(&mNumPendingUnreadMessages); - folderInfo->GetCharacterSet(&mCharset); + PRBool defaultUsed; + folderInfo->GetCharacterSet2(&mCharset, &defaultUsed); + if (defaultUsed) + mCharset.AssignWithConversion(""); if (db) { PRBool hasnew; diff --git a/mailnews/db/msgdb/public/nsIDBFolderInfo.idl b/mailnews/db/msgdb/public/nsIDBFolderInfo.idl index 1f5cb82ae714..bb3bec0bb85b 100644 --- a/mailnews/db/msgdb/public/nsIDBFolderInfo.idl +++ b/mailnews/db/msgdb/public/nsIDBFolderInfo.idl @@ -63,6 +63,7 @@ interface nsIDBFolderInfo : nsISupports { void InitFromTransferInfo(in nsIDBFolderInfo transferInfo); [noscript] void GetCharacterSet(in nsString result); + [noscript] void GetCharacterSet2(in nsString result, out boolean usedDefault); [noscript] void SetCharacterSet(in nsString result); void GetCharPtrCharacterSet(out string result); diff --git a/mailnews/db/msgdb/src/nsDBFolderInfo.cpp b/mailnews/db/msgdb/src/nsDBFolderInfo.cpp index cac6bd17fc46..732b2a4ba947 100644 --- a/mailnews/db/msgdb/src/nsDBFolderInfo.cpp +++ b/mailnews/db/msgdb/src/nsDBFolderInfo.cpp @@ -51,8 +51,26 @@ static const char * kVersionColumnName = "version"; static const char * kCharacterSetColumnName = "charSet"; static const char * kLocaleColumnName = "locale"; +static const char * MAILNEWS_VIEW_DEFAULT_CHARSET = "mailnews.view_default_charset"; static nsString gDefaultCharacterSet; // default charset +static int PR_CALLBACK defaultCharacterSetChanged(const char *prefName, void *closure) +{ + nsresult rv; + nsCOMPtr prefs = do_GetService(NS_PREF_PROGID, &rv); + if (NS_SUCCEEDED(rv)) + { + PRUnichar *prefCharset = nsnull; + rv = prefs->GetLocalizedUnicharPref(prefName, &prefCharset); + if (NS_SUCCEEDED(rv)) + { + gDefaultCharacterSet.Assign(prefCharset); + PR_Free(prefCharset); + } + } + return 0; +} + NS_IMPL_ADDREF(nsDBFolderInfo) NS_IMPL_RELEASE(nsDBFolderInfo) @@ -106,14 +124,15 @@ nsDBFolderInfo::nsDBFolderInfo(nsMsgDatabase *mdb) m_mdbTokensInitialized = FALSE; // Initialize a default charset to a pref default. - if (gDefaultCharacterSet.IsEmpty()) + nsresult rv; + nsCOMPtr prefs = do_GetService(NS_PREF_PROGID, &rv); + if (NS_SUCCEEDED(rv)) { - nsresult rv; - nsCOMPtr prefs = do_GetService(NS_PREF_PROGID, &rv); - if (NS_SUCCEEDED(rv)) + rv = prefs->RegisterCallback(MAILNEWS_VIEW_DEFAULT_CHARSET, defaultCharacterSetChanged, NULL); + if (gDefaultCharacterSet.IsEmpty()) { PRUnichar *prefCharset = nsnull; - rv = prefs->GetLocalizedUnicharPref("mailnews.view_default_charset", &prefCharset); + rv = prefs->GetLocalizedUnicharPref(MAILNEWS_VIEW_DEFAULT_CHARSET, &prefCharset); if (NS_SUCCEEDED(rv)) { gDefaultCharacterSet.Assign(prefCharset); @@ -144,6 +163,11 @@ nsDBFolderInfo::nsDBFolderInfo(nsMsgDatabase *mdb) nsDBFolderInfo::~nsDBFolderInfo() { + nsresult rv; + nsCOMPtr prefs = do_GetService(NS_PREF_PROGID, &rv); + if (NS_SUCCEEDED(rv)) + rv = prefs->UnregisterCallback(MAILNEWS_VIEW_DEFAULT_CHARSET, defaultCharacterSetChanged, NULL); + if (m_mdb) { if (m_mdbTable) @@ -580,6 +604,22 @@ nsDBFolderInfo::GetCharacterSet(nsString *result) return rv; } +NS_IMETHODIMP +nsDBFolderInfo::GetCharacterSet2(nsString *result, PRBool *usedDefault) +{ + nsresult rv = GetProperty(kCharacterSetColumnName, result); + + *usedDefault = FALSE; + + if (NS_SUCCEEDED(rv) && result->IsEmpty()) + { + result->Assign(gDefaultCharacterSet.GetUnicode()); + *usedDefault = TRUE; + } + + return rv; +} + NS_IMETHODIMP nsDBFolderInfo::GetCharPtrCharacterSet(char **result) {