intl/locale/src/nsLanguageAtomService.cpp

branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
equal deleted inserted replaced
-1:000000000000 0:c42cfb9d7fd4
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "nsLanguageAtomService.h"
7 #include "nsICharsetConverterManager.h"
8 #include "nsILocaleService.h"
9 #include "nsUnicharUtils.h"
10 #include "nsIAtom.h"
11 #include "mozilla/Services.h"
12 #include "nsServiceManagerUtils.h"
13
14 NS_IMPL_ISUPPORTS(nsLanguageAtomService, nsILanguageAtomService)
15
16 nsLanguageAtomService::nsLanguageAtomService()
17 {
18 }
19
20 nsresult
21 nsLanguageAtomService::InitLangGroupTable()
22 {
23 if (mLangGroups)
24 return NS_OK;
25
26 nsCOMPtr<nsIStringBundleService> bundleService =
27 mozilla::services::GetStringBundleService();
28 if (!bundleService)
29 return NS_ERROR_FAILURE;
30
31 return bundleService->CreateBundle("resource://gre/res/langGroups.properties",
32 getter_AddRefs(mLangGroups));
33 }
34
35 nsIAtom*
36 nsLanguageAtomService::LookupLanguage(const nsACString &aLanguage,
37 nsresult *aError)
38 {
39 nsAutoCString lowered(aLanguage);
40 ToLowerCase(lowered);
41
42 nsCOMPtr<nsIAtom> lang = do_GetAtom(lowered);
43 return GetLanguageGroup(lang, aError);
44 }
45
46 already_AddRefed<nsIAtom>
47 nsLanguageAtomService::LookupCharSet(const char *aCharSet, nsresult *aError)
48 {
49 if (!mCharSets) {
50 mCharSets = do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID);
51 if (!mCharSets) {
52 if (aError)
53 *aError = NS_ERROR_FAILURE;
54
55 return nullptr;
56 }
57 }
58
59 nsCOMPtr<nsIAtom> langGroup;
60 mCharSets->GetCharsetLangGroup(aCharSet, getter_AddRefs(langGroup));
61 if (!langGroup) {
62 if (aError)
63 *aError = NS_ERROR_FAILURE;
64
65 return nullptr;
66 }
67
68 if (aError)
69 *aError = NS_OK;
70
71 return langGroup.forget();
72 }
73
74 nsIAtom*
75 nsLanguageAtomService::GetLocaleLanguage(nsresult *aError)
76 {
77 nsresult res = NS_OK;
78
79 do {
80 if (!mLocaleLanguage) {
81 nsCOMPtr<nsILocaleService> localeService;
82 localeService = do_GetService(NS_LOCALESERVICE_CONTRACTID);
83 if (!localeService) {
84 res = NS_ERROR_FAILURE;
85 break;
86 }
87
88 nsCOMPtr<nsILocale> locale;
89 res = localeService->GetApplicationLocale(getter_AddRefs(locale));
90 if (NS_FAILED(res))
91 break;
92
93 nsAutoString loc;
94 res = locale->GetCategory(NS_LITERAL_STRING(NSILOCALE_MESSAGE), loc);
95 if (NS_FAILED(res))
96 break;
97
98 ToLowerCase(loc); // use lowercase for all language atoms
99 mLocaleLanguage = do_GetAtom(loc);
100 }
101 } while (0);
102
103 if (aError)
104 *aError = res;
105
106 return mLocaleLanguage;
107 }
108
109 nsIAtom*
110 nsLanguageAtomService::GetLanguageGroup(nsIAtom *aLanguage,
111 nsresult *aError)
112 {
113 nsIAtom *retVal;
114 nsresult res = NS_OK;
115
116 retVal = mLangToGroup.GetWeak(aLanguage);
117
118 if (!retVal) {
119 if (!mLangGroups) {
120 if (NS_FAILED(InitLangGroupTable())) {
121 if (aError) {
122 *aError = NS_ERROR_FAILURE;
123 }
124 return nullptr;
125 }
126 }
127
128 nsString langStr;
129 aLanguage->ToString(langStr);
130
131 nsXPIDLString langGroupStr;
132 res = mLangGroups->GetStringFromName(langStr.get(),
133 getter_Copies(langGroupStr));
134 if (NS_FAILED(res)) {
135 int32_t hyphen = langStr.FindChar('-');
136 if (hyphen >= 0) {
137 nsAutoString truncated(langStr);
138 truncated.Truncate(hyphen);
139 res = mLangGroups->GetStringFromName(truncated.get(),
140 getter_Copies(langGroupStr));
141 if (NS_FAILED(res)) {
142 langGroupStr.AssignLiteral("x-unicode");
143 }
144 } else {
145 langGroupStr.AssignLiteral("x-unicode");
146 }
147 }
148
149 nsCOMPtr<nsIAtom> langGroup = do_GetAtom(langGroupStr);
150
151 // The hashtable will keep an owning reference to the atom
152 mLangToGroup.Put(aLanguage, langGroup);
153 retVal = langGroup.get();
154 }
155
156 if (aError) {
157 *aError = res;
158 }
159
160 return retVal;
161 }

mercurial