1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /** 4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2001-2011, International Business Machines Corporation and * 6*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved. * 7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 8*0e209d39SAndroid Build Coastguard Worker * 9*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 10*0e209d39SAndroid Build Coastguard Worker */ 11*0e209d39SAndroid Build Coastguard Worker #ifndef ICULSERV_H 12*0e209d39SAndroid Build Coastguard Worker #define ICULSERV_H 13*0e209d39SAndroid Build Coastguard Worker 14*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 15*0e209d39SAndroid Build Coastguard Worker 16*0e209d39SAndroid Build Coastguard Worker #if UCONFIG_NO_SERVICE 17*0e209d39SAndroid Build Coastguard Worker 18*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 19*0e209d39SAndroid Build Coastguard Worker 20*0e209d39SAndroid Build Coastguard Worker /* 21*0e209d39SAndroid Build Coastguard Worker * Allow the declaration of APIs with pointers to ICUService 22*0e209d39SAndroid Build Coastguard Worker * even when service is removed from the build. 23*0e209d39SAndroid Build Coastguard Worker */ 24*0e209d39SAndroid Build Coastguard Worker class ICULocaleService; 25*0e209d39SAndroid Build Coastguard Worker 26*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 27*0e209d39SAndroid Build Coastguard Worker 28*0e209d39SAndroid Build Coastguard Worker #else 29*0e209d39SAndroid Build Coastguard Worker 30*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h" 31*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h" 32*0e209d39SAndroid Build Coastguard Worker #include "unicode/strenum.h" 33*0e209d39SAndroid Build Coastguard Worker 34*0e209d39SAndroid Build Coastguard Worker #include "hash.h" 35*0e209d39SAndroid Build Coastguard Worker #include "uvector.h" 36*0e209d39SAndroid Build Coastguard Worker 37*0e209d39SAndroid Build Coastguard Worker #include "serv.h" 38*0e209d39SAndroid Build Coastguard Worker #include "locutil.h" 39*0e209d39SAndroid Build Coastguard Worker 40*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 41*0e209d39SAndroid Build Coastguard Worker 42*0e209d39SAndroid Build Coastguard Worker class ICULocaleService; 43*0e209d39SAndroid Build Coastguard Worker 44*0e209d39SAndroid Build Coastguard Worker class LocaleKey; 45*0e209d39SAndroid Build Coastguard Worker class LocaleKeyFactory; 46*0e209d39SAndroid Build Coastguard Worker class SimpleLocaleKeyFactory; 47*0e209d39SAndroid Build Coastguard Worker class ServiceListener; 48*0e209d39SAndroid Build Coastguard Worker 49*0e209d39SAndroid Build Coastguard Worker /* 50*0e209d39SAndroid Build Coastguard Worker ****************************************************************** 51*0e209d39SAndroid Build Coastguard Worker */ 52*0e209d39SAndroid Build Coastguard Worker 53*0e209d39SAndroid Build Coastguard Worker /** 54*0e209d39SAndroid Build Coastguard Worker * A subclass of Key that implements a locale fallback mechanism. 55*0e209d39SAndroid Build Coastguard Worker * The first locale to search for is the locale provided by the 56*0e209d39SAndroid Build Coastguard Worker * client, and the fallback locale to search for is the current 57*0e209d39SAndroid Build Coastguard Worker * default locale. If a prefix is present, the currentDescriptor 58*0e209d39SAndroid Build Coastguard Worker * includes it before the locale proper, separated by "/". This 59*0e209d39SAndroid Build Coastguard Worker * is the default key instantiated by ICULocaleService.</p> 60*0e209d39SAndroid Build Coastguard Worker * 61*0e209d39SAndroid Build Coastguard Worker * <p>Canonicalization adjusts the locale string so that the 62*0e209d39SAndroid Build Coastguard Worker * section before the first understore is in lower case, and the rest 63*0e209d39SAndroid Build Coastguard Worker * is in upper case, with no trailing underscores.</p> 64*0e209d39SAndroid Build Coastguard Worker */ 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API LocaleKey : public ICUServiceKey { 67*0e209d39SAndroid Build Coastguard Worker private: 68*0e209d39SAndroid Build Coastguard Worker int32_t _kind; 69*0e209d39SAndroid Build Coastguard Worker UnicodeString _primaryID; 70*0e209d39SAndroid Build Coastguard Worker UnicodeString _fallbackID; 71*0e209d39SAndroid Build Coastguard Worker UnicodeString _currentID; 72*0e209d39SAndroid Build Coastguard Worker 73*0e209d39SAndroid Build Coastguard Worker public: 74*0e209d39SAndroid Build Coastguard Worker enum { 75*0e209d39SAndroid Build Coastguard Worker KIND_ANY = -1 76*0e209d39SAndroid Build Coastguard Worker }; 77*0e209d39SAndroid Build Coastguard Worker 78*0e209d39SAndroid Build Coastguard Worker /** 79*0e209d39SAndroid Build Coastguard Worker * Create a LocaleKey with canonical primary and fallback IDs. 80*0e209d39SAndroid Build Coastguard Worker */ 81*0e209d39SAndroid Build Coastguard Worker static LocaleKey* createWithCanonicalFallback(const UnicodeString* primaryID, 82*0e209d39SAndroid Build Coastguard Worker const UnicodeString* canonicalFallbackID, 83*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 84*0e209d39SAndroid Build Coastguard Worker 85*0e209d39SAndroid Build Coastguard Worker /** 86*0e209d39SAndroid Build Coastguard Worker * Create a LocaleKey with canonical primary and fallback IDs. 87*0e209d39SAndroid Build Coastguard Worker */ 88*0e209d39SAndroid Build Coastguard Worker static LocaleKey* createWithCanonicalFallback(const UnicodeString* primaryID, 89*0e209d39SAndroid Build Coastguard Worker const UnicodeString* canonicalFallbackID, 90*0e209d39SAndroid Build Coastguard Worker int32_t kind, 91*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 92*0e209d39SAndroid Build Coastguard Worker 93*0e209d39SAndroid Build Coastguard Worker protected: 94*0e209d39SAndroid Build Coastguard Worker /** 95*0e209d39SAndroid Build Coastguard Worker * PrimaryID is the user's requested locale string, 96*0e209d39SAndroid Build Coastguard Worker * canonicalPrimaryID is this string in canonical form, 97*0e209d39SAndroid Build Coastguard Worker * fallbackID is the current default locale's string in 98*0e209d39SAndroid Build Coastguard Worker * canonical form. 99*0e209d39SAndroid Build Coastguard Worker */ 100*0e209d39SAndroid Build Coastguard Worker LocaleKey(const UnicodeString& primaryID, 101*0e209d39SAndroid Build Coastguard Worker const UnicodeString& canonicalPrimaryID, 102*0e209d39SAndroid Build Coastguard Worker const UnicodeString* canonicalFallbackID, 103*0e209d39SAndroid Build Coastguard Worker int32_t kind); 104*0e209d39SAndroid Build Coastguard Worker 105*0e209d39SAndroid Build Coastguard Worker public: 106*0e209d39SAndroid Build Coastguard Worker /** 107*0e209d39SAndroid Build Coastguard Worker * Append the prefix associated with the kind, or nothing if the kind is KIND_ANY. 108*0e209d39SAndroid Build Coastguard Worker */ 109*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& prefix(UnicodeString& result) const override; 110*0e209d39SAndroid Build Coastguard Worker 111*0e209d39SAndroid Build Coastguard Worker /** 112*0e209d39SAndroid Build Coastguard Worker * Return the kind code associated with this key. 113*0e209d39SAndroid Build Coastguard Worker */ 114*0e209d39SAndroid Build Coastguard Worker virtual int32_t kind() const; 115*0e209d39SAndroid Build Coastguard Worker 116*0e209d39SAndroid Build Coastguard Worker /** 117*0e209d39SAndroid Build Coastguard Worker * Return the canonicalID. 118*0e209d39SAndroid Build Coastguard Worker */ 119*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& canonicalID(UnicodeString& result) const override; 120*0e209d39SAndroid Build Coastguard Worker 121*0e209d39SAndroid Build Coastguard Worker /** 122*0e209d39SAndroid Build Coastguard Worker * Return the currentID. 123*0e209d39SAndroid Build Coastguard Worker */ 124*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& currentID(UnicodeString& result) const override; 125*0e209d39SAndroid Build Coastguard Worker 126*0e209d39SAndroid Build Coastguard Worker /** 127*0e209d39SAndroid Build Coastguard Worker * Return the (canonical) current descriptor, or null if no current id. 128*0e209d39SAndroid Build Coastguard Worker */ 129*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& currentDescriptor(UnicodeString& result) const override; 130*0e209d39SAndroid Build Coastguard Worker 131*0e209d39SAndroid Build Coastguard Worker /** 132*0e209d39SAndroid Build Coastguard Worker * Convenience method to return the locale corresponding to the (canonical) original ID. 133*0e209d39SAndroid Build Coastguard Worker */ 134*0e209d39SAndroid Build Coastguard Worker virtual Locale& canonicalLocale(Locale& result) const; 135*0e209d39SAndroid Build Coastguard Worker 136*0e209d39SAndroid Build Coastguard Worker /** 137*0e209d39SAndroid Build Coastguard Worker * Convenience method to return the locale corresponding to the (canonical) current ID. 138*0e209d39SAndroid Build Coastguard Worker */ 139*0e209d39SAndroid Build Coastguard Worker virtual Locale& currentLocale(Locale& result) const; 140*0e209d39SAndroid Build Coastguard Worker 141*0e209d39SAndroid Build Coastguard Worker /** 142*0e209d39SAndroid Build Coastguard Worker * If the key has a fallback, modify the key and return true, 143*0e209d39SAndroid Build Coastguard Worker * otherwise return false.</p> 144*0e209d39SAndroid Build Coastguard Worker * 145*0e209d39SAndroid Build Coastguard Worker * <p>First falls back through the primary ID, then through 146*0e209d39SAndroid Build Coastguard Worker * the fallbackID. The final fallback is the empty string, 147*0e209d39SAndroid Build Coastguard Worker * unless the primary id was the empty string, in which case 148*0e209d39SAndroid Build Coastguard Worker * there is no fallback. 149*0e209d39SAndroid Build Coastguard Worker */ 150*0e209d39SAndroid Build Coastguard Worker virtual UBool fallback() override; 151*0e209d39SAndroid Build Coastguard Worker 152*0e209d39SAndroid Build Coastguard Worker /** 153*0e209d39SAndroid Build Coastguard Worker * Return true if a key created from id matches, or would eventually 154*0e209d39SAndroid Build Coastguard Worker * fallback to match, the canonical ID of this key. 155*0e209d39SAndroid Build Coastguard Worker */ 156*0e209d39SAndroid Build Coastguard Worker virtual UBool isFallbackOf(const UnicodeString& id) const override; 157*0e209d39SAndroid Build Coastguard Worker 158*0e209d39SAndroid Build Coastguard Worker public: 159*0e209d39SAndroid Build Coastguard Worker /** 160*0e209d39SAndroid Build Coastguard Worker * UObject boilerplate. 161*0e209d39SAndroid Build Coastguard Worker */ 162*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 163*0e209d39SAndroid Build Coastguard Worker 164*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 165*0e209d39SAndroid Build Coastguard Worker 166*0e209d39SAndroid Build Coastguard Worker /** 167*0e209d39SAndroid Build Coastguard Worker * Destructor. 168*0e209d39SAndroid Build Coastguard Worker */ 169*0e209d39SAndroid Build Coastguard Worker virtual ~LocaleKey(); 170*0e209d39SAndroid Build Coastguard Worker 171*0e209d39SAndroid Build Coastguard Worker #ifdef SERVICE_DEBUG 172*0e209d39SAndroid Build Coastguard Worker public: 173*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debug(UnicodeString& result) const; 174*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debugClass(UnicodeString& result) const; 175*0e209d39SAndroid Build Coastguard Worker #endif 176*0e209d39SAndroid Build Coastguard Worker 177*0e209d39SAndroid Build Coastguard Worker }; 178*0e209d39SAndroid Build Coastguard Worker 179*0e209d39SAndroid Build Coastguard Worker /* 180*0e209d39SAndroid Build Coastguard Worker ****************************************************************** 181*0e209d39SAndroid Build Coastguard Worker */ 182*0e209d39SAndroid Build Coastguard Worker 183*0e209d39SAndroid Build Coastguard Worker /** 184*0e209d39SAndroid Build Coastguard Worker * A subclass of ICUServiceFactory that uses LocaleKeys, and is able to 185*0e209d39SAndroid Build Coastguard Worker * 'cover' more specific locales with more general locales that it 186*0e209d39SAndroid Build Coastguard Worker * supports. 187*0e209d39SAndroid Build Coastguard Worker * 188*0e209d39SAndroid Build Coastguard Worker * <p>Coverage may be either of the values VISIBLE or INVISIBLE. 189*0e209d39SAndroid Build Coastguard Worker * 190*0e209d39SAndroid Build Coastguard Worker * <p>'Visible' indicates that the specific locale(s) supported by 191*0e209d39SAndroid Build Coastguard Worker * the factory are registered in getSupportedIDs, 'Invisible' 192*0e209d39SAndroid Build Coastguard Worker * indicates that they are not. 193*0e209d39SAndroid Build Coastguard Worker * 194*0e209d39SAndroid Build Coastguard Worker * <p>Localization of visible ids is handled 195*0e209d39SAndroid Build Coastguard Worker * by the handling factory, regardless of kind. 196*0e209d39SAndroid Build Coastguard Worker */ 197*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API LocaleKeyFactory : public ICUServiceFactory { 198*0e209d39SAndroid Build Coastguard Worker protected: 199*0e209d39SAndroid Build Coastguard Worker const UnicodeString _name; 200*0e209d39SAndroid Build Coastguard Worker const int32_t _coverage; 201*0e209d39SAndroid Build Coastguard Worker 202*0e209d39SAndroid Build Coastguard Worker public: 203*0e209d39SAndroid Build Coastguard Worker enum { 204*0e209d39SAndroid Build Coastguard Worker /** 205*0e209d39SAndroid Build Coastguard Worker * Coverage value indicating that the factory makes 206*0e209d39SAndroid Build Coastguard Worker * its locales visible, and does not cover more specific 207*0e209d39SAndroid Build Coastguard Worker * locales. 208*0e209d39SAndroid Build Coastguard Worker */ 209*0e209d39SAndroid Build Coastguard Worker VISIBLE = 0, 210*0e209d39SAndroid Build Coastguard Worker 211*0e209d39SAndroid Build Coastguard Worker /** 212*0e209d39SAndroid Build Coastguard Worker * Coverage value indicating that the factory does not make 213*0e209d39SAndroid Build Coastguard Worker * its locales visible, and does not cover more specific 214*0e209d39SAndroid Build Coastguard Worker * locales. 215*0e209d39SAndroid Build Coastguard Worker */ 216*0e209d39SAndroid Build Coastguard Worker INVISIBLE = 1 217*0e209d39SAndroid Build Coastguard Worker }; 218*0e209d39SAndroid Build Coastguard Worker 219*0e209d39SAndroid Build Coastguard Worker /** 220*0e209d39SAndroid Build Coastguard Worker * Destructor. 221*0e209d39SAndroid Build Coastguard Worker */ 222*0e209d39SAndroid Build Coastguard Worker virtual ~LocaleKeyFactory(); 223*0e209d39SAndroid Build Coastguard Worker 224*0e209d39SAndroid Build Coastguard Worker protected: 225*0e209d39SAndroid Build Coastguard Worker /** 226*0e209d39SAndroid Build Coastguard Worker * Constructor used by subclasses. 227*0e209d39SAndroid Build Coastguard Worker */ 228*0e209d39SAndroid Build Coastguard Worker LocaleKeyFactory(int32_t coverage); 229*0e209d39SAndroid Build Coastguard Worker 230*0e209d39SAndroid Build Coastguard Worker /** 231*0e209d39SAndroid Build Coastguard Worker * Constructor used by subclasses. 232*0e209d39SAndroid Build Coastguard Worker */ 233*0e209d39SAndroid Build Coastguard Worker LocaleKeyFactory(int32_t coverage, const UnicodeString& name); 234*0e209d39SAndroid Build Coastguard Worker 235*0e209d39SAndroid Build Coastguard Worker /** 236*0e209d39SAndroid Build Coastguard Worker * Implement superclass abstract method. This checks the currentID of 237*0e209d39SAndroid Build Coastguard Worker * the key against the supported IDs, and passes the canonicalLocale and 238*0e209d39SAndroid Build Coastguard Worker * kind off to handleCreate (which subclasses must implement). 239*0e209d39SAndroid Build Coastguard Worker */ 240*0e209d39SAndroid Build Coastguard Worker public: 241*0e209d39SAndroid Build Coastguard Worker virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const override; 242*0e209d39SAndroid Build Coastguard Worker 243*0e209d39SAndroid Build Coastguard Worker protected: 244*0e209d39SAndroid Build Coastguard Worker virtual UBool handlesKey(const ICUServiceKey& key, UErrorCode& status) const; 245*0e209d39SAndroid Build Coastguard Worker 246*0e209d39SAndroid Build Coastguard Worker public: 247*0e209d39SAndroid Build Coastguard Worker /** 248*0e209d39SAndroid Build Coastguard Worker * Override of superclass method. This adjusts the result based 249*0e209d39SAndroid Build Coastguard Worker * on the coverage rule for this factory. 250*0e209d39SAndroid Build Coastguard Worker */ 251*0e209d39SAndroid Build Coastguard Worker virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const override; 252*0e209d39SAndroid Build Coastguard Worker 253*0e209d39SAndroid Build Coastguard Worker /** 254*0e209d39SAndroid Build Coastguard Worker * Return a localized name for the locale represented by id. 255*0e209d39SAndroid Build Coastguard Worker */ 256*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const override; 257*0e209d39SAndroid Build Coastguard Worker 258*0e209d39SAndroid Build Coastguard Worker protected: 259*0e209d39SAndroid Build Coastguard Worker /** 260*0e209d39SAndroid Build Coastguard Worker * Utility method used by create(ICUServiceKey, ICUService). Subclasses can implement 261*0e209d39SAndroid Build Coastguard Worker * this instead of create. The default returns nullptr. 262*0e209d39SAndroid Build Coastguard Worker */ 263*0e209d39SAndroid Build Coastguard Worker virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const; 264*0e209d39SAndroid Build Coastguard Worker 265*0e209d39SAndroid Build Coastguard Worker /** 266*0e209d39SAndroid Build Coastguard Worker * Return true if this id is one the factory supports (visible or 267*0e209d39SAndroid Build Coastguard Worker * otherwise). 268*0e209d39SAndroid Build Coastguard Worker */ 269*0e209d39SAndroid Build Coastguard Worker // virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const; 270*0e209d39SAndroid Build Coastguard Worker 271*0e209d39SAndroid Build Coastguard Worker /** 272*0e209d39SAndroid Build Coastguard Worker * Return the set of ids that this factory supports (visible or 273*0e209d39SAndroid Build Coastguard Worker * otherwise). This can be called often and might need to be 274*0e209d39SAndroid Build Coastguard Worker * cached if it is expensive to create. 275*0e209d39SAndroid Build Coastguard Worker */ 276*0e209d39SAndroid Build Coastguard Worker virtual const Hashtable* getSupportedIDs(UErrorCode& status) const; 277*0e209d39SAndroid Build Coastguard Worker 278*0e209d39SAndroid Build Coastguard Worker public: 279*0e209d39SAndroid Build Coastguard Worker /** 280*0e209d39SAndroid Build Coastguard Worker * UObject boilerplate. 281*0e209d39SAndroid Build Coastguard Worker */ 282*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 283*0e209d39SAndroid Build Coastguard Worker 284*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 285*0e209d39SAndroid Build Coastguard Worker 286*0e209d39SAndroid Build Coastguard Worker #ifdef SERVICE_DEBUG 287*0e209d39SAndroid Build Coastguard Worker public: 288*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debug(UnicodeString& result) const; 289*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debugClass(UnicodeString& result) const; 290*0e209d39SAndroid Build Coastguard Worker #endif 291*0e209d39SAndroid Build Coastguard Worker 292*0e209d39SAndroid Build Coastguard Worker }; 293*0e209d39SAndroid Build Coastguard Worker 294*0e209d39SAndroid Build Coastguard Worker /* 295*0e209d39SAndroid Build Coastguard Worker ****************************************************************** 296*0e209d39SAndroid Build Coastguard Worker */ 297*0e209d39SAndroid Build Coastguard Worker 298*0e209d39SAndroid Build Coastguard Worker /** 299*0e209d39SAndroid Build Coastguard Worker * A LocaleKeyFactory that just returns a single object for a kind/locale. 300*0e209d39SAndroid Build Coastguard Worker */ 301*0e209d39SAndroid Build Coastguard Worker 302*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API SimpleLocaleKeyFactory : public LocaleKeyFactory { 303*0e209d39SAndroid Build Coastguard Worker private: 304*0e209d39SAndroid Build Coastguard Worker UObject* _obj; 305*0e209d39SAndroid Build Coastguard Worker UnicodeString _id; 306*0e209d39SAndroid Build Coastguard Worker const int32_t _kind; 307*0e209d39SAndroid Build Coastguard Worker 308*0e209d39SAndroid Build Coastguard Worker public: 309*0e209d39SAndroid Build Coastguard Worker SimpleLocaleKeyFactory(UObject* objToAdopt, 310*0e209d39SAndroid Build Coastguard Worker const UnicodeString& locale, 311*0e209d39SAndroid Build Coastguard Worker int32_t kind, 312*0e209d39SAndroid Build Coastguard Worker int32_t coverage); 313*0e209d39SAndroid Build Coastguard Worker 314*0e209d39SAndroid Build Coastguard Worker SimpleLocaleKeyFactory(UObject* objToAdopt, 315*0e209d39SAndroid Build Coastguard Worker const Locale& locale, 316*0e209d39SAndroid Build Coastguard Worker int32_t kind, 317*0e209d39SAndroid Build Coastguard Worker int32_t coverage); 318*0e209d39SAndroid Build Coastguard Worker 319*0e209d39SAndroid Build Coastguard Worker /** 320*0e209d39SAndroid Build Coastguard Worker * Destructor. 321*0e209d39SAndroid Build Coastguard Worker */ 322*0e209d39SAndroid Build Coastguard Worker virtual ~SimpleLocaleKeyFactory(); 323*0e209d39SAndroid Build Coastguard Worker 324*0e209d39SAndroid Build Coastguard Worker /** 325*0e209d39SAndroid Build Coastguard Worker * Override of superclass method. Returns the service object if kind/locale match. Service is not used. 326*0e209d39SAndroid Build Coastguard Worker */ 327*0e209d39SAndroid Build Coastguard Worker virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const override; 328*0e209d39SAndroid Build Coastguard Worker 329*0e209d39SAndroid Build Coastguard Worker /** 330*0e209d39SAndroid Build Coastguard Worker * Override of superclass method. This adjusts the result based 331*0e209d39SAndroid Build Coastguard Worker * on the coverage rule for this factory. 332*0e209d39SAndroid Build Coastguard Worker */ 333*0e209d39SAndroid Build Coastguard Worker virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const override; 334*0e209d39SAndroid Build Coastguard Worker 335*0e209d39SAndroid Build Coastguard Worker protected: 336*0e209d39SAndroid Build Coastguard Worker /** 337*0e209d39SAndroid Build Coastguard Worker * Return true if this id is equal to the locale name. 338*0e209d39SAndroid Build Coastguard Worker */ 339*0e209d39SAndroid Build Coastguard Worker //virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const; 340*0e209d39SAndroid Build Coastguard Worker 341*0e209d39SAndroid Build Coastguard Worker 342*0e209d39SAndroid Build Coastguard Worker public: 343*0e209d39SAndroid Build Coastguard Worker /** 344*0e209d39SAndroid Build Coastguard Worker * UObject boilerplate. 345*0e209d39SAndroid Build Coastguard Worker */ 346*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 347*0e209d39SAndroid Build Coastguard Worker 348*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 349*0e209d39SAndroid Build Coastguard Worker 350*0e209d39SAndroid Build Coastguard Worker #ifdef SERVICE_DEBUG 351*0e209d39SAndroid Build Coastguard Worker public: 352*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debug(UnicodeString& result) const; 353*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debugClass(UnicodeString& result) const; 354*0e209d39SAndroid Build Coastguard Worker #endif 355*0e209d39SAndroid Build Coastguard Worker 356*0e209d39SAndroid Build Coastguard Worker }; 357*0e209d39SAndroid Build Coastguard Worker 358*0e209d39SAndroid Build Coastguard Worker /* 359*0e209d39SAndroid Build Coastguard Worker ****************************************************************** 360*0e209d39SAndroid Build Coastguard Worker */ 361*0e209d39SAndroid Build Coastguard Worker 362*0e209d39SAndroid Build Coastguard Worker /** 363*0e209d39SAndroid Build Coastguard Worker * A LocaleKeyFactory that creates a service based on the ICU locale data. 364*0e209d39SAndroid Build Coastguard Worker * This is a base class for most ICU factories. Subclasses instantiate it 365*0e209d39SAndroid Build Coastguard Worker * with a constructor that takes a bundle name, which determines the supported 366*0e209d39SAndroid Build Coastguard Worker * IDs. Subclasses then override handleCreate to create the actual service 367*0e209d39SAndroid Build Coastguard Worker * object. The default implementation returns a resource bundle. 368*0e209d39SAndroid Build Coastguard Worker */ 369*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API ICUResourceBundleFactory : public LocaleKeyFactory 370*0e209d39SAndroid Build Coastguard Worker { 371*0e209d39SAndroid Build Coastguard Worker protected: 372*0e209d39SAndroid Build Coastguard Worker UnicodeString _bundleName; 373*0e209d39SAndroid Build Coastguard Worker 374*0e209d39SAndroid Build Coastguard Worker public: 375*0e209d39SAndroid Build Coastguard Worker /** 376*0e209d39SAndroid Build Coastguard Worker * Convenience constructor that uses the main ICU bundle name. 377*0e209d39SAndroid Build Coastguard Worker */ 378*0e209d39SAndroid Build Coastguard Worker ICUResourceBundleFactory(); 379*0e209d39SAndroid Build Coastguard Worker 380*0e209d39SAndroid Build Coastguard Worker /** 381*0e209d39SAndroid Build Coastguard Worker * A service factory based on ICU resource data in resources with 382*0e209d39SAndroid Build Coastguard Worker * the given name. This should be a 'path' that can be passed to 383*0e209d39SAndroid Build Coastguard Worker * ures_openAvailableLocales, such as U_ICUDATA or U_ICUDATA_COLL. 384*0e209d39SAndroid Build Coastguard Worker * The empty string is equivalent to U_ICUDATA. 385*0e209d39SAndroid Build Coastguard Worker */ 386*0e209d39SAndroid Build Coastguard Worker ICUResourceBundleFactory(const UnicodeString& bundleName); 387*0e209d39SAndroid Build Coastguard Worker 388*0e209d39SAndroid Build Coastguard Worker /** 389*0e209d39SAndroid Build Coastguard Worker * Destructor 390*0e209d39SAndroid Build Coastguard Worker */ 391*0e209d39SAndroid Build Coastguard Worker virtual ~ICUResourceBundleFactory(); 392*0e209d39SAndroid Build Coastguard Worker 393*0e209d39SAndroid Build Coastguard Worker protected: 394*0e209d39SAndroid Build Coastguard Worker /** 395*0e209d39SAndroid Build Coastguard Worker * Return the supported IDs. This is the set of all locale names in ICULocaleData. 396*0e209d39SAndroid Build Coastguard Worker */ 397*0e209d39SAndroid Build Coastguard Worker virtual const Hashtable* getSupportedIDs(UErrorCode& status) const override; 398*0e209d39SAndroid Build Coastguard Worker 399*0e209d39SAndroid Build Coastguard Worker /** 400*0e209d39SAndroid Build Coastguard Worker * Create the service. The default implementation returns the resource bundle 401*0e209d39SAndroid Build Coastguard Worker * for the locale, ignoring kind, and service. 402*0e209d39SAndroid Build Coastguard Worker */ 403*0e209d39SAndroid Build Coastguard Worker virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const override; 404*0e209d39SAndroid Build Coastguard Worker 405*0e209d39SAndroid Build Coastguard Worker public: 406*0e209d39SAndroid Build Coastguard Worker /** 407*0e209d39SAndroid Build Coastguard Worker * UObject boilerplate. 408*0e209d39SAndroid Build Coastguard Worker */ 409*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 410*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 411*0e209d39SAndroid Build Coastguard Worker 412*0e209d39SAndroid Build Coastguard Worker 413*0e209d39SAndroid Build Coastguard Worker #ifdef SERVICE_DEBUG 414*0e209d39SAndroid Build Coastguard Worker public: 415*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debug(UnicodeString& result) const; 416*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& debugClass(UnicodeString& result) const; 417*0e209d39SAndroid Build Coastguard Worker #endif 418*0e209d39SAndroid Build Coastguard Worker 419*0e209d39SAndroid Build Coastguard Worker }; 420*0e209d39SAndroid Build Coastguard Worker 421*0e209d39SAndroid Build Coastguard Worker /* 422*0e209d39SAndroid Build Coastguard Worker ****************************************************************** 423*0e209d39SAndroid Build Coastguard Worker */ 424*0e209d39SAndroid Build Coastguard Worker 425*0e209d39SAndroid Build Coastguard Worker class U_COMMON_API ICULocaleService : public ICUService 426*0e209d39SAndroid Build Coastguard Worker { 427*0e209d39SAndroid Build Coastguard Worker private: 428*0e209d39SAndroid Build Coastguard Worker Locale fallbackLocale; 429*0e209d39SAndroid Build Coastguard Worker UnicodeString fallbackLocaleName; 430*0e209d39SAndroid Build Coastguard Worker 431*0e209d39SAndroid Build Coastguard Worker public: 432*0e209d39SAndroid Build Coastguard Worker /** 433*0e209d39SAndroid Build Coastguard Worker * Construct an ICULocaleService. 434*0e209d39SAndroid Build Coastguard Worker */ 435*0e209d39SAndroid Build Coastguard Worker ICULocaleService(); 436*0e209d39SAndroid Build Coastguard Worker 437*0e209d39SAndroid Build Coastguard Worker /** 438*0e209d39SAndroid Build Coastguard Worker * Construct an ICULocaleService with a name (useful for debugging). 439*0e209d39SAndroid Build Coastguard Worker */ 440*0e209d39SAndroid Build Coastguard Worker ICULocaleService(const UnicodeString& name); 441*0e209d39SAndroid Build Coastguard Worker 442*0e209d39SAndroid Build Coastguard Worker /** 443*0e209d39SAndroid Build Coastguard Worker * Destructor. 444*0e209d39SAndroid Build Coastguard Worker */ 445*0e209d39SAndroid Build Coastguard Worker virtual ~ICULocaleService(); 446*0e209d39SAndroid Build Coastguard Worker 447*0e209d39SAndroid Build Coastguard Worker #if 0 448*0e209d39SAndroid Build Coastguard Worker // redeclare because of overload resolution rules? 449*0e209d39SAndroid Build Coastguard Worker // no, causes ambiguities since both UnicodeString and Locale have constructors that take a const char* 450*0e209d39SAndroid Build Coastguard Worker // need some compiler flag to remove warnings 451*0e209d39SAndroid Build Coastguard Worker UObject* get(const UnicodeString& descriptor, UErrorCode& status) const { 452*0e209d39SAndroid Build Coastguard Worker return ICUService::get(descriptor, status); 453*0e209d39SAndroid Build Coastguard Worker } 454*0e209d39SAndroid Build Coastguard Worker 455*0e209d39SAndroid Build Coastguard Worker UObject* get(const UnicodeString& descriptor, UnicodeString* actualReturn, UErrorCode& status) const { 456*0e209d39SAndroid Build Coastguard Worker return ICUService::get(descriptor, actualReturn, status); 457*0e209d39SAndroid Build Coastguard Worker } 458*0e209d39SAndroid Build Coastguard Worker #endif 459*0e209d39SAndroid Build Coastguard Worker 460*0e209d39SAndroid Build Coastguard Worker /** 461*0e209d39SAndroid Build Coastguard Worker * Convenience override for callers using locales. This calls 462*0e209d39SAndroid Build Coastguard Worker * get(Locale, int, Locale[]) with KIND_ANY for kind and null for 463*0e209d39SAndroid Build Coastguard Worker * actualReturn. 464*0e209d39SAndroid Build Coastguard Worker */ 465*0e209d39SAndroid Build Coastguard Worker UObject* get(const Locale& locale, UErrorCode& status) const; 466*0e209d39SAndroid Build Coastguard Worker 467*0e209d39SAndroid Build Coastguard Worker /** 468*0e209d39SAndroid Build Coastguard Worker * Convenience override for callers using locales. This calls 469*0e209d39SAndroid Build Coastguard Worker * get(Locale, int, Locale[]) with a null actualReturn. 470*0e209d39SAndroid Build Coastguard Worker */ 471*0e209d39SAndroid Build Coastguard Worker UObject* get(const Locale& locale, int32_t kind, UErrorCode& status) const; 472*0e209d39SAndroid Build Coastguard Worker 473*0e209d39SAndroid Build Coastguard Worker /** 474*0e209d39SAndroid Build Coastguard Worker * Convenience override for callers using locales. This calls 475*0e209d39SAndroid Build Coastguard Worker * get(Locale, String, Locale[]) with a null kind. 476*0e209d39SAndroid Build Coastguard Worker */ 477*0e209d39SAndroid Build Coastguard Worker UObject* get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const; 478*0e209d39SAndroid Build Coastguard Worker 479*0e209d39SAndroid Build Coastguard Worker /** 480*0e209d39SAndroid Build Coastguard Worker * Convenience override for callers using locales. This uses 481*0e209d39SAndroid Build Coastguard Worker * createKey(Locale.toString(), kind) to create a key, calls getKey, and then 482*0e209d39SAndroid Build Coastguard Worker * if actualReturn is not null, returns the actualResult from 483*0e209d39SAndroid Build Coastguard Worker * getKey (stripping any prefix) into a Locale. 484*0e209d39SAndroid Build Coastguard Worker */ 485*0e209d39SAndroid Build Coastguard Worker UObject* get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const; 486*0e209d39SAndroid Build Coastguard Worker 487*0e209d39SAndroid Build Coastguard Worker /** 488*0e209d39SAndroid Build Coastguard Worker * Convenience override for callers using locales. This calls 489*0e209d39SAndroid Build Coastguard Worker * registerObject(Object, Locale, int32_t kind, int coverage) 490*0e209d39SAndroid Build Coastguard Worker * passing KIND_ANY for the kind, and VISIBLE for the coverage. 491*0e209d39SAndroid Build Coastguard Worker */ 492*0e209d39SAndroid Build Coastguard Worker virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status); 493*0e209d39SAndroid Build Coastguard Worker 494*0e209d39SAndroid Build Coastguard Worker /** 495*0e209d39SAndroid Build Coastguard Worker * Convenience function for callers using locales. This calls 496*0e209d39SAndroid Build Coastguard Worker * registerObject(Object, Locale, int kind, int coverage) 497*0e209d39SAndroid Build Coastguard Worker * passing VISIBLE for the coverage. 498*0e209d39SAndroid Build Coastguard Worker */ 499*0e209d39SAndroid Build Coastguard Worker virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status); 500*0e209d39SAndroid Build Coastguard Worker 501*0e209d39SAndroid Build Coastguard Worker /** 502*0e209d39SAndroid Build Coastguard Worker * Convenience function for callers using locales. This instantiates 503*0e209d39SAndroid Build Coastguard Worker * a SimpleLocaleKeyFactory, and registers the factory. 504*0e209d39SAndroid Build Coastguard Worker */ 505*0e209d39SAndroid Build Coastguard Worker virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status); 506*0e209d39SAndroid Build Coastguard Worker 507*0e209d39SAndroid Build Coastguard Worker 508*0e209d39SAndroid Build Coastguard Worker /** 509*0e209d39SAndroid Build Coastguard Worker * (Stop compiler from complaining about hidden overrides.) 510*0e209d39SAndroid Build Coastguard Worker * Since both UnicodeString and Locale have constructors that take const char*, adding a public 511*0e209d39SAndroid Build Coastguard Worker * method that takes UnicodeString causes ambiguity at call sites that use const char*. 512*0e209d39SAndroid Build Coastguard Worker * We really need a flag that is understood by all compilers that will suppress the warning about 513*0e209d39SAndroid Build Coastguard Worker * hidden overrides. 514*0e209d39SAndroid Build Coastguard Worker */ 515*0e209d39SAndroid Build Coastguard Worker virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status) override; 516*0e209d39SAndroid Build Coastguard Worker 517*0e209d39SAndroid Build Coastguard Worker /** 518*0e209d39SAndroid Build Coastguard Worker * Convenience method for callers using locales. This returns the standard 519*0e209d39SAndroid Build Coastguard Worker * service ID enumeration. 520*0e209d39SAndroid Build Coastguard Worker */ 521*0e209d39SAndroid Build Coastguard Worker virtual StringEnumeration* getAvailableLocales() const; 522*0e209d39SAndroid Build Coastguard Worker 523*0e209d39SAndroid Build Coastguard Worker protected: 524*0e209d39SAndroid Build Coastguard Worker 525*0e209d39SAndroid Build Coastguard Worker /** 526*0e209d39SAndroid Build Coastguard Worker * Return the name of the current fallback locale. If it has changed since this was 527*0e209d39SAndroid Build Coastguard Worker * last accessed, the service cache is cleared. 528*0e209d39SAndroid Build Coastguard Worker */ 529*0e209d39SAndroid Build Coastguard Worker const UnicodeString& validateFallbackLocale() const; 530*0e209d39SAndroid Build Coastguard Worker 531*0e209d39SAndroid Build Coastguard Worker /** 532*0e209d39SAndroid Build Coastguard Worker * Override superclass createKey method. 533*0e209d39SAndroid Build Coastguard Worker */ 534*0e209d39SAndroid Build Coastguard Worker virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const override; 535*0e209d39SAndroid Build Coastguard Worker 536*0e209d39SAndroid Build Coastguard Worker /** 537*0e209d39SAndroid Build Coastguard Worker * Additional createKey that takes a kind. 538*0e209d39SAndroid Build Coastguard Worker */ 539*0e209d39SAndroid Build Coastguard Worker virtual ICUServiceKey* createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const; 540*0e209d39SAndroid Build Coastguard Worker 541*0e209d39SAndroid Build Coastguard Worker friend class ServiceEnumeration; 542*0e209d39SAndroid Build Coastguard Worker }; 543*0e209d39SAndroid Build Coastguard Worker 544*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 545*0e209d39SAndroid Build Coastguard Worker 546*0e209d39SAndroid Build Coastguard Worker /* UCONFIG_NO_SERVICE */ 547*0e209d39SAndroid Build Coastguard Worker #endif 548*0e209d39SAndroid Build Coastguard Worker 549*0e209d39SAndroid Build Coastguard Worker /* ICULSERV_H */ 550*0e209d39SAndroid Build Coastguard Worker #endif 551*0e209d39SAndroid Build Coastguard Worker 552