xref: /aosp_15_r20/external/icu/libicu/cts_headers/servloc.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
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