xref: /haiku/src/kits/locale/Country.cpp (revision 4b918abdb02a26a770d898594eaaccc6f1726e9b)
1 /*
2  * Copyright 2003-2011, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2009-2019, Adrien Destugues, pulkomandy@gmail.com.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include <unicode/uversion.h>
9 #include <Country.h>
10 
11 #include <AutoDeleter.h>
12 #include <IconUtils.h>
13 #include <List.h>
14 #include <Language.h>
15 #include <LocaleRoster.h>
16 #include <Resources.h>
17 #include <String.h>
18 
19 #include <unicode/locid.h>
20 #include <unicode/ulocdata.h>
21 #include <ICUWrapper.h>
22 
23 #include <iostream>
24 #include <map>
25 #include <monetary.h>
26 #include <new>
27 #include <stdarg.h>
28 #include <stdlib.h>
29 
30 
31 BCountry::BCountry(const char* countryCode)
32 	:
33 	fICULocale(NULL)
34 {
35 	SetTo(countryCode);
36 }
37 
38 
39 BCountry::BCountry(const BCountry& other)
40 	:
41 	fICULocale(new icu::Locale(*other.fICULocale))
42 {
43 }
44 
45 
46 BCountry&
47 BCountry::operator=(const BCountry& other)
48 {
49 	if (this == &other)
50 		return *this;
51 
52 	if (!fICULocale)
53 		fICULocale = new icu::Locale(*other.fICULocale);
54 	else
55 		*fICULocale = *other.fICULocale;
56 
57 	return *this;
58 }
59 
60 
61 BCountry::~BCountry()
62 {
63 	delete fICULocale;
64 }
65 
66 
67 status_t
68 BCountry::SetTo(const char* countryCode)
69 {
70 	delete fICULocale;
71 	fICULocale = new icu::Locale("", countryCode);
72 
73 	return InitCheck();
74 }
75 
76 
77 status_t
78 BCountry::InitCheck() const
79 {
80 	if (fICULocale == NULL)
81 		return B_NO_MEMORY;
82 
83 	if (fICULocale->isBogus())
84 		return B_BAD_DATA;
85 
86 	return B_OK;
87 }
88 
89 
90 status_t
91 BCountry::GetNativeName(BString& name) const
92 {
93 	status_t valid = InitCheck();
94 	if (valid != B_OK)
95 		return valid;
96 
97 	UnicodeString string;
98 	fICULocale->getDisplayName(*fICULocale, string);
99 	string.toTitle(NULL, *fICULocale);
100 
101 	name.Truncate(0);
102 	BStringByteSink converter(&name);
103 	string.toUTF8(converter);
104 
105 	return B_OK;
106 }
107 
108 
109 status_t
110 BCountry::GetName(BString& name, const BLanguage* displayLanguage) const
111 {
112 	status_t status = InitCheck();
113 	if (status != B_OK)
114 		return status;
115 
116 	BString appLanguage;
117 	if (displayLanguage == NULL) {
118 		BMessage preferredLanguages;
119 		status = BLocaleRoster::Default()->GetPreferredLanguages(
120 			&preferredLanguages);
121 		if (status == B_OK)
122 			status = preferredLanguages.FindString("language", 0, &appLanguage);
123 	} else {
124 		appLanguage = displayLanguage->Code();
125 	}
126 
127 	if (status == B_OK) {
128 		UnicodeString uString;
129 		fICULocale->getDisplayName(Locale(appLanguage), uString);
130 		name.Truncate(0);
131 		BStringByteSink stringConverter(&name);
132 		uString.toUTF8(stringConverter);
133 	}
134 
135 	return status;
136 }
137 
138 
139 const char*
140 BCountry::Code() const
141 {
142 	status_t status = InitCheck();
143 	if (status != B_OK)
144 		return NULL;
145 
146 	return fICULocale->getCountry();
147 }
148 
149 
150 status_t
151 BCountry::GetIcon(BBitmap* result) const
152 {
153 	status_t status = InitCheck();
154 	if (status != B_OK)
155 		return status;
156 
157 	return BLocaleRoster::Default()->GetFlagIconForCountry(result, Code());
158 }
159 
160 
161 status_t
162 BCountry::GetAvailableTimeZones(BMessage* timeZones) const
163 {
164 	status_t status = InitCheck();
165 	if (status != B_OK)
166 		return status;
167 
168 	return BLocaleRoster::Default()->GetAvailableTimeZonesForCountry(timeZones,
169 		Code());
170 }
171 
172