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