OLD | NEW |
(Empty) | |
| 1 /** |
| 2 ******************************************************************************* |
| 3 * Copyright (C) 2001-2004, International Business Machines Corporation and * |
| 4 * others. All Rights Reserved. * |
| 5 ******************************************************************************* |
| 6 * |
| 7 ******************************************************************************* |
| 8 */ |
| 9 #include "unicode/utypes.h" |
| 10 |
| 11 #if !UCONFIG_NO_SERVICE |
| 12 |
| 13 #include "unicode/resbund.h" |
| 14 #include "uresimp.h" |
| 15 #include "cmemory.h" |
| 16 #include "servloc.h" |
| 17 #include "ustrfmt.h" |
| 18 #include "uhash.h" |
| 19 #include "charstr.h" |
| 20 #include "ucln_cmn.h" |
| 21 #include "uassert.h" |
| 22 |
| 23 #define UNDERSCORE_CHAR ((UChar)0x005f) |
| 24 #define AT_SIGN_CHAR ((UChar)64) |
| 25 #define PERIOD_CHAR ((UChar)46) |
| 26 |
| 27 U_NAMESPACE_BEGIN |
| 28 |
| 29 LocaleKey* |
| 30 LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID, |
| 31 const UnicodeString* canonicalFallbackID, |
| 32 UErrorCode& status) |
| 33 { |
| 34 return LocaleKey::createWithCanonicalFallback(primaryID, canonicalFallbackID
, KIND_ANY, status); |
| 35 } |
| 36 |
| 37 LocaleKey* |
| 38 LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID, |
| 39 const UnicodeString* canonicalFallbackID, |
| 40 int32_t kind, |
| 41 UErrorCode& status) |
| 42 { |
| 43 if (primaryID == NULL || U_FAILURE(status)) { |
| 44 return NULL; |
| 45 } |
| 46 UnicodeString canonicalPrimaryID; |
| 47 LocaleUtility::canonicalLocaleString(primaryID, canonicalPrimaryID); |
| 48 return new LocaleKey(*primaryID, canonicalPrimaryID, canonicalFallbackID, ki
nd); |
| 49 } |
| 50 |
| 51 LocaleKey::LocaleKey(const UnicodeString& primaryID, |
| 52 const UnicodeString& canonicalPrimaryID, |
| 53 const UnicodeString* canonicalFallbackID, |
| 54 int32_t kind) |
| 55 : ICUServiceKey(primaryID) |
| 56 , _kind(kind) |
| 57 , _primaryID(canonicalPrimaryID) |
| 58 , _fallbackID() |
| 59 , _currentID() |
| 60 { |
| 61 _fallbackID.setToBogus(); |
| 62 if (_primaryID.length() != 0) { |
| 63 if (canonicalFallbackID != NULL && _primaryID != *canonicalFallbackID) { |
| 64 _fallbackID = *canonicalFallbackID; |
| 65 } |
| 66 } |
| 67 |
| 68 _currentID = _primaryID; |
| 69 } |
| 70 |
| 71 LocaleKey::~LocaleKey() {} |
| 72 |
| 73 UnicodeString& |
| 74 LocaleKey::prefix(UnicodeString& result) const { |
| 75 if (_kind != KIND_ANY) { |
| 76 UChar buffer[64]; |
| 77 uprv_itou(buffer, 64, _kind, 10, 0); |
| 78 UnicodeString temp(buffer); |
| 79 result.append(temp); |
| 80 } |
| 81 return result; |
| 82 } |
| 83 |
| 84 int32_t |
| 85 LocaleKey::kind() const { |
| 86 return _kind; |
| 87 } |
| 88 |
| 89 UnicodeString& |
| 90 LocaleKey::canonicalID(UnicodeString& result) const { |
| 91 return result.append(_primaryID); |
| 92 } |
| 93 |
| 94 UnicodeString& |
| 95 LocaleKey::currentID(UnicodeString& result) const { |
| 96 if (!_currentID.isBogus()) { |
| 97 result.append(_currentID); |
| 98 } |
| 99 return result; |
| 100 } |
| 101 |
| 102 UnicodeString& |
| 103 LocaleKey::currentDescriptor(UnicodeString& result) const { |
| 104 if (!_currentID.isBogus()) { |
| 105 prefix(result).append(PREFIX_DELIMITER).append(_currentID); |
| 106 } else { |
| 107 result.setToBogus(); |
| 108 } |
| 109 return result; |
| 110 } |
| 111 |
| 112 Locale& |
| 113 LocaleKey::canonicalLocale(Locale& result) const { |
| 114 return LocaleUtility::initLocaleFromName(_primaryID, result); |
| 115 } |
| 116 |
| 117 Locale& |
| 118 LocaleKey::currentLocale(Locale& result) const { |
| 119 return LocaleUtility::initLocaleFromName(_currentID, result); |
| 120 } |
| 121 |
| 122 UBool |
| 123 LocaleKey::fallback() { |
| 124 if (!_currentID.isBogus()) { |
| 125 int x = _currentID.lastIndexOf(UNDERSCORE_CHAR); |
| 126 if (x != -1) { |
| 127 _currentID.remove(x); // truncate current or fallback, whichever we'
re pointing to |
| 128 return TRUE; |
| 129 } |
| 130 |
| 131 if (!_fallbackID.isBogus()) { |
| 132 _currentID = _fallbackID; |
| 133 _fallbackID.setToBogus(); |
| 134 return TRUE; |
| 135 } |
| 136 |
| 137 if (_currentID.length() > 0) { |
| 138 _currentID.remove(0); // completely truncate |
| 139 return TRUE; |
| 140 } |
| 141 |
| 142 _currentID.setToBogus(); |
| 143 } |
| 144 |
| 145 return FALSE; |
| 146 } |
| 147 |
| 148 UBool |
| 149 LocaleKey::isFallbackOf(const UnicodeString& id) const { |
| 150 UnicodeString temp(id); |
| 151 parseSuffix(temp); |
| 152 return temp.indexOf(_primaryID) == 0 && |
| 153 (temp.length() == _primaryID.length() || |
| 154 temp.charAt(_primaryID.length()) == UNDERSCORE_CHAR); |
| 155 } |
| 156 |
| 157 #ifdef SERVICE_DEBUG |
| 158 UnicodeString& |
| 159 LocaleKey::debug(UnicodeString& result) const |
| 160 { |
| 161 ICUServiceKey::debug(result); |
| 162 result.append(" kind: "); |
| 163 result.append(_kind); |
| 164 result.append(" primaryID: "); |
| 165 result.append(_primaryID); |
| 166 result.append(" fallbackID: "); |
| 167 result.append(_fallbackID); |
| 168 result.append(" currentID: "); |
| 169 result.append(_currentID); |
| 170 return result; |
| 171 } |
| 172 |
| 173 UnicodeString& |
| 174 LocaleKey::debugClass(UnicodeString& result) const |
| 175 { |
| 176 return result.append("LocaleKey "); |
| 177 } |
| 178 #endif |
| 179 |
| 180 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey) |
| 181 |
| 182 U_NAMESPACE_END |
| 183 |
| 184 /* !UCONFIG_NO_SERVICE */ |
| 185 #endif |
| 186 |
| 187 |
OLD | NEW |