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