1/** 2 ******************************************************************************* 3 * Copyright (C) 2001-2005, 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 28U_NAMESPACE_BEGIN 29 30LocaleKeyFactory::LocaleKeyFactory(int32_t coverage) 31 : _name() 32 , _coverage(coverage) 33{ 34} 35 36LocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name) 37 : _name(name) 38 , _coverage(coverage) 39{ 40} 41 42LocaleKeyFactory::~LocaleKeyFactory() { 43} 44 45UObject* 46LocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const { 47 if (handlesKey(key, status)) { 48 const LocaleKey& lkey = (const LocaleKey&)key; 49 int32_t kind = lkey.kind(); 50 Locale loc; 51 lkey.currentLocale(loc); 52 53 return handleCreate(loc, kind, service, status); 54 } 55 return NULL; 56} 57 58UBool 59LocaleKeyFactory::handlesKey(const ICUServiceKey& key, UErrorCode& status) const { 60 const Hashtable* supported = getSupportedIDs(status); 61 if (supported) { 62 UnicodeString id; 63 key.currentID(id); 64 return supported->get(id) != NULL; 65 } 66 return FALSE; 67} 68 69void 70LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const { 71 const Hashtable* supported = getSupportedIDs(status); 72 if (supported) { 73 UBool visible = (_coverage & 0x1) == 0; 74 75 const UHashElement* elem = NULL; 76 int32_t pos = 0; 77 while ((elem = supported->nextElement(pos)) != NULL) { 78 const UnicodeString& id = *((const UnicodeString*)elem->key.pointer); 79 if (!visible) { 80 result.remove(id); 81 } else { 82 result.put(id, (void*)this, status); // this is dummy non-void marker used for set semantics 83 if (U_FAILURE(status)) { 84 break; 85 } 86 } 87 } 88 } 89} 90 91UnicodeString& 92LocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const { 93 if ((_coverage & 0x1) == 0) { 94 //UErrorCode status = U_ZERO_ERROR; 95 // assume if this is called on us, we support some fallback of this id 96 // if (isSupportedID(id, status)) { 97 Locale loc; 98 LocaleUtility::initLocaleFromName(id, loc); 99 return loc.getDisplayName(locale, result); 100 // } 101 } 102 result.setToBogus(); 103 return result; 104} 105 106UObject* 107LocaleKeyFactory::handleCreate(const Locale& /* loc */, 108 int32_t /* kind */, 109 const ICUService* /* service */, 110 UErrorCode& /* status */) const { 111 return NULL; 112} 113 114//UBool 115//LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const { 116// const Hashtable* ids = getSupportedIDs(status); 117// return ids && ids->get(id); 118//} 119 120const Hashtable* 121LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const { 122 return NULL; 123} 124 125#ifdef SERVICE_DEBUG 126UnicodeString& 127LocaleKeyFactory::debug(UnicodeString& result) const 128{ 129 debugClass(result); 130 result.append(", name: "); 131 result.append(_name); 132 result.append(", coverage: "); 133 result.append(_coverage); 134 return result; 135} 136 137UnicodeString& 138LocaleKeyFactory::debugClass(UnicodeString& result) const 139{ 140 return result.append("LocaleKeyFactory"); 141} 142#endif 143 144UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory) 145 146U_NAMESPACE_END 147 148/* !UCONFIG_NO_SERVICE */ 149#endif 150 151 152