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 28 U_NAMESPACE_BEGIN 29 30 LocaleKeyFactory::LocaleKeyFactory(int32_t coverage) 31 : _name() 32 , _coverage(coverage) 33 { 34 } 35 36 LocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name) 37 : _name(name) 38 , _coverage(coverage) 39 { 40 } 41 42 LocaleKeyFactory::~LocaleKeyFactory() { 43 } 44 45 UObject* 46 LocaleKeyFactory::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 58 UBool 59 LocaleKeyFactory::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 69 void 70 LocaleKeyFactory::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 91 UnicodeString& 92 LocaleKeyFactory::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 106 UObject* 107 LocaleKeyFactory::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 120 const Hashtable* 121 LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const { 122 return NULL; 123 } 124 125 #ifdef SERVICE_DEBUG 126 UnicodeString& 127 LocaleKeyFactory::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 137 UnicodeString& 138 LocaleKeyFactory::debugClass(UnicodeString& result) const 139 { 140 return result.append("LocaleKeyFactory"); 141 } 142 #endif 143 144 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory) 145 146 U_NAMESPACE_END 147 148 /* !UCONFIG_NO_SERVICE */ 149 #endif 150 151 152