nsresult nsPlatformCharset::InitGetCharset(nsACString &oString) { char* nl_langinfo_codeset = nsnull; nsCString aCharset; nsresult res; #if HAVE_LANGINFO_CODESET nl_langinfo_codeset = nl_langinfo(CODESET); NS_ASSERTION(nl_langinfo_codeset, "cannot get nl_langinfo(CODESET)"); // // see if we can use nl_langinfo(CODESET) directly // if (nl_langinfo_codeset) { aCharset.Assign(nl_langinfo_codeset); res = VerifyCharset(aCharset); if (NS_SUCCEEDED(res)) { oString = aCharset; return res; } } NS_ERROR("unable to use nl_langinfo(CODESET)"); #endif // // try falling back on a deprecated (locale based) name // char* locale = setlocale(LC_CTYPE, nsnull); nsAutoString localeStr; localeStr.AssignWithConversion(locale); res = ConvertLocaleToCharsetUsingDeprecatedConfig(localeStr, oString); if (NS_SUCCEEDED(res)) { return res; // succeeded } oString.Truncate(); return res; }
nsresult nsPlatformCharset::InitGetCharset(nsACString &oString) { char* nl_langinfo_codeset = nsnull; nsCString aCharset; nsresult res; #if HAVE_LANGINFO_CODESET nl_langinfo_codeset = nl_langinfo(CODESET); NS_ASSERTION(nl_langinfo_codeset, "cannot get nl_langinfo(CODESET)"); // // see if we can use nl_langinfo(CODESET) directly // if (nl_langinfo_codeset) { aCharset.Assign(nl_langinfo_codeset); res = VerifyCharset(aCharset); if (NS_SUCCEEDED(res)) { oString = aCharset; return res; } } // locked for thread safety { nsAutoLock guard(gLock); if (!gNLInfo) { nsCAutoString propertyFile; // note: NS_LITERAL_CSTRING("unixcharset." OSARCH ".properties") does not compile on AIX propertyFile.AssignLiteral("unixcharset."); propertyFile.AppendLiteral(NS_STRINGIFY(OSARCH)); propertyFile.AppendLiteral(".properties"); nsGREResProperties *info = new nsGREResProperties(propertyFile); NS_ASSERTION(info, "cannot create nsGREResProperties"); if (info) { PRBool didLoad = info->DidLoad(); if (!didLoad) { delete info; info = nsnull; } } gNLInfo = info; } } // // See if we are remapping nl_langinfo(CODESET) // if (gNLInfo && nl_langinfo_codeset) { nsAutoString localeKey; #if HAVE_GNU_GET_LIBC_VERSION // // look for an glibc version specific charset remap // const char *glibc_version = gnu_get_libc_version(); if ((glibc_version != nsnull) && (strlen(glibc_version))) { localeKey.AssignLiteral("nllic."); localeKey.AppendWithConversion(glibc_version); localeKey.AppendLiteral("."); localeKey.AppendWithConversion(nl_langinfo_codeset); nsAutoString uCharset; res = gNLInfo->Get(localeKey, uCharset); if (NS_SUCCEEDED(res)) { aCharset.AssignWithConversion(uCharset); res = VerifyCharset(aCharset); if (NS_SUCCEEDED(res)) { oString = aCharset; return res; } } } #endif // // look for a charset specific charset remap // localeKey.AssignLiteral("nllic."); localeKey.AppendWithConversion(nl_langinfo_codeset); nsAutoString uCharset; res = gNLInfo->Get(localeKey, uCharset); if (NS_SUCCEEDED(res)) { aCharset.AssignWithConversion(uCharset); res = VerifyCharset(aCharset); if (NS_SUCCEEDED(res)) { oString = aCharset; return res; } } } NS_ERROR("unable to use nl_langinfo(CODESET)"); #endif // // try falling back on a deprecated (locale based) name // char* locale = setlocale(LC_CTYPE, nsnull); nsAutoString localeStr; localeStr.AssignWithConversion(locale); res = ConvertLocaleToCharsetUsingDeprecatedConfig(localeStr, oString); if (NS_SUCCEEDED(res)) { return res; // succeeded } oString.Truncate(); return res; }