| // © 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /** |
| ******************************************************************************* |
| * Copyright (C) 2001-2014, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| * |
| ******************************************************************************* |
| */ |
| #include "unicode/utypes.h" |
| |
| #if !UCONFIG_NO_SERVICE |
| |
| #include "unicode/resbund.h" |
| #include "uresimp.h" |
| #include "cmemory.h" |
| #include "servloc.h" |
| #include "ustrfmt.h" |
| #include "uhash.h" |
| #include "charstr.h" |
| #include "uassert.h" |
| |
| #define UNDERSCORE_CHAR ((UChar)0x005f) |
| #define AT_SIGN_CHAR ((UChar)64) |
| #define PERIOD_CHAR ((UChar)46) |
| |
| U_NAMESPACE_BEGIN |
| |
| LocaleKey* |
| LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID, |
| const UnicodeString* canonicalFallbackID, |
| UErrorCode& status) |
| { |
| return LocaleKey::createWithCanonicalFallback(primaryID, canonicalFallbackID, KIND_ANY, status); |
| } |
| |
| LocaleKey* |
| LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID, |
| const UnicodeString* canonicalFallbackID, |
| int32_t kind, |
| UErrorCode& status) |
| { |
| if (primaryID == NULL || U_FAILURE(status)) { |
| return NULL; |
| } |
| UnicodeString canonicalPrimaryID; |
| LocaleUtility::canonicalLocaleString(primaryID, canonicalPrimaryID); |
| return new LocaleKey(*primaryID, canonicalPrimaryID, canonicalFallbackID, kind); |
| } |
| |
| LocaleKey::LocaleKey(const UnicodeString& primaryID, |
| const UnicodeString& canonicalPrimaryID, |
| const UnicodeString* canonicalFallbackID, |
| int32_t kind) |
| : ICUServiceKey(primaryID) |
| , _kind(kind) |
| , _primaryID(canonicalPrimaryID) |
| , _fallbackID() |
| , _currentID() |
| { |
| _fallbackID.setToBogus(); |
| if (_primaryID.length() != 0) { |
| if (canonicalFallbackID != NULL && _primaryID != *canonicalFallbackID) { |
| _fallbackID = *canonicalFallbackID; |
| } |
| } |
| |
| _currentID = _primaryID; |
| } |
| |
| LocaleKey::~LocaleKey() {} |
| |
| UnicodeString& |
| LocaleKey::prefix(UnicodeString& result) const { |
| if (_kind != KIND_ANY) { |
| UChar buffer[64]; |
| uprv_itou(buffer, 64, _kind, 10, 0); |
| UnicodeString temp(buffer); |
| result.append(temp); |
| } |
| return result; |
| } |
| |
| int32_t |
| LocaleKey::kind() const { |
| return _kind; |
| } |
| |
| UnicodeString& |
| LocaleKey::canonicalID(UnicodeString& result) const { |
| return result.append(_primaryID); |
| } |
| |
| UnicodeString& |
| LocaleKey::currentID(UnicodeString& result) const { |
| if (!_currentID.isBogus()) { |
| result.append(_currentID); |
| } |
| return result; |
| } |
| |
| UnicodeString& |
| LocaleKey::currentDescriptor(UnicodeString& result) const { |
| if (!_currentID.isBogus()) { |
| prefix(result).append(PREFIX_DELIMITER).append(_currentID); |
| } else { |
| result.setToBogus(); |
| } |
| return result; |
| } |
| |
| Locale& |
| LocaleKey::canonicalLocale(Locale& result) const { |
| return LocaleUtility::initLocaleFromName(_primaryID, result); |
| } |
| |
| Locale& |
| LocaleKey::currentLocale(Locale& result) const { |
| return LocaleUtility::initLocaleFromName(_currentID, result); |
| } |
| |
| UBool |
| LocaleKey::fallback() { |
| if (!_currentID.isBogus()) { |
| int x = _currentID.lastIndexOf(UNDERSCORE_CHAR); |
| if (x != -1) { |
| _currentID.remove(x); // truncate current or fallback, whichever we're pointing to |
| return TRUE; |
| } |
| |
| if (!_fallbackID.isBogus()) { |
| _currentID = _fallbackID; |
| _fallbackID.setToBogus(); |
| return TRUE; |
| } |
| |
| if (_currentID.length() > 0) { |
| _currentID.remove(0); // completely truncate |
| return TRUE; |
| } |
| |
| _currentID.setToBogus(); |
| } |
| |
| return FALSE; |
| } |
| |
| UBool |
| LocaleKey::isFallbackOf(const UnicodeString& id) const { |
| UnicodeString temp(id); |
| parseSuffix(temp); |
| return temp.indexOf(_primaryID) == 0 && |
| (temp.length() == _primaryID.length() || |
| temp.charAt(_primaryID.length()) == UNDERSCORE_CHAR); |
| } |
| |
| #ifdef SERVICE_DEBUG |
| UnicodeString& |
| LocaleKey::debug(UnicodeString& result) const |
| { |
| ICUServiceKey::debug(result); |
| result.append((UnicodeString)" kind: "); |
| result.append(_kind); |
| result.append((UnicodeString)" primaryID: "); |
| result.append(_primaryID); |
| result.append((UnicodeString)" fallbackID: "); |
| result.append(_fallbackID); |
| result.append((UnicodeString)" currentID: "); |
| result.append(_currentID); |
| return result; |
| } |
| |
| UnicodeString& |
| LocaleKey::debugClass(UnicodeString& result) const |
| { |
| return result.append((UnicodeString)"LocaleKey "); |
| } |
| #endif |
| |
| UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey) |
| |
| U_NAMESPACE_END |
| |
| /* !UCONFIG_NO_SERVICE */ |
| #endif |
| |
| |