16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ****************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 1996-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ****************************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * File coll.cpp 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Created by: Helena Shih 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Modification History: 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Date Name Description 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2/5/97 aliu Modified createDefault to load collation data from 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * binary files when possible. Added related methods 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * createCollationFromFile, chopLocale, createPathName. 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2/11/97 aliu Added methods addToCache, findInCache, which implement 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a Collation cache. Modified createDefault to look in 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cache first, and also to store newly created Collation 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * objects in the cache. Modified to not use gLocPath. 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2/12/97 aliu Modified to create objects from RuleBasedCollator cache. 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Moved cache out of Collation class. 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2/13/97 aliu Moved several methods out of this class and into 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * RuleBasedCollator, with modifications. Modified 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * createDefault() to call new RuleBasedCollator(Locale&) 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructor. General clean up and documentation. 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2/20/97 helena Added clone, operator==, operator!=, operator=, and copy 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructor. 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 05/06/97 helena Added memory allocation error detection. 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 05/08/97 helena Added createInstance(). 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6/20/97 helena Java class name change. 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 04/23/99 stephen Removed EDecompositionMode, merged with 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Normalizer::EMode 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 11/23/9 srl Inlining of some critical functions 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 01/29/01 synwee Modified into a C++ wrapper calling C APIs (ucol.h) 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "utypeinfo.h" // for 'typeid' to work 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/coll.h" 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/tblcoll.h" 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucol_imp.h" 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h" 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "servloc.h" 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h" 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustrenum.h" 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h" 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln_in.h" 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::Locale* availableLocaleList = NULL; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t availableLocaleListCount; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::ICULocaleService* gService = NULL; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gServiceInitOnce = U_INITONCE_INITIALIZER; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gAvailableLocaleListInitOnce; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Release all static memory held by collator. 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV collator_cleanup(void) { 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gService) { 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete gService; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gService = NULL; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gServiceInitOnce.reset(); 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (availableLocaleList) { 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete []availableLocaleList; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org availableLocaleList = NULL; 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org availableLocaleListCount = 0; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gAvailableLocaleListInitOnce.reset(); 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------------ 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Registration 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------- 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollatorFactory::~CollatorFactory() {} 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------- 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollatorFactory::visible(void) const { 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------- 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollatorFactory::getDisplayName(const Locale& objectLocale, 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Locale& displayLocale, 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& result) 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return objectLocale.getDisplayName(displayLocale, result); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUCollatorFactory : public ICUResourceBundleFactory { 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ICUCollatorFactory() : ICUResourceBundleFactory(UnicodeString(U_ICUDATA_COLL, -1, US_INV)) { } 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ICUCollatorFactory(); 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected: 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgICUCollatorFactory::~ICUCollatorFactory() {} 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUObject* 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgICUCollatorFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const { 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (handlesKey(key, status)) { 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const LocaleKey& lkey = (const LocaleKey&)key; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale loc; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // make sure the requested locale is correct 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // default LocaleFactory uses currentLocale since that's the one vetted by handlesKey 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // but for ICU rb resources we use the actual one since it will fallback again 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lkey.canonicalLocale(loc); 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return Collator::makeInstance(loc, status); 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUCollatorService : public ICULocaleService { 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ICUCollatorService() 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ICULocaleService(UNICODE_STRING_SIMPLE("Collator")) 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org registerFactory(new ICUCollatorFactory(), status); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ICUCollatorService(); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* cloneInstance(UObject* instance) const { 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ((Collator*)instance)->clone(); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualID, UErrorCode& status) const { 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocaleKey& lkey = (LocaleKey&)key; 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (actualID) { 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Ugly Hack Alert! We return an empty actualID to signal 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // to callers that this is a default object, not a "real" 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // service-created object. (TODO remove in 3.0) [aliu] 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org actualID->truncate(0); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale loc(""); 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lkey.canonicalLocale(loc); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return Collator::makeInstance(loc, status); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const { 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString ar; 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (actualReturn == NULL) { 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org actualReturn = &ar; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator* result = (Collator*)ICULocaleService::getKey(key, actualReturn, status); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Ugly Hack Alert! If the actualReturn length is zero, this 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // means we got a default object, not a "real" service-created 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // object. We don't call setLocales() on a default object, 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // because that will overwrite its correct built-in locale 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // metadata (valid & actual) with our incorrect data (all we 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // have is the requested locale). (TODO remove in 3.0) [aliu] 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result && actualReturn->length() > 0) { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const LocaleKey& lkey = (const LocaleKey&)key; 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale canonicalLocale(""); 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale currentLocale(""); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocaleUtility::initLocaleFromName(*actualReturn, currentLocale); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->setLocales(lkey.canonicalLocale(canonicalLocale), currentLocale, currentLocale); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool isDefault() const { 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return countFactories() == 1; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgICUCollatorService::~ICUCollatorService() {} 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV initService() { 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gService = new ICUCollatorService(); 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic ICULocaleService* 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetService(void) 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gServiceInitOnce, &initService); 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gService; 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic inline UBool 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orghasService(void) 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool retVal = !gServiceInitOnce.isReset() && (getService() != NULL); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return retVal; 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCollator* 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::createUCollator(const char *loc, 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *status) 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCollator *result = 0; 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status && U_SUCCESS(*status) && hasService()) { 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale desiredLocale(loc); 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator *col = (Collator*)gService->get(desiredLocale, *status); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RuleBasedCollator *rbc; 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (col && (rbc = dynamic_cast<RuleBasedCollator *>(col))) { 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!rbc->dataIsOwned) { 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = ucol_safeClone(rbc->ucollator, NULL, NULL, status); 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = rbc->ucollator; 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rbc->ucollator = NULL; // to prevent free on delete 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // should go in a function- ucol_initDelegate(delegate) 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = (UCollator *)uprv_malloc(sizeof(UCollator)); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result == NULL) { 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *status = U_MEMORY_ALLOCATION_ERROR; 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(result, 0, sizeof(UCollator)); 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->delegate = col; 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->freeOnClose = TRUE; // do free on close. 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org col = NULL; // to prevent free on delete. 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete col; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* UCONFIG_NO_SERVICE */ 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginitAvailableLocaleList(UErrorCode &status) { 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(availableLocaleListCount == 0); 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(availableLocaleList == NULL); 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // for now, there is a hardcoded list, so just walk through that list and set it up. 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *index = NULL; 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle installed; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_initStackObject(&installed); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org index = ures_openDirect(U_ICUDATA_COLL, "res_index", &status); 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(index, "InstalledLocales", &installed, &status); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org availableLocaleListCount = ures_getSize(&installed); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org availableLocaleList = new Locale[availableLocaleListCount]; 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (availableLocaleList != NULL) { 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_resetIterator(&installed); 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(ures_hasNext(&installed)) { 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *tempKey = NULL; 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getNextString(&installed, NULL, &tempKey, &status); 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org availableLocaleList[i++] = Locale(tempKey); 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(availableLocaleListCount == i); 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(&installed); 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(index); 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool isAvailableLocaleListInitialized(UErrorCode &status) { 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gAvailableLocaleListInitOnce, &initAvailableLocaleList, status); 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return U_SUCCESS(status); 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Collator public methods ----------------------------------------------- 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator* U_EXPORT2 Collator::createInstance(UErrorCode& success) 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return createInstance(Locale::getDefault(), success); 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale, 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hasService()) { 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale actualLoc; 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator *result = 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (Collator*)gService->get(desiredLocale, &actualLoc, status); 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Ugly Hack Alert! If the returned locale is empty (not root, 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // but empty -- getName() == "") then that means the service 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // returned a default object, not a "real" service object. In 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // that case, the locale metadata (valid & actual) is setup 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // correctly already, and we don't want to overwrite it. (TODO 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // remove in 3.0) [aliu] 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*actualLoc.getName() != 0) { 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->setLocales(desiredLocale, actualLoc, actualLoc); 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return makeInstance(desiredLocale, status); 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator* Collator::makeInstance(const Locale& desiredLocale, 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // A bit of explanation is required here. Although in the current 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // implementation 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Collator::createInstance() is just turning around and calling 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // RuleBasedCollator(Locale&), this will not necessarily always be the 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // case. For example, suppose we modify this code to handle a 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // non-table-based Collator, such as that for Thai. In this case, 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // createInstance() will have to be modified to somehow determine this fact 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (perhaps a field in the resource bundle). Then it can construct the 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // non-table-based Collator in some other way, when it sees that it needs 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // to. 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // return a valid collation object, if the system is functioning properly. 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The reason is that it will fall back, use the default locale, and even 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // use the built-in default collation rules. THEREFORE, createInstance() 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ADVANCE that the given locale's collation is properly implemented as a 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // RuleBasedCollator. 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Currently, we don't do this...we always return a RuleBasedCollator, 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // whether it is strictly correct to do so or not, without checking, because 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // we currently have no way of checking. 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status); 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test for NULL */ 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (collation == 0) { 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MEMORY_ALLOCATION_ERROR; 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete collation; 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org collation = 0; 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return collation; 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_USE_COLLATION_OBSOLETE_2_6 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// !!! dlf the following is obsolete, ignore registration for this 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator * 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::createInstance(const Locale &loc, 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVersionInfo version, 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Collator *collator; 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVersionInfo info; 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org collator=new RuleBasedCollator(loc, status); 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test for NULL */ 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (collator == 0) { 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MEMORY_ALLOCATION_ERROR; 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org collator->getVersion(info); 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) { 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete collator; 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_MISSING_RESOURCE_ERROR; 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return collator; 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator * 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::safeClone() const { 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return clone(); 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// implement deprecated, previously abstract method 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::EComparisonResult Collator::compare(const UnicodeString& source, 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& target) const 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (EComparisonResult)compare(source, target, ec); 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// implement deprecated, previously abstract method 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::EComparisonResult Collator::compare(const UnicodeString& source, 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& target, 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length) const 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (EComparisonResult)compare(source, target, length, ec); 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// implement deprecated, previously abstract method 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::EComparisonResult Collator::compare(const UChar* source, int32_t sourceLength, 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* target, int32_t targetLength) 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (EComparisonResult)compare(source, sourceLength, target, targetLength, ec); 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCollationResult Collator::compare(UCharIterator &/*sIter*/, 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharIterator &/*tIter*/, 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) const { 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Not implemented in the base class. 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UCOL_EQUAL; 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCollationResult Collator::compareUTF8(const StringPiece &source, 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const StringPiece &target, 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) const { 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UCOL_EQUAL; 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharIterator sIter, tIter; 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setUTF8(&sIter, source.data(), source.length()); 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uiter_setUTF8(&tIter, target.data(), target.length()); 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return compare(sIter, tIter, status); 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool Collator::equals(const UnicodeString& source, 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& target) const 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (compare(source, target, ec) == UCOL_EQUAL); 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool Collator::greaterOrEqual(const UnicodeString& source, 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& target) const 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (compare(source, target, ec) != UCOL_LESS); 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool Collator::greater(const UnicodeString& source, 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& target) const 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (compare(source, target, ec) == UCOL_GREATER); 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// this API ignores registered collators, since it returns an 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// array of indefinite lifetime 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst Locale* U_EXPORT2 Collator::getAvailableLocales(int32_t& count) 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale *result = NULL; 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = 0; 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isAvailableLocaleListInitialized(status)) 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = availableLocaleList; 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = availableLocaleListCount; 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Locale& displayLocale, 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& name) 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hasService()) { 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString locNameStr; 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocaleUtility::initNameFromLocale(objectLocale, locNameStr); 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gService->getDisplayName(locNameStr, name, displayLocale); 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return objectLocale.getDisplayName(displayLocale, name); 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& name) 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getDisplayName(objectLocale, Locale::getDefault(), name); 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* This is useless information */ 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*void Collator::getVersion(UVersionInfo versionInfo) const 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (versionInfo!=NULL) 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(versionInfo, fVersion, U_MAX_VERSION_LENGTH); 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// UCollator protected constructor destructor ---------------------------- 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Default constructor. 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Constructor is different from the old default Collator constructor. 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* The task for determing the default collation strength and normalization mode 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* is left to the child class. 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::Collator() 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: UObject() 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Constructor. 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Empty constructor, does not handle the arguments. 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* This constructor is done for backward compatibility with 1.7 and 1.8. 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* The task for handling the argument collation strength and normalization 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* mode is left to the child class. 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param collationStrength collation strength 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @param decompositionMode 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* @deprecated 2.4 use the default constructor instead 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::Collator(UCollationStrength, UNormalizationMode ) 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: UObject() 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::~Collator() 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::Collator(const Collator &other) 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : UObject(other) 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool Collator::operator==(const Collator& other) const 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Subclasses: Call this method and then add more specific checks. 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return typeid(*this) == typeid(other); 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool Collator::operator!=(const Collator& other) const 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UBool)!(*this == other); 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t U_EXPORT2 Collator::getBound(const uint8_t *source, 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sourceLength, 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UColBoundMode boundType, 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t noOfLevels, 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t *result, 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t resultLength, 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ucol_getBound(source, sourceLength, boundType, noOfLevels, result, resultLength, &status); 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::setLocales(const Locale& /* requestedLocale */, const Locale& /* validLocale */, const Locale& /*actualLocale*/) { 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeSet *Collator::getTailoredSet(UErrorCode &status) const 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // everything can be changed 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new UnicodeSet(0, 0x10FFFF); 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgURegistryKey U_EXPORT2 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status) 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getService()->registerInstance(toAdopt, locale, status); 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass CFactory : public LocaleKeyFactory { 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CollatorFactory* _delegate; 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Hashtable* _ids; 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CFactory(CollatorFactory* delegate, UErrorCode& status) 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : LocaleKeyFactory(delegate->visible() ? VISIBLE : INVISIBLE) 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org , _delegate(delegate) 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org , _ids(NULL) 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _ids = new Hashtable(status); 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (_ids) { 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString * idlist = _delegate->getSupportedIDs(count, status); 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < count; ++i) { 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _ids->put(idlist[i], (void*)this, status); 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete _ids; 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _ids = NULL; 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MEMORY_ALLOCATION_ERROR; 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~CFactory(); 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected: 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual const Hashtable* getSupportedIDs(UErrorCode& status) const 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return _ids; 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const; 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCFactory::~CFactory() 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete _delegate; 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete _ids; 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUObject* 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (handlesKey(key, status)) { 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const LocaleKey& lkey = (const LocaleKey&)key; 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale validLoc; 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lkey.currentLocale(validLoc); 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return _delegate->createCollator(validLoc); 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString& 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((_coverage & 0x1) == 0) { 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Hashtable* ids = getSupportedIDs(status); 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ids && (ids->get(id) != NULL)) { 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale loc; 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocaleUtility::initLocaleFromName(id, loc); 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return _delegate->getDisplayName(loc, locale, result); 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result.setToBogus(); 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgURegistryKey U_EXPORT2 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::registerFactory(CollatorFactory* toAdopt, UErrorCode& status) 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CFactory* f = new CFactory(toAdopt, status); 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (f) { 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getService()->registerFactory(f, status); 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MEMORY_ALLOCATION_ERROR; 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool U_EXPORT2 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::unregister(URegistryKey key, UErrorCode& status) 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hasService()) { 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gService->unregister(key, status); 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* UCONFIG_NO_SERVICE */ 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass CollationLocaleListEnumeration : public StringEnumeration { 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t index; 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UClassID U_EXPORT2 getStaticClassID(void); 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID(void) const; 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CollationLocaleListEnumeration() 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : index(0) 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The global variables should already be initialized. 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //isAvailableLocaleListInitialized(status); 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~CollationLocaleListEnumeration(); 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual StringEnumeration * clone() const 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CollationLocaleListEnumeration *result = new CollationLocaleListEnumeration(); 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result) { 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->index = index; 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual int32_t count(UErrorCode &/*status*/) const { 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return availableLocaleListCount; 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual const char* next(int32_t* resultLength, UErrorCode& /*status*/) { 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* result; 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(index < availableLocaleListCount) { 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = availableLocaleList[index++].getName(); 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(resultLength != NULL) { 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *resultLength = (int32_t)uprv_strlen(result); 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(resultLength != NULL) { 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *resultLength = 0; 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = NULL; 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual const UnicodeString* snext(UErrorCode& status) { 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t resultLength = 0; 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *s = next(&resultLength, status); 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return setChars(s, resultLength, status); 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void reset(UErrorCode& /*status*/) { 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org index = 0; 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollationLocaleListEnumeration::~CollationLocaleListEnumeration() {} 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(CollationLocaleListEnumeration) 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getAvailableLocales(void) 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (hasService()) { 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getService()->getAvailableLocales(); 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* UCONFIG_NO_SERVICE */ 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isAvailableLocaleListInitialized(status)) { 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new CollationLocaleListEnumeration(); 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getKeywords(UErrorCode& status) { 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This is a wrapper over ucol_getKeywords 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UEnumeration* uenum = ucol_getKeywords(&status); 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_close(uenum); 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new UStringEnumeration(uenum); 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getKeywordValues(const char *keyword, UErrorCode& status) { 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This is a wrapper over ucol_getKeywordValues 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UEnumeration* uenum = ucol_getKeywordValues(keyword, &status); 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_close(uenum); 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new UStringEnumeration(uenum); 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getKeywordValuesForLocale(const char* key, const Locale& locale, 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool commonlyUsed, UErrorCode& status) { 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This is a wrapper over ucol_getKeywordValuesForLocale 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UEnumeration *uenum = ucol_getKeywordValuesForLocale(key, locale.getName(), 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org commonlyUsed, &status); 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_close(uenum); 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new UStringEnumeration(uenum); 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLocale U_EXPORT2 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getFunctionalEquivalent(const char* keyword, const Locale& locale, 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool& isAvailable, UErrorCode& status) { 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This is a wrapper over ucol_getFunctionalEquivalent 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char loc[ULOC_FULLNAME_CAPACITY]; 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*int32_t len =*/ ucol_getFunctionalEquivalent(loc, sizeof(loc), 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org keyword, locale.getName(), &isAvailable, &status); 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *loc = 0; // root 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return Locale::createFromName(loc); 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::ECollationStrength 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getStrength(void) const { 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode intStatus = U_ZERO_ERROR; 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (ECollationStrength)getAttribute(UCOL_STRENGTH, intStatus); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::setStrength(ECollationStrength newStrength) { 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode intStatus = U_ZERO_ERROR; 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setAttribute(UCOL_STRENGTH, (UColAttributeValue)newStrength, intStatus); 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getReorderCodes(int32_t* /* dest*/, 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t /* destCapacity*/, 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) const 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::setReorderCodes(const int32_t* /* reorderCodes */, 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t /* reorderCodesLength */, 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t U_EXPORT2 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::getEquivalentReorderCodes(int32_t /* reorderCode */, 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* /* dest */, 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t /* destCapacity */, 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCollator::internalGetShortDefinitionString(const char * /*locale*/, 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char * /*buffer*/, 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t /*capacity*/, 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) const { 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; /* Shouldn't happen, internal function */ 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// UCollator private data members ---------------------------------------- 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* This is useless information */ 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*const UVersionInfo Collator::fVersion = {1, 1, 0, 0};*/ 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------- 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_COLLATION */ 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* eof */ 912