1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/locale/src/nsLanguageAtomService.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,161 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "nsLanguageAtomService.h" 1.10 +#include "nsICharsetConverterManager.h" 1.11 +#include "nsILocaleService.h" 1.12 +#include "nsUnicharUtils.h" 1.13 +#include "nsIAtom.h" 1.14 +#include "mozilla/Services.h" 1.15 +#include "nsServiceManagerUtils.h" 1.16 + 1.17 +NS_IMPL_ISUPPORTS(nsLanguageAtomService, nsILanguageAtomService) 1.18 + 1.19 +nsLanguageAtomService::nsLanguageAtomService() 1.20 +{ 1.21 +} 1.22 + 1.23 +nsresult 1.24 +nsLanguageAtomService::InitLangGroupTable() 1.25 +{ 1.26 + if (mLangGroups) 1.27 + return NS_OK; 1.28 + 1.29 + nsCOMPtr<nsIStringBundleService> bundleService = 1.30 + mozilla::services::GetStringBundleService(); 1.31 + if (!bundleService) 1.32 + return NS_ERROR_FAILURE; 1.33 + 1.34 + return bundleService->CreateBundle("resource://gre/res/langGroups.properties", 1.35 + getter_AddRefs(mLangGroups)); 1.36 +} 1.37 + 1.38 +nsIAtom* 1.39 +nsLanguageAtomService::LookupLanguage(const nsACString &aLanguage, 1.40 + nsresult *aError) 1.41 +{ 1.42 + nsAutoCString lowered(aLanguage); 1.43 + ToLowerCase(lowered); 1.44 + 1.45 + nsCOMPtr<nsIAtom> lang = do_GetAtom(lowered); 1.46 + return GetLanguageGroup(lang, aError); 1.47 +} 1.48 + 1.49 +already_AddRefed<nsIAtom> 1.50 +nsLanguageAtomService::LookupCharSet(const char *aCharSet, nsresult *aError) 1.51 +{ 1.52 + if (!mCharSets) { 1.53 + mCharSets = do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID); 1.54 + if (!mCharSets) { 1.55 + if (aError) 1.56 + *aError = NS_ERROR_FAILURE; 1.57 + 1.58 + return nullptr; 1.59 + } 1.60 + } 1.61 + 1.62 + nsCOMPtr<nsIAtom> langGroup; 1.63 + mCharSets->GetCharsetLangGroup(aCharSet, getter_AddRefs(langGroup)); 1.64 + if (!langGroup) { 1.65 + if (aError) 1.66 + *aError = NS_ERROR_FAILURE; 1.67 + 1.68 + return nullptr; 1.69 + } 1.70 + 1.71 + if (aError) 1.72 + *aError = NS_OK; 1.73 + 1.74 + return langGroup.forget(); 1.75 +} 1.76 + 1.77 +nsIAtom* 1.78 +nsLanguageAtomService::GetLocaleLanguage(nsresult *aError) 1.79 +{ 1.80 + nsresult res = NS_OK; 1.81 + 1.82 + do { 1.83 + if (!mLocaleLanguage) { 1.84 + nsCOMPtr<nsILocaleService> localeService; 1.85 + localeService = do_GetService(NS_LOCALESERVICE_CONTRACTID); 1.86 + if (!localeService) { 1.87 + res = NS_ERROR_FAILURE; 1.88 + break; 1.89 + } 1.90 + 1.91 + nsCOMPtr<nsILocale> locale; 1.92 + res = localeService->GetApplicationLocale(getter_AddRefs(locale)); 1.93 + if (NS_FAILED(res)) 1.94 + break; 1.95 + 1.96 + nsAutoString loc; 1.97 + res = locale->GetCategory(NS_LITERAL_STRING(NSILOCALE_MESSAGE), loc); 1.98 + if (NS_FAILED(res)) 1.99 + break; 1.100 + 1.101 + ToLowerCase(loc); // use lowercase for all language atoms 1.102 + mLocaleLanguage = do_GetAtom(loc); 1.103 + } 1.104 + } while (0); 1.105 + 1.106 + if (aError) 1.107 + *aError = res; 1.108 + 1.109 + return mLocaleLanguage; 1.110 +} 1.111 + 1.112 +nsIAtom* 1.113 +nsLanguageAtomService::GetLanguageGroup(nsIAtom *aLanguage, 1.114 + nsresult *aError) 1.115 +{ 1.116 + nsIAtom *retVal; 1.117 + nsresult res = NS_OK; 1.118 + 1.119 + retVal = mLangToGroup.GetWeak(aLanguage); 1.120 + 1.121 + if (!retVal) { 1.122 + if (!mLangGroups) { 1.123 + if (NS_FAILED(InitLangGroupTable())) { 1.124 + if (aError) { 1.125 + *aError = NS_ERROR_FAILURE; 1.126 + } 1.127 + return nullptr; 1.128 + } 1.129 + } 1.130 + 1.131 + nsString langStr; 1.132 + aLanguage->ToString(langStr); 1.133 + 1.134 + nsXPIDLString langGroupStr; 1.135 + res = mLangGroups->GetStringFromName(langStr.get(), 1.136 + getter_Copies(langGroupStr)); 1.137 + if (NS_FAILED(res)) { 1.138 + int32_t hyphen = langStr.FindChar('-'); 1.139 + if (hyphen >= 0) { 1.140 + nsAutoString truncated(langStr); 1.141 + truncated.Truncate(hyphen); 1.142 + res = mLangGroups->GetStringFromName(truncated.get(), 1.143 + getter_Copies(langGroupStr)); 1.144 + if (NS_FAILED(res)) { 1.145 + langGroupStr.AssignLiteral("x-unicode"); 1.146 + } 1.147 + } else { 1.148 + langGroupStr.AssignLiteral("x-unicode"); 1.149 + } 1.150 + } 1.151 + 1.152 + nsCOMPtr<nsIAtom> langGroup = do_GetAtom(langGroupStr); 1.153 + 1.154 + // The hashtable will keep an owning reference to the atom 1.155 + mLangToGroup.Put(aLanguage, langGroup); 1.156 + retVal = langGroup.get(); 1.157 + } 1.158 + 1.159 + if (aError) { 1.160 + *aError = res; 1.161 + } 1.162 + 1.163 + return retVal; 1.164 +}