1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copyright (C) 2001-2005, International Business Machines Corporation and * 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved. * 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/resbund.h" 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uresimp.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h" 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "servloc.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ustrfmt.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uhash.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "charstr.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucln_cmn.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uassert.h" 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UNDERSCORE_CHAR ((UChar)0x005f) 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define AT_SIGN_CHAR ((UChar)64) 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PERIOD_CHAR ((UChar)46) 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::LocaleKeyFactory(int32_t coverage) 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : _name() 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru , _coverage(coverage) 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name) 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : _name(name) 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru , _coverage(coverage) 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::~LocaleKeyFactory() { 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUObject* 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const { 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (handlesKey(key, status)) { 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t kind = lkey.kind(); 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Locale loc; 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lkey.currentLocale(loc); 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return handleCreate(loc, kind, service, status); 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::handlesKey(const ICUServiceKey& key, UErrorCode& status) const { 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Hashtable* supported = getSupportedIDs(status); 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (supported) { 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString id; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru key.currentID(id); 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return supported->get(id) != NULL; 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return FALSE; 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const { 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Hashtable* supported = getSupportedIDs(status); 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (supported) { 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool visible = (_coverage & 0x1) == 0; 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UHashElement* elem = NULL; 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t pos = 0; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while ((elem = supported->nextElement(pos)) != NULL) { 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UnicodeString& id = *((const UnicodeString*)elem->key.pointer); 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!visible) { 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.remove(id); 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.put(id, (void*)this, status); // this is dummy non-void marker used for set semantics 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString& 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const { 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if ((_coverage & 0x1) == 0) { 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //UErrorCode status = U_ZERO_ERROR; 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // assume if this is called on us, we support some fallback of this id 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // if (isSupportedID(id, status)) { 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Locale loc; 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LocaleUtility::initLocaleFromName(id, loc); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return loc.getDisplayName(locale, result); 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // } 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.setToBogus(); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return result; 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUObject* 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::handleCreate(const Locale& /* loc */, 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t /* kind */, 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const ICUService* /* service */, 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode& /* status */) const { 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//UBool 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const { 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// const Hashtable* ids = getSupportedIDs(status); 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// return ids && ids->get(id); 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//} 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst Hashtable* 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const { 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef SERVICE_DEBUG 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString& 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::debug(UnicodeString& result) const 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru debugClass(result); 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.append(", name: "); 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.append(_name); 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.append(", coverage: "); 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result.append(_coverage); 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return result; 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString& 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocaleKeyFactory::debugClass(UnicodeString& result) const 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return result.append("LocaleKeyFactory"); 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory) 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* !UCONFIG_NO_SERVICE */ 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 152