1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ****************************************************************************** 3103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Copyright (C) 1996-2012, International Business Machines Corporation and 427f654740f2a26ad62a5c155af9199af9e69b889claireho * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ****************************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * File coll.cpp 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Created by: Helena Shih 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Modification History: 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Date Name Description 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/5/97 aliu Modified createDefault to load collation data from 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * binary files when possible. Added related methods 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * createCollationFromFile, chopLocale, createPathName. 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/11/97 aliu Added methods addToCache, findInCache, which implement 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a Collation cache. Modified createDefault to look in 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * cache first, and also to store newly created Collation 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * objects in the cache. Modified to not use gLocPath. 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/12/97 aliu Modified to create objects from RuleBasedCollator cache. 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Moved cache out of Collation class. 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/13/97 aliu Moved several methods out of this class and into 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * RuleBasedCollator, with modifications. Modified 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * createDefault() to call new RuleBasedCollator(Locale&) 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * constructor. General clean up and documentation. 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/20/97 helena Added clone, operator==, operator!=, operator=, and copy 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * constructor. 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 05/06/97 helena Added memory allocation error detection. 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 05/08/97 helena Added createInstance(). 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 6/20/97 helena Java class name change. 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 04/23/99 stephen Removed EDecompositionMode, merged with 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Normalizer::EMode 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 11/23/9 srl Inlining of some critical functions 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 01/29/01 synwee Modified into a C++ wrapper calling C APIs (ucol.h) 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "utypeinfo.h" // for 'typeid' to work 4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coll.h" 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h" 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_imp.h" 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h" 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "servloc.h" 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrenum.h" 54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "uresimp.h" 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucln_in.h" 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic icu::Locale* availableLocaleList = NULL; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t availableLocaleListCount; 59103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic icu::ICULocaleService* gService = NULL; 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Release all static memory held by collator. 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV collator_cleanup(void) { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gService) { 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete gService; 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gService = NULL; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (availableLocaleList) { 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete []availableLocaleList; 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru availableLocaleList = NULL; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru availableLocaleListCount = 0; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------------ 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Registration 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------- 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollatorFactory::~CollatorFactory() {} 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------- 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollatorFactory::visible(void) const { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------- 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollatorFactory::getDisplayName(const Locale& objectLocale, 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale& displayLocale, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& result) 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return objectLocale.getDisplayName(displayLocale, result); 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ICUCollatorFactory : public ICUResourceBundleFactory { 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public: 117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ICUCollatorFactory() : ICUResourceBundleFactory(UnicodeString(U_ICUDATA_COLL, -1, US_INV)) { } 118103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~ICUCollatorFactory(); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru protected: 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusICUCollatorFactory::~ICUCollatorFactory() {} 124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUObject* 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruICUCollatorFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const { 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (handlesKey(key, status)) { 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc; 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // make sure the requested locale is correct 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // default LocaleFactory uses currentLocale since that's the one vetted by handlesKey 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // but for ICU rb resources we use the actual one since it will fallback again 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lkey.canonicalLocale(loc); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Collator::makeInstance(loc, status); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ICUCollatorService : public ICULocaleService { 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICUCollatorService() 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : ICULocaleService(UNICODE_STRING_SIMPLE("Collator")) 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru registerFactory(new ICUCollatorFactory(), status); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~ICUCollatorService(); 152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* cloneInstance(UObject* instance) const { 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Collator*)instance)->clone(); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualID, UErrorCode& status) const { 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleKey& lkey = (LocaleKey&)key; 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualID) { 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ugly Hack Alert! We return an empty actualID to signal 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to callers that this is a default object, not a "real" 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // service-created object. (TODO remove in 3.0) [aliu] 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualID->truncate(0); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc(""); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lkey.canonicalLocale(loc); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Collator::makeInstance(loc, status); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const { 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ar; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualReturn == NULL) { 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualReturn = &ar; 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator* result = (Collator*)ICULocaleService::getKey(key, actualReturn, status); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ugly Hack Alert! If the actualReturn length is zero, this 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // means we got a default object, not a "real" service-created 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // object. We don't call setLocales() on a default object, 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // because that will overwrite its correct built-in locale 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // metadata (valid & actual) with our incorrect data (all we 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // have is the requested locale). (TODO remove in 3.0) [aliu] 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result && actualReturn->length() > 0) { 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale canonicalLocale(""); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale currentLocale(""); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru LocaleUtility::initLocaleFromName(*actualReturn, currentLocale); 188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result->setLocales(lkey.canonicalLocale(canonicalLocale), currentLocale, currentLocale); 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool isDefault() const { 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return countFactories() == 1; 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 198103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusICUCollatorService::~ICUCollatorService() {} 199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic ICULocaleService* 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetService(void) 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool needInit; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, (UBool)(gService == NULL), needInit); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(needInit) { 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICULocaleService *newservice = new ICUCollatorService(); 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(newservice) { 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(gService == NULL) { 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gService = newservice; 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newservice = NULL; 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(newservice) { 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete newservice; 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gService; 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruhasService(void) 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool retVal; 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, gService != NULL, retVal); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return retVal; 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCollator* 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::createUCollator(const char *loc, 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *result = 0; 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status && U_SUCCESS(*status) && hasService()) { 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale desiredLocale(loc); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *col = (Collator*)gService->get(desiredLocale, *status); 24727f654740f2a26ad62a5c155af9199af9e69b889claireho RuleBasedCollator *rbc; 24827f654740f2a26ad62a5c155af9199af9e69b889claireho if (col && (rbc = dynamic_cast<RuleBasedCollator *>(col))) { 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!rbc->dataIsOwned) { 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_safeClone(rbc->ucollator, NULL, NULL, status); 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = rbc->ucollator; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rbc->ucollator = NULL; // to prevent free on delete 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 255103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // should go in a function- ucol_initDelegate(delegate) 257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result = (UCollator *)uprv_malloc(sizeof(UCollator)); 258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(result == NULL) { 259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *status = U_MEMORY_ALLOCATION_ERROR; 260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uprv_memset(result, 0, sizeof(UCollator)); 262103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result->delegate = col; 263103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result->freeOnClose = TRUE; // do free on close. 264103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius col = NULL; // to prevent free on delete. 265103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete col; 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */ 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool isAvailableLocaleListInitialized(UErrorCode &status) { 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // for now, there is a hardcoded list, so just walk through that list and set it up. 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool needInit; 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, availableLocaleList == NULL, needInit); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (needInit) { 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *index = NULL; 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle installed; 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale * temp; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t localeCount; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_initStackObject(&installed); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index = ures_openDirect(U_ICUDATA_COLL, "res_index", &status); 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_getByKey(index, "InstalledLocales", &installed, &status); 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeCount = ures_getSize(&installed); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = new Locale[localeCount]; 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (temp != NULL) { 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_resetIterator(&installed); 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(ures_hasNext(&installed)) { 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *tempKey = NULL; 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_getNextString(&installed, NULL, &tempKey, &status); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[i++] = Locale(tempKey); 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (availableLocaleList == NULL) 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru availableLocaleListCount = localeCount; 305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru availableLocaleList = temp; 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = NULL; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru needInit = FALSE; 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (temp) { 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete []temp; 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(&installed); 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(index); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !needInit; 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator public methods ----------------------------------------------- 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator* U_EXPORT2 Collator::createInstance(UErrorCode& success) 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return createInstance(Locale::getDefault(), success); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale, 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale actualLoc; 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *result = 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (Collator*)gService->get(desiredLocale, &actualLoc, status); 342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ugly Hack Alert! If the returned locale is empty (not root, 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // but empty -- getName() == "") then that means the service 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // returned a default object, not a "real" service object. In 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that case, the locale metadata (valid & actual) is setup 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // correctly already, and we don't want to overwrite it. (TODO 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // remove in 3.0) [aliu] 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*actualLoc.getName() != 0) { 350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result->setLocales(desiredLocale, actualLoc, actualLoc); 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return makeInstance(desiredLocale, status); 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator* Collator::makeInstance(const Locale& desiredLocale, 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A bit of explanation is required here. Although in the current 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // implementation 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Collator::createInstance() is just turning around and calling 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // RuleBasedCollator(Locale&), this will not necessarily always be the 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // case. For example, suppose we modify this code to handle a 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // non-table-based Collator, such as that for Thai. In this case, 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // createInstance() will have to be modified to somehow determine this fact 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (perhaps a field in the resource bundle). Then it can construct the 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // non-table-based Collator in some other way, when it sees that it needs 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to. 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS 373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // return a valid collation object, if the system is functioning properly. 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The reason is that it will fall back, use the default locale, and even 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // use the built-in default collation rules. THEREFORE, createInstance() 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ADVANCE that the given locale's collation is properly implemented as a 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // RuleBasedCollator. 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Currently, we don't do this...we always return a RuleBasedCollator, 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // whether it is strictly correct to do so or not, without checking, because 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we currently have no way of checking. 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (collation == 0) { 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete collation; 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collation = 0; 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return collation; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_USE_COLLATION_OBSOLETE_2_6 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// !!! dlf the following is obsolete, ignore registration for this 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator * 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::createInstance(const Locale &loc, 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UVersionInfo version, 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode &status) 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *collator; 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UVersionInfo info; 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collator=new RuleBasedCollator(loc, status); 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (collator == 0) { 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collator->getVersion(info); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) { 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete collator; 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_MISSING_RESOURCE_ERROR; 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return collator; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42854dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusCollator * 42954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusCollator::safeClone() const { 43054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return clone(); 43154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 43254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// implement deprecated, previously abstract method 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::EComparisonResult Collator::compare(const UnicodeString& source, 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 43854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return (EComparisonResult)compare(source, target, ec); 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// implement deprecated, previously abstract method 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::EComparisonResult Collator::compare(const UnicodeString& source, 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target, 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length) const 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 44754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return (EComparisonResult)compare(source, target, length, ec); 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// implement deprecated, previously abstract method 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::EComparisonResult Collator::compare(const UChar* source, int32_t sourceLength, 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* target, int32_t targetLength) 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 45654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return (EComparisonResult)compare(source, sourceLength, target, targetLength, ec); 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUCollationResult Collator::compare(UCharIterator &/*sIter*/, 460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCharIterator &/*tIter*/, 461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode &status) const { 462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_SUCCESS(status)) { 463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Not implemented in the base class. 464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_UNSUPPORTED_ERROR; 465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return UCOL_EQUAL; 467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUCollationResult Collator::compareUTF8(const StringPiece &source, 470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const StringPiece &target, 471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode &status) const { 472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_FAILURE(status)) { 473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return UCOL_EQUAL; 474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCharIterator sIter, tIter; 476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uiter_setUTF8(&sIter, source.data(), source.length()); 477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uiter_setUTF8(&tIter, target.data(), target.length()); 478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return compare(sIter, tIter, status); 479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::equals(const UnicodeString& source, 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (compare(source, target, ec) == UCOL_EQUAL); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::greaterOrEqual(const UnicodeString& source, 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (compare(source, target, ec) != UCOL_LESS); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::greater(const UnicodeString& source, 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (compare(source, target, ec) == UCOL_GREATER); 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// this API ignores registered collators, since it returns an 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// array of indefinite lifetime 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Locale* U_EXPORT2 Collator::getAvailableLocales(int32_t& count) 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale *result = NULL; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = 0; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isAvailableLocaleListInitialized(status)) 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = availableLocaleList; 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = availableLocaleListCount; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale& displayLocale, 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& name) 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString locNameStr; 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleUtility::initNameFromLocale(objectLocale, locNameStr); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gService->getDisplayName(locNameStr, name, displayLocale); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return objectLocale.getDisplayName(displayLocale, name); 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& name) 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getDisplayName(objectLocale, Locale::getDefault(), name); 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is useless information */ 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*void Collator::getVersion(UVersionInfo versionInfo) const 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (versionInfo!=NULL) 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(versionInfo, fVersion, U_MAX_VERSION_LENGTH); 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UCollator protected constructor destructor ---------------------------- 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Default constructor. 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Constructor is different from the old default Collator constructor. 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* The task for determing the default collation strength and normalization mode 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* is left to the child class. 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::Collator() 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: UObject() 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Constructor. 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Empty constructor, does not handle the arguments. 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* This constructor is done for backward compatibility with 1.7 and 1.8. 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* The task for handling the argument collation strength and normalization 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* mode is left to the child class. 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* @param collationStrength collation strength 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* @param decompositionMode 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* @deprecated 2.4 use the default constructor instead 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::Collator(UCollationStrength, UNormalizationMode ) 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: UObject() 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::~Collator() 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::Collator(const Collator &other) 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : UObject(other) 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::operator==(const Collator& other) const 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 58454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // Subclasses: Call this method and then add more specific checks. 58554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return typeid(*this) == typeid(other); 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::operator!=(const Collator& other) const 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)!(*this == other); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t U_EXPORT2 Collator::getBound(const uint8_t *source, 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sourceLength, 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColBoundMode boundType, 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t noOfLevels, 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *result, 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultLength, 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode &status) 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ucol_getBound(source, sourceLength, boundType, noOfLevels, result, resultLength, &status); 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruCollator::setLocales(const Locale& /* requestedLocale */, const Locale& /* validLocale */, const Locale& /*actualLocale*/) { 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeSet *Collator::getTailoredSet(UErrorCode &status) const 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // everything can be changed 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new UnicodeSet(0, 0x10FFFF); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruURegistryKey U_EXPORT2 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status) 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getService()->registerInstance(toAdopt, locale, status); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass CFactory : public LocaleKeyFactory { 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollatorFactory* _delegate; 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Hashtable* _ids; 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CFactory(CollatorFactory* delegate, UErrorCode& status) 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : LocaleKeyFactory(delegate->visible() ? VISIBLE : INVISIBLE) 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru , _delegate(delegate) 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru , _ids(NULL) 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = 0; 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _ids = new Hashtable(status); 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (_ids) { 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString * idlist = _delegate->getSupportedIDs(count, status); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < count; ++i) { 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _ids->put(idlist[i], (void*)this, status); 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete _ids; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _ids = NULL; 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 660103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~CFactory(); 662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const Hashtable* getSupportedIDs(UErrorCode& status) const 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _ids; 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const; 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 678103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCFactory::~CFactory() 679103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{ 680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius delete _delegate; 681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius delete _ids; 682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUObject* 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (handlesKey(key, status)) { 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale validLoc; 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lkey.currentLocale(validLoc); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _delegate->createCollator(validLoc); 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((_coverage & 0x1) == 0) { 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Hashtable* ids = getSupportedIDs(status); 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ids && (ids->get(id) != NULL)) { 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc; 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleUtility::initLocaleFromName(id, loc); 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _delegate->getDisplayName(loc, locale, result); 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.setToBogus(); 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruURegistryKey U_EXPORT2 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::registerFactory(CollatorFactory* toAdopt, UErrorCode& status) 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CFactory* f = new CFactory(toAdopt, status); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f) { 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getService()->registerFactory(f, status); 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool U_EXPORT2 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::unregister(URegistryKey key, UErrorCode& status) 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gService->unregister(key, status); 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */ 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass CollationLocaleListEnumeration : public StringEnumeration { 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t index; 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UClassID U_EXPORT2 getStaticClassID(void); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UClassID getDynamicClassID(void) const; 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationLocaleListEnumeration() 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : index(0) 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The global variables should already be initialized. 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //isAvailableLocaleListInitialized(status); 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~CollationLocaleListEnumeration(); 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual StringEnumeration * clone() const 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationLocaleListEnumeration *result = new CollationLocaleListEnumeration(); 759c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (result) { 760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result->index = index; 761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t count(UErrorCode &/*status*/) const { 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return availableLocaleListCount; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const char* next(int32_t* resultLength, UErrorCode& /*status*/) { 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* result; 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(index < availableLocaleListCount) { 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = availableLocaleList[index++].getName(); 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resultLength != NULL) { 77450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *resultLength = (int32_t)uprv_strlen(result); 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resultLength != NULL) { 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *resultLength = 0; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = NULL; 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const UnicodeString* snext(UErrorCode& status) { 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultLength = 0; 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *s = next(&resultLength, status); 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return setChars(s, resultLength, status); 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void reset(UErrorCode& /*status*/) { 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index = 0; 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 796103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCollationLocaleListEnumeration::~CollationLocaleListEnumeration() {} 797103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(CollationLocaleListEnumeration) 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getAvailableLocales(void) 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getService()->getAvailableLocales(); 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */ 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isAvailableLocaleListInitialized(status)) { 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new CollationLocaleListEnumeration(); 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getKeywords(UErrorCode& status) { 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is a wrapper over ucol_getKeywords 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UEnumeration* uenum = ucol_getKeywords(&status); 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uenum_close(uenum); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new UStringEnumeration(uenum); 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getKeywordValues(const char *keyword, UErrorCode& status) { 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is a wrapper over ucol_getKeywordValues 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UEnumeration* uenum = ucol_getKeywordValues(keyword, &status); 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uenum_close(uenum); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new UStringEnumeration(uenum); 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 840b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringEnumeration* U_EXPORT2 841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruCollator::getKeywordValuesForLocale(const char* key, const Locale& locale, 842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool commonlyUsed, UErrorCode& status) { 843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // This is a wrapper over ucol_getKeywordValuesForLocale 844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UEnumeration *uenum = ucol_getKeywordValuesForLocale(key, locale.getName(), 845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru commonlyUsed, &status); 846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_close(uenum); 848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 849b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return new UStringEnumeration(uenum); 851b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocale U_EXPORT2 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getFunctionalEquivalent(const char* keyword, const Locale& locale, 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool& isAvailable, UErrorCode& status) { 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is a wrapper over ucol_getFunctionalEquivalent 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[ULOC_FULLNAME_CAPACITY]; 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*int32_t len =*/ ucol_getFunctionalEquivalent(loc, sizeof(loc), 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru keyword, locale.getName(), &isAvailable, &status); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *loc = 0; // root 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Locale::createFromName(loc); 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusCollator::ECollationStrength 86754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusCollator::getStrength(void) const { 86854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode intStatus = U_ZERO_ERROR; 86954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return (ECollationStrength)getAttribute(UCOL_STRENGTH, intStatus); 87054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 87154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 87254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid 87354dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusCollator::setStrength(ECollationStrength newStrength) { 87454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode intStatus = U_ZERO_ERROR; 87554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setAttribute(UCOL_STRENGTH, (UColAttributeValue)newStrength, intStatus); 87654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 87754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 87854dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusint32_t 879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoCollator::getReorderCodes(int32_t* /* dest*/, 880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t /* destCapacity*/, 881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode& status) const 88227f654740f2a26ad62a5c155af9199af9e69b889claireho{ 88327f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_SUCCESS(status)) { 88427f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_UNSUPPORTED_ERROR; 88527f654740f2a26ad62a5c155af9199af9e69b889claireho } 88627f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 88727f654740f2a26ad62a5c155af9199af9e69b889claireho} 88827f654740f2a26ad62a5c155af9199af9e69b889claireho 88954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid 890b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoCollator::setReorderCodes(const int32_t* /* reorderCodes */, 891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t /* reorderCodesLength */, 892b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode& status) 89327f654740f2a26ad62a5c155af9199af9e69b889claireho{ 89427f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_SUCCESS(status)) { 89527f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_UNSUPPORTED_ERROR; 89627f654740f2a26ad62a5c155af9199af9e69b889claireho } 89727f654740f2a26ad62a5c155af9199af9e69b889claireho} 89827f654740f2a26ad62a5c155af9199af9e69b889claireho 899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t U_EXPORT2 900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoCollator::getEquivalentReorderCodes(int32_t /* reorderCode */, 901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t* /* dest */, 902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t /* destCapacity */, 903b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode& status) 904b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 905b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_SUCCESS(status)) { 906b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_UNSUPPORTED_ERROR; 907b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 908b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return 0; 909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 910b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 911103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusint32_t 912103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCollator::internalGetShortDefinitionString(const char * /*locale*/, 913103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char * /*buffer*/, 914103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t /*capacity*/, 915103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode &status) const { 916103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_SUCCESS(status)) { 917103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status = U_UNSUPPORTED_ERROR; /* Shouldn't happen, internal function */ 918103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 919103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 0; 920103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 921103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UCollator private data members ---------------------------------------- 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is useless information */ 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*const UVersionInfo Collator::fVersion = {1, 1, 0, 0};*/ 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* eof */ 934