From 9abc15ef200862db6d0fce3e8f80c0780f3d53e7 Mon Sep 17 00:00:00 2001 From: "cata%netscape.com" Date: Sat, 15 Jan 2000 01:44:21 +0000 Subject: [PATCH] Bug #3941. r=naoki Adding access APIs to the converter managers data. --- .../uconv/public/nsICharsetConverterManager.h | 7 +- intl/uconv/src/charsetData.properties | 11 +- intl/uconv/src/charsetTitles.properties | 2 + intl/uconv/src/nsCharsetConverterManager.cpp | 103 +++++++++++++++--- intl/uconv/src/nsUConvModule.cpp | 1 + 5 files changed, 101 insertions(+), 23 deletions(-) diff --git a/intl/uconv/public/nsICharsetConverterManager.h b/intl/uconv/public/nsICharsetConverterManager.h index f661b1c19bc..ef6b6019ae7 100644 --- a/intl/uconv/public/nsICharsetConverterManager.h +++ b/intl/uconv/public/nsICharsetConverterManager.h @@ -91,8 +91,11 @@ public: nsIUnicodeDecoder ** aResult) = 0; NS_IMETHOD GetDecoderList(nsString *** aResult, PRInt32 * aCount) = 0; NS_IMETHOD GetEncoderList(nsString *** aResult, PRInt32 * aCount) = 0; - NS_IMETHOD GetDecoderFlags(nsString * aName, PRInt32 * aFlags) = 0; - NS_IMETHOD GetEncoderFlags(nsString * aName, PRInt32 * aFlags) = 0; + NS_IMETHOD GetMIMEMailCharset(nsString * aCharset, nsString ** aResult) = 0; + NS_IMETHOD GetMIMEHeaderEncodingMethod(nsString * aCharset, + nsString ** aResult) = 0; + NS_IMETHOD GetCharsetData(nsString * aCharset, nsString * aProp, + nsString ** aResult) = 0; }; #endif /* nsICharsetConverterManager_h___ */ diff --git a/intl/uconv/src/charsetData.properties b/intl/uconv/src/charsetData.properties index 66625a7262b..0de6366139e 100644 --- a/intl/uconv/src/charsetData.properties +++ b/intl/uconv/src/charsetData.properties @@ -25,16 +25,17 @@ ## Format of this file: ## charset_name.notForBrowser = anything - specifies that this charset is ## not to be used in the browser +## +## charset_name.MIMEHeaderEncodingMethod = +## +## charset_name.MIMEMailCharset = -x-user-defined.notForBrowser = true t.61-8bit.notForBrowser = true utf-32le.notForBrowser = true utf-32be.notForBrowser = true utf-16le.notForBrowser = true utf-16be.notForBrowser = true x-imap4-modified-utf7.notForBrowser = true -x-viet-tcvn.notForBrowser = true -ibm866.notForBrowser = true x-u-escaped.notForBrowser = true us-ascii.notForBrowser = true x-obsoleted-euc-jp.notForBrowser = true @@ -43,3 +44,7 @@ x-obsoleted-shift_jis.notForBrowser = true hz-gb-2312.notForBrowser = true x-gbk.notForBrowser = true windows-936.notForBrowser = true + +utf-8.MIMEHeaderEncodingMethod = B + +utf-8.MIMEMailCharset = utf-8 diff --git a/intl/uconv/src/charsetTitles.properties b/intl/uconv/src/charsetTitles.properties index 307e9af6c53..c18265d8b44 100644 --- a/intl/uconv/src/charsetTitles.properties +++ b/intl/uconv/src/charsetTitles.properties @@ -75,3 +75,5 @@ iso-8859-6.title = Arabic (ISO-8859-6) iso-8859-8.title = Hebrew (ISO-8859-8) windows-1255.title = Hebrew (Windows-1255) windows-1256.title = Arabic (Windows-1256) +x-user-defined.title = User Defined +ibm866.title = IBM866 \ No newline at end of file diff --git a/intl/uconv/src/nsCharsetConverterManager.cpp b/intl/uconv/src/nsCharsetConverterManager.cpp index ac78a558f38..4acfd5b873a 100644 --- a/intl/uconv/src/nsCharsetConverterManager.cpp +++ b/intl/uconv/src/nsCharsetConverterManager.cpp @@ -26,6 +26,8 @@ #include "nsIRegistry.h" #include "nsIServiceManager.h" #include "nsICharsetConverterManager.h" +#include "nsIStringBundle.h" +#include "nsILocaleService.h" #include "nsUConvDll.h" // just for CIDs @@ -34,6 +36,10 @@ static NS_DEFINE_IID(kRegistryNodeIID, NS_IREGISTRYNODE_IID); static NS_DEFINE_CID(kRegistryCID, NS_REGISTRY_CID); +static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID); +static NS_DEFINE_CID(kLocaleServiceCID, NS_LOCALESERVICE_CID); + +#define DATA_BUNDLE_REGISTRY_KEY "software/netscape/intl/xuconv/data/" //---------------------------------------------------------------------------- // Class nsObject [declaration] @@ -99,6 +105,7 @@ private: nsObjectArray mDecoderArray; nsObjectArray mEncoderArray; + nsIStringBundle * mDataBundle; /** * Takes charset information from Registry and puts it into those arrays. @@ -115,12 +122,18 @@ private: nsresult GetConverterList(nsObjectArray * aArray, nsString *** aResult, PRInt32 * aCount); + nsresult LoadExtensibleBundle(const char* aRegistryKey, + nsIStringBundle ** aResult); + static nsresult RegisterConverterTitles(nsIRegistry * aRegistry, char * aRegistryPath); static nsresult RegisterConverterData(nsIRegistry * aRegistry, char * aRegistryPath); + nsresult GetBundleValue(nsIStringBundle * aBundle, nsString * aName, + nsString * aProp, nsString ** aResult); + public: nsCharsetConverterManager(); @@ -137,8 +150,11 @@ public: nsIUnicodeDecoder ** aResult); NS_IMETHOD GetDecoderList(nsString *** aResult, PRInt32 * aCount); NS_IMETHOD GetEncoderList(nsString *** aResult, PRInt32 * aCount); - NS_IMETHOD GetDecoderFlags(nsString * aName, PRInt32 * aFlags); - NS_IMETHOD GetEncoderFlags(nsString * aName, PRInt32 * aFlags); + NS_IMETHOD GetCharsetData(nsString * aCharset, nsString * aProp, + nsString ** aResult); + NS_IMETHOD GetMIMEMailCharset(nsString * aCharset, nsString ** aResult); + NS_IMETHOD GetMIMEHeaderEncodingMethod(nsString * aCharset, nsString ** + aResult); }; //---------------------------------------------------------------------------- @@ -268,6 +284,7 @@ nsConverterInfo::~nsConverterInfo() NS_IMPL_ISUPPORTS(nsCharsetConverterManager, nsICharsetConverterManager::GetIID()); nsCharsetConverterManager::nsCharsetConverterManager() +:mDataBundle(NULL) { NS_INIT_REFCNT(); PR_AtomicIncrement(&g_InstanceCount); @@ -279,6 +296,7 @@ nsCharsetConverterManager::nsCharsetConverterManager() nsCharsetConverterManager::~nsCharsetConverterManager() { + NS_IF_RELEASE(mDataBundle); PR_AtomicDecrement(&g_InstanceCount); } @@ -503,6 +521,48 @@ nsresult nsCharsetConverterManager::GetConverterList( // to the existing ones } +nsresult nsCharsetConverterManager::LoadExtensibleBundle( + const char* aRegistryKey, + nsIStringBundle ** aResult) +{ + nsresult res = NS_OK; + nsCOMPtr locale = nsnull; + + NS_WITH_SERVICE(nsIStringBundleService, sbServ, kStringBundleServiceCID, &res); + if (NS_FAILED(res)) return res; + + NS_WITH_SERVICE(nsILocaleService, localeServ, kLocaleServiceCID, &res); + if (NS_FAILED(res)) return res; + + res = localeServ->GetApplicationLocale(getter_AddRefs(locale)); + if (NS_FAILED(res)) return res; + + res = sbServ->CreateExtensibleBundle(aRegistryKey, locale, aResult); + if (NS_FAILED(res)) return res; + + return res; +} + +nsresult nsCharsetConverterManager::GetBundleValue(nsIStringBundle * aBundle, + nsString * aName, + nsString * aProp, + nsString ** aResult) +{ + nsresult res = NS_OK; + + nsAutoString key(aName->GetUnicode()); + key.Append(*aProp); + + PRUnichar * value = NULL; + res = aBundle->GetStringFromName(key.GetUnicode(), &value); + if (NS_FAILED(res)) return res; + + *aResult = new nsString(value); + delete value; + return res; +} + + //---------------------------------------------------------------------------- // Interface nsICharsetConverterManager [implementation] @@ -560,26 +620,33 @@ NS_IMETHODIMP nsCharsetConverterManager::GetEncoderList(nsString *** aResult, return GetConverterList(&mEncoderArray, aResult, aCount); } -NS_IMETHODIMP nsCharsetConverterManager::GetDecoderFlags(nsString * aName, - PRInt32 * aFlags) +NS_IMETHODIMP nsCharsetConverterManager::GetCharsetData(nsString * aCharset, + nsString * aProp, + nsString ** aResult) { - *aFlags = 0; + nsresult res = NS_OK;; - nsConverterInfo * info = GetConverterInfo(&mDecoderArray, aName); - if (info == NULL) return NS_ERROR_UCONV_NOCONV; + if (mDataBundle == NULL) { + res = LoadExtensibleBundle(DATA_BUNDLE_REGISTRY_KEY, &mDataBundle); + if (NS_FAILED(res)) return res; + } - *aFlags = info->mFlags; - return NS_OK; + res = GetBundleValue(mDataBundle, aCharset, aProp, aResult); + return res; } -NS_IMETHODIMP nsCharsetConverterManager::GetEncoderFlags(nsString * aName, - PRInt32 * aFlags) +NS_IMETHODIMP nsCharsetConverterManager::GetMIMEMailCharset( + nsString * aCharset, + nsString ** aResult) { - *aFlags = 0; - - nsConverterInfo * info = GetConverterInfo(&mEncoderArray, aName); - if (info == NULL) return NS_ERROR_UCONV_NOCONV; - - *aFlags = info->mFlags; - return NS_OK; + nsAutoString prop(".MIMEMailCharset"); + return GetCharsetData(aCharset, &prop, aResult); +} + +NS_IMETHODIMP nsCharsetConverterManager::GetMIMEHeaderEncodingMethod( + nsString * aCharset, + nsString ** aResult) +{ + nsAutoString prop(".MIMEHeaderEncodingMethod"); + return GetCharsetData(aCharset, &prop, aResult); } diff --git a/intl/uconv/src/nsUConvModule.cpp b/intl/uconv/src/nsUConvModule.cpp index 30b425bc287..89850ce87e0 100644 --- a/intl/uconv/src/nsUConvModule.cpp +++ b/intl/uconv/src/nsUConvModule.cpp @@ -201,6 +201,7 @@ nsUConvModule::RegisterSelf(nsIComponentManager *aCompMgr, cp++; } + // XXX also unregister this stuff when time comes rv = NS_RegisterConverterManagerData(); return rv;