| Index: icu51/source/common/servlk.cpp
|
| ===================================================================
|
| --- icu51/source/common/servlk.cpp (revision 0)
|
| +++ icu51/source/common/servlk.cpp (revision 0)
|
| @@ -0,0 +1,187 @@
|
| +/**
|
| + *******************************************************************************
|
| + * Copyright (C) 2001-2004, 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 "ucln_cmn.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(" kind: ");
|
| + result.append(_kind);
|
| + result.append(" primaryID: ");
|
| + result.append(_primaryID);
|
| + result.append(" fallbackID: ");
|
| + result.append(_fallbackID);
|
| + result.append(" currentID: ");
|
| + result.append(_currentID);
|
| + return result;
|
| +}
|
| +
|
| +UnicodeString&
|
| +LocaleKey::debugClass(UnicodeString& result) const
|
| +{
|
| + return result.append("LocaleKey ");
|
| +}
|
| +#endif
|
| +
|
| +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey)
|
| +
|
| +U_NAMESPACE_END
|
| +
|
| +/* !UCONFIG_NO_SERVICE */
|
| +#endif
|
| +
|
| +
|
|
|
| Property changes on: icu51/source/common/servlk.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|