2
*******************************************************************************
3
* Copyright (C) 2001-2007, International Business Machines Corporation. *
4
* All Rights Reserved. *
5
*******************************************************************************
11
#include "unicode/utypes.h"
13
#if UCONFIG_NO_SERVICE
18
* Allow the declaration of APIs with pointers to ICUService
19
* even when service is removed from the build.
27
#include "unicode/unistr.h"
28
#include "unicode/locid.h"
29
#include "unicode/umisc.h"
40
class ICUServiceFactory;
42
class ServiceListener;
47
/*******************************************************************
52
* <p>ICUServiceKeys are used to communicate with factories to
53
* generate an instance of the service. ICUServiceKeys define how
54
* ids are canonicalized, provide both a current id and a current
55
* descriptor to use in querying the cache and factories, and
56
* determine the fallback strategy.</p>
58
* <p>ICUServiceKeys provide both a currentDescriptor and a currentID.
59
* The descriptor contains an optional prefix, followed by '/'
60
* and the currentID. Factories that handle complex keys,
61
* for example number format factories that generate multiple
62
* kinds of formatters for the same locale, use the descriptor
63
* to provide a fully unique identifier for the service object,
64
* while using the currentID (in this case, the locale string),
65
* as the visible IDs that can be localized.</p>
67
* <p>The default implementation of ICUServiceKey has no fallbacks and
68
* has no custom descriptors.</p>
70
class U_COMMON_API ICUServiceKey : public UObject {
72
const UnicodeString _id;
75
static const UChar PREFIX_DELIMITER;
80
* <p>Construct a key from an id.</p>
82
* @param id the ID from which to construct the key.
84
ICUServiceKey(const UnicodeString& id);
87
* <p>Virtual destructor.</p>
89
virtual ~ICUServiceKey();
92
* <p>Return the original ID used to construct this key.</p>
94
* @return the ID used to construct this key.
96
virtual const UnicodeString& getID() const;
99
* <p>Return the canonical version of the original ID. This implementation
100
* appends the original ID to result. Result is returned as a convenience.</p>
102
* @param result the output parameter to which the id will be appended.
103
* @return the modified result.
105
virtual UnicodeString& canonicalID(UnicodeString& result) const;
108
* <p>Return the (canonical) current ID. This implementation appends
109
* the canonical ID to result. Result is returned as a convenience.</p>
111
* @param result the output parameter to which the current id will be appended.
112
* @return the modified result.
114
virtual UnicodeString& currentID(UnicodeString& result) const;
117
* <p>Return the current descriptor. This implementation appends
118
* the current descriptor to result. Result is returned as a convenience.</p>
120
* <p>The current descriptor is used to fully
121
* identify an instance of the service in the cache. A
122
* factory may handle all descriptors for an ID, or just a
123
* particular descriptor. The factory can either parse the
124
* descriptor or use custom API on the key in order to
125
* instantiate the service.</p>
127
* @param result the output parameter to which the current id will be appended.
128
* @return the modified result.
130
virtual UnicodeString& currentDescriptor(UnicodeString& result) const;
133
* <p>If the key has a fallback, modify the key and return true,
134
* otherwise return false. The current ID will change if there
135
* is a fallback. No currentIDs should be repeated, and fallback
136
* must eventually return false. This implementation has no fallbacks
137
* and always returns false.</p>
139
* @return TRUE if the ICUServiceKey changed to a valid fallback value.
141
virtual UBool fallback();
144
* <p>Return TRUE if a key created from id matches, or would eventually
145
* fallback to match, the canonical ID of this ICUServiceKey.</p>
147
* @param id the id to test.
148
* @return TRUE if this ICUServiceKey's canonical ID is a fallback of id.
150
virtual UBool isFallbackOf(const UnicodeString& id) const;
153
* <p>Return the prefix. This implementation leaves result unchanged.
154
* Result is returned as a convenience.</p>
156
* @param result the output parameter to which the prefix will be appended.
157
* @return the modified result.
159
virtual UnicodeString& prefix(UnicodeString& result) const;
162
* <p>A utility to parse the prefix out of a descriptor string. Only
163
* the (undelimited) prefix, if any, remains in result. Result is returned as a
166
* @param result an input/output parameter that on entry is a descriptor, and
167
* on exit is the prefix of that descriptor.
168
* @return the modified result.
170
static UnicodeString& parsePrefix(UnicodeString& result);
173
* <p>A utility to parse the suffix out of a descriptor string. Only
174
* the (undelimited) suffix, if any, remains in result. Result is returned as a
177
* @param result an input/output parameter that on entry is a descriptor, and
178
* on exit is the suffix of that descriptor.
179
* @return the modified result.
181
static UnicodeString& parseSuffix(UnicodeString& result);
185
* UObject RTTI boilerplate.
187
static UClassID U_EXPORT2 getStaticClassID();
190
* UObject RTTI boilerplate.
192
virtual UClassID getDynamicClassID() const;
196
virtual UnicodeString& debug(UnicodeString& result) const;
197
virtual UnicodeString& debugClass(UnicodeString& result) const;
202
/*******************************************************************
207
* <p>An implementing ICUServiceFactory generates the service objects maintained by the
208
* service. A factory generates a service object from a key,
209
* updates id->factory mappings, and returns the display name for
210
* a supported id.</p>
212
class U_COMMON_API ICUServiceFactory : public UObject {
216
* <p>Create a service object from the key, if this factory
217
* supports the key. Otherwise, return NULL.</p>
219
* <p>If the factory supports the key, then it can call
220
* the service's getKey(ICUServiceKey, String[], ICUServiceFactory) method
221
* passing itself as the factory to get the object that
222
* the service would have created prior to the factory's
223
* registration with the service. This can change the
224
* key, so any information required from the key should
225
* be extracted before making such a callback.</p>
227
* @param key the service key.
228
* @param service the service with which this factory is registered.
229
* @param status the error code status.
230
* @return the service object, or NULL if the factory does not support the key.
232
virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const = 0;
235
* <p>Update result to reflect the IDs (not descriptors) that this
236
* factory publicly handles. Result contains mappings from ID to
237
* factory. On entry it will contain all (visible) mappings from
238
* previously-registered factories.</p>
240
* <p>This function, together with getDisplayName, are used to
241
* support ICUService::getDisplayNames. The factory determines
242
* which IDs (of those it supports) it will make visible, and of
243
* those, which it will provide localized display names for. In
244
* most cases it will register mappings from all IDs it supports
247
* @param result the mapping table to update.
248
* @param status the error code status.
250
virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const = 0;
253
* <p>Return, in result, the display name of the id in the provided locale.
254
* This is an id, not a descriptor. If the id is
255
* not visible, sets result to bogus. If the
256
* incoming result is bogus, it remains bogus. Result is returned as a
257
* convenience. Results are not defined if id is not one supported by this
260
* @param id a visible id supported by this factory.
261
* @param locale the locale for which to generate the corresponding localized display name.
262
* @param result output parameter to hold the display name.
265
virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const = 0;
269
******************************************************************
273
* <p>A default implementation of factory. This provides default
274
* implementations for subclasses, and implements a singleton
275
* factory that matches a single ID and returns a single
276
* (possibly deferred-initialized) instance. This implements
277
* updateVisibleIDs to add a mapping from its ID to itself
278
* if visible is true, or to remove any existing mapping
279
* for its ID if visible is false. No localization of display
280
* names is performed.</p>
282
class U_COMMON_API SimpleFactory : public ICUServiceFactory {
285
const UnicodeString _id;
286
const UBool _visible;
290
* <p>Construct a SimpleFactory that maps a single ID to a single
291
* service instance. If visible is TRUE, the ID will be visible.
292
* The instance must not be NULL. The SimpleFactory will adopt
293
* the instance, which must not be changed subsequent to this call.</p>
295
* @param instanceToAdopt the service instance to adopt.
296
* @param id the ID to assign to this service instance.
297
* @param visible if TRUE, the ID will be visible.
299
SimpleFactory(UObject* instanceToAdopt, const UnicodeString& id, UBool visible = TRUE);
304
virtual ~SimpleFactory();
307
* <p>This implementation returns a clone of the service instance if the factory's ID is equal to
308
* the key's currentID. Service and prefix are ignored.</p>
310
* @param key the service key.
311
* @param service the service with which this factory is registered.
312
* @param status the error code status.
313
* @return the service object, or NULL if the factory does not support the key.
315
virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const;
318
* <p>This implementation adds a mapping from ID -> this to result if visible is TRUE,
319
* otherwise it removes ID from result.</p>
321
* @param result the mapping table to update.
322
* @param status the error code status.
324
virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const;
327
* <p>This implementation returns the factory ID if it equals id and visible is TRUE,
328
* otherwise it returns the empty string. (This implementation provides
329
* no localized id information.)</p>
331
* @param id a visible id supported by this factory.
332
* @param locale the locale for which to generate the corresponding localized display name.
333
* @param result output parameter to hold the display name.
336
virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const;
340
* UObject RTTI boilerplate.
342
static UClassID U_EXPORT2 getStaticClassID();
345
* UObject RTTI boilerplate.
347
virtual UClassID getDynamicClassID() const;
351
virtual UnicodeString& debug(UnicodeString& toAppendTo) const;
352
virtual UnicodeString& debugClass(UnicodeString& toAppendTo) const;
358
******************************************************************
362
* <p>ServiceListener is the listener that ICUService provides by default.
363
* ICUService will notifiy this listener when factories are added to
364
* or removed from the service. Subclasses can provide
365
* different listener interfaces that extend EventListener, and modify
366
* acceptsListener and notifyListener as appropriate.</p>
368
class U_COMMON_API ServiceListener : public EventListener {
371
* <p>This method is called when the service changes. At the time of the
372
* call this listener is registered with the service. It must
373
* not modify the notifier in the context of this call.</p>
375
* @param service the service that changed.
377
virtual void serviceChanged(const ICUService& service) const = 0;
381
* UObject RTTI boilerplate.
383
static UClassID U_EXPORT2 getStaticClassID();
386
* UObject RTTI boilerplate.
388
virtual UClassID getDynamicClassID() const;
393
******************************************************************
397
* <p>A StringPair holds a displayName/ID pair. ICUService uses it
398
* as the array elements returned by getDisplayNames.
400
class U_COMMON_API StringPair : public UMemory {
403
* <p>The display name of the pair.</p>
405
const UnicodeString displayName;
408
* <p>The ID of the pair.</p>
410
const UnicodeString id;
413
* <p>Creates a string pair from a displayName and an ID.</p>
415
* @param displayName the displayName.
417
* @param status the error code status.
418
* @return a StringPair if the creation was successful, otherwise NULL.
420
static StringPair* create(const UnicodeString& displayName,
421
const UnicodeString& id,
425
* <p>Return TRUE if either string of the pair is bogus.</p>
426
* @return TRUE if either string of the pair is bogus.
428
UBool isBogus() const;
431
StringPair(const UnicodeString& displayName, const UnicodeString& id);
434
/*******************************************************************
439
* <p>A Service provides access to service objects that implement a
440
* particular service, e.g. transliterators. Users provide a String
441
* id (for example, a locale string) to the service, and get back an
442
* object for that id. Service objects can be any kind of object. A
443
* new service object is returned for each query. The caller is
444
* responsible for deleting it.</p>
446
* <p>Services 'canonicalize' the query ID and use the canonical ID to
447
* query for the service. The service also defines a mechanism to
448
* 'fallback' the ID multiple times. Clients can optionally request
449
* the actual ID that was matched by a query when they use an ID to
450
* retrieve a service object.</p>
452
* <p>Service objects are instantiated by ICUServiceFactory objects
453
* registered with the service. The service queries each
454
* ICUServiceFactory in turn, from most recently registered to
455
* earliest registered, until one returns a service object. If none
456
* responds with a service object, a fallback ID is generated, and the
457
* process repeats until a service object is returned or until the ID
458
* has no further fallbacks.</p>
460
* <p>In ICU 2.4, UObject (the base class of service instances) does
461
* not define a polymorphic clone function. ICUService uses clones to
462
* manage ownership. Thus, for now, ICUService defines an abstract
463
* method, cloneInstance, that clients must implement to create clones
464
* of the service instances. This may change in future releases of
467
* <p>ICUServiceFactories can be dynamically registered and
468
* unregistered with the service. When registered, an
469
* ICUServiceFactory is installed at the head of the factory list, and
470
* so gets 'first crack' at any keys or fallback keys. When
471
* unregistered, it is removed from the service and can no longer be
472
* located through it. Service objects generated by this factory and
473
* held by the client are unaffected.</p>
475
* <p>If a service has variants (e.g., the different variants of
476
* BreakIterator) an ICUServiceFactory can use the prefix of the
477
* ICUServiceKey to determine the variant of a service to generate.
478
* If it does not support all variants, it can request
479
* previously-registered factories to handle the ones it does not
482
* <p>ICUService uses ICUServiceKeys to query factories and perform
483
* fallback. The ICUServiceKey defines the canonical form of the ID,
484
* and implements the fallback strategy. Custom ICUServiceKeys can be
485
* defined that parse complex IDs into components that
486
* ICUServiceFactories can more easily use. The ICUServiceKey can
487
* cache the results of this parsing to save repeated effort.
488
* ICUService provides convenience APIs that take UnicodeStrings and
489
* generate default ICUServiceKeys for use in querying.</p>
491
* <p>ICUService provides API to get the list of IDs publicly
492
* supported by the service (although queries aren't restricted to
493
* this list). This list contains only 'simple' IDs, and not fully
494
* unique IDs. ICUServiceFactories are associated with each simple ID
495
* and the responsible factory can also return a human-readable
496
* localized version of the simple ID, for use in user interfaces.
497
* ICUService can also provide an array of the all the localized
498
* visible IDs and their corresponding internal IDs.</p>
500
* <p>ICUService implements ICUNotifier, so that clients can register
501
* to receive notification when factories are added or removed from
502
* the service. ICUService provides a default EventListener
503
* subinterface, ServiceListener, which can be registered with the
504
* service. When the service changes, the ServiceListener's
505
* serviceChanged method is called with the service as the
508
* <p>The ICUService API is both rich and generic, and it is expected
509
* that most implementations will statically 'wrap' ICUService to
510
* present a more appropriate API-- for example, to declare the type
511
* of the objects returned from get, to limit the factories that can
512
* be registered with the service, or to define their own listener
513
* interface with a custom callback method. They might also customize
514
* ICUService by overriding it, for example, to customize the
515
* ICUServiceKey and fallback strategy. ICULocaleService is a
516
* subclass of ICUService that uses Locale names as IDs and uses
517
* ICUServiceKeys that implement the standard resource bundle fallback
518
* strategy. Most clients will wish to subclass it instead of
521
class U_COMMON_API ICUService : public ICUNotifier {
524
* Name useful for debugging.
526
const UnicodeString name;
531
* single lock used by this service.
536
* Timestamp so iterators can be fail-fast.
541
* All the factories registered with this service.
548
Hashtable* serviceCache;
565
* <p>Construct a new ICUService.</p>
570
* <p>Construct with a name (useful for debugging).</p>
572
* @param name a name to use in debugging.
574
ICUService(const UnicodeString& name);
579
virtual ~ICUService();
582
* <p>Return the name of this service. This will be the empty string if none was assigned.
583
* Returns result as a convenience.</p>
585
* @param result an output parameter to contain the name of this service.
586
* @return the name of this service.
588
UnicodeString& getName(UnicodeString& result) const;
591
* <p>Convenience override for get(ICUServiceKey&, UnicodeString*). This uses
592
* createKey to create a key for the provided descriptor.</p>
594
* @param descriptor the descriptor.
595
* @param status the error code status.
596
* @return the service instance, or NULL.
598
UObject* get(const UnicodeString& descriptor, UErrorCode& status) const;
601
* <p>Convenience override for get(ICUServiceKey&, UnicodeString*). This uses
602
* createKey to create a key from the provided descriptor.</p>
604
* @param descriptor the descriptor.
605
* @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL.
606
* @param status the error code status.
607
* @return the service instance, or NULL.
609
UObject* get(const UnicodeString& descriptor, UnicodeString* actualReturn, UErrorCode& status) const;
612
* <p>Convenience override for get(ICUServiceKey&, UnicodeString*).</p>
614
* @param key the key.
615
* @param status the error code status.
616
* @return the service instance, or NULL.
618
UObject* getKey(ICUServiceKey& key, UErrorCode& status) const;
621
* <p>Given a key, return a service object, and, if actualReturn
622
* is not NULL, the descriptor with which it was found in the
623
* first element of actualReturn. If no service object matches
624
* this key, returns NULL and leaves actualReturn unchanged.</p>
626
* <p>This queries the cache using the key's descriptor, and if no
627
* object in the cache matches, tries the key on each
628
* registered factory, in order. If none generates a service
629
* object for the key, repeats the process with each fallback of
630
* the key, until either a factory returns a service object, or the key
631
* has no fallback. If no object is found, the result of handleDefault
634
* <p>Subclasses can override this method to further customize the
635
* result before returning it.
637
* @param key the key.
638
* @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL.
639
* @param status the error code status.
640
* @return the service instance, or NULL.
642
virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const;
645
* <p>This version of getKey is only called by ICUServiceFactories within the scope
646
* of a previous getKey call, to determine what previously-registered factories would
647
* have returned. For details, see getKey(ICUServiceKey&, UErrorCode&). Subclasses
648
* should not call it directly, but call through one of the other get functions.</p>
650
* @param key the key.
651
* @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL.
652
* @param factory the factory making the recursive call.
653
* @param status the error code status.
654
* @return the service instance, or NULL.
656
UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUServiceFactory* factory, UErrorCode& status) const;
659
* <p>Convenience override for getVisibleIDs(String) that passes null
660
* as the fallback, thus returning all visible IDs.</p>
662
* @param result a vector to hold the returned IDs.
663
* @param status the error code status.
664
* @return the result vector.
666
UVector& getVisibleIDs(UVector& result, UErrorCode& status) const;
669
* <p>Return a snapshot of the visible IDs for this service. This
670
* list will not change as ICUServiceFactories are added or removed, but the
671
* supported IDs will, so there is no guarantee that all and only
672
* the IDs in the returned list will be visible and supported by the
673
* service in subsequent calls.</p>
675
* <p>The IDs are returned as pointers to UnicodeStrings. The
676
* caller owns the IDs. Previous contents of result are discarded before
677
* new elements, if any, are added.</p>
679
* <p>matchID is passed to createKey to create a key. If the key
680
* is not NULL, its isFallbackOf method is used to filter out IDs
681
* that don't match the key or have it as a fallback.</p>
683
* @param result a vector to hold the returned IDs.
684
* @param matchID an ID used to filter the result, or NULL if all IDs are desired.
685
* @param status the error code status.
686
* @return the result vector.
688
UVector& getVisibleIDs(UVector& result, const UnicodeString* matchID, UErrorCode& status) const;
691
* <p>Convenience override for getDisplayName(const UnicodeString&, const Locale&, UnicodeString&) that
692
* uses the current default locale.</p>
694
* @param id the ID for which to retrieve the localized displayName.
695
* @param result an output parameter to hold the display name.
696
* @return the modified result.
698
UnicodeString& getDisplayName(const UnicodeString& id, UnicodeString& result) const;
701
* <p>Given a visible ID, return the display name in the requested locale.
702
* If there is no directly supported ID corresponding to this ID, result is
705
* @param id the ID for which to retrieve the localized displayName.
706
* @param result an output parameter to hold the display name.
707
* @param locale the locale in which to localize the ID.
708
* @return the modified result.
710
UnicodeString& getDisplayName(const UnicodeString& id, UnicodeString& result, const Locale& locale) const;
713
* <p>Convenience override of getDisplayNames(const Locale&, const UnicodeString*) that
714
* uses the current default Locale as the locale and NULL for
717
* @param result a vector to hold the returned displayName/id StringPairs.
718
* @param status the error code status.
719
* @return the modified result vector.
721
UVector& getDisplayNames(UVector& result, UErrorCode& status) const;
724
* <p>Convenience override of getDisplayNames(const Locale&, const UnicodeString*) that
725
* uses NULL for the matchID.</p>
727
* @param result a vector to hold the returned displayName/id StringPairs.
728
* @param locale the locale in which to localize the ID.
729
* @param status the error code status.
730
* @return the modified result vector.
732
UVector& getDisplayNames(UVector& result, const Locale& locale, UErrorCode& status) const;
735
* <p>Return a snapshot of the mapping from display names to visible
736
* IDs for this service. This set will not change as factories
737
* are added or removed, but the supported IDs will, so there is
738
* no guarantee that all and only the IDs in the returned map will
739
* be visible and supported by the service in subsequent calls,
740
* nor is there any guarantee that the current display names match
741
* those in the result.</p>
743
* <p>The names are returned as pointers to StringPairs, which
744
* contain both the displayName and the corresponding ID. The
745
* caller owns the StringPairs. Previous contents of result are
746
* discarded before new elements, if any, are added.</p>
748
* <p>matchID is passed to createKey to create a key. If the key
749
* is not NULL, its isFallbackOf method is used to filter out IDs
750
* that don't match the key or have it as a fallback.</p>
752
* @param result a vector to hold the returned displayName/id StringPairs.
753
* @param locale the locale in which to localize the ID.
754
* @param matchID an ID used to filter the result, or NULL if all IDs are desired.
755
* @param status the error code status.
756
* @return the result vector. */
757
UVector& getDisplayNames(UVector& result,
758
const Locale& locale,
759
const UnicodeString* matchID,
760
UErrorCode& status) const;
763
* <p>A convenience override of registerInstance(UObject*, const UnicodeString&, UBool)
764
* that defaults visible to TRUE.</p>
766
* @param objToAdopt the object to register and adopt.
767
* @param id the ID to assign to this object.
768
* @param status the error code status.
769
* @return a registry key that can be passed to unregister to unregister
770
* (and discard) this instance.
772
URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& id, UErrorCode& status);
775
* <p>Register a service instance with the provided ID. The ID will be
776
* canonicalized. The canonicalized ID will be returned by
777
* getVisibleIDs if visible is TRUE. The service instance will be adopted and
778
* must not be modified subsequent to this call.</p>
780
* <p>This issues a serviceChanged notification to registered listeners.</p>
782
* <p>This implementation wraps the object using
783
* createSimpleFactory, and calls registerFactory.</p>
785
* @param objToAdopt the object to register and adopt.
786
* @param id the ID to assign to this object.
787
* @param visible TRUE if getVisibleIDs is to return this ID.
788
* @param status the error code status.
789
* @return a registry key that can be passed to unregister() to unregister
790
* (and discard) this instance.
792
virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& id, UBool visible, UErrorCode& status);
795
* <p>Register an ICUServiceFactory. Returns a registry key that
796
* can be used to unregister the factory. The factory
797
* must not be modified subsequent to this call. The service owns
798
* all registered factories. In case of an error, the factory is
801
* <p>This issues a serviceChanged notification to registered listeners.</p>
803
* <p>The default implementation accepts all factories.</p>
805
* @param factoryToAdopt the factory to register and adopt.
806
* @param status the error code status.
807
* @return a registry key that can be passed to unregister to unregister
808
* (and discard) this factory.
810
virtual URegistryKey registerFactory(ICUServiceFactory* factoryToAdopt, UErrorCode& status);
813
* <p>Unregister a factory using a registry key returned by
814
* registerInstance or registerFactory. After a successful call,
815
* the factory will be removed from the service factory list and
816
* deleted, and the key becomes invalid.</p>
818
* <p>This issues a serviceChanged notification to registered
821
* @param rkey the registry key.
822
* @param status the error code status.
823
* @return TRUE if the call successfully unregistered the factory.
825
virtual UBool unregister(URegistryKey rkey, UErrorCode& status);
828
* </p>Reset the service to the default factories. The factory
829
* lock is acquired and then reInitializeFactories is called.</p>
831
* <p>This issues a serviceChanged notification to registered listeners.</p>
833
virtual void reset(void);
836
* <p>Return TRUE if the service is in its default state.</p>
838
* <p>The default implementation returns TRUE if there are no
839
* factories registered.</p>
841
virtual UBool isDefault(void) const;
844
* <p>Create a key from an ID. If ID is NULL, returns NULL.</p>
846
* <p>The default implementation creates an ICUServiceKey instance.
847
* Subclasses can override to define more useful keys appropriate
848
* to the factories they accept.</p>
850
* @param a pointer to the ID for which to create a default ICUServiceKey.
851
* @param status the error code status.
852
* @return the ICUServiceKey corresponding to ID, or NULL.
854
virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const;
857
* <p>Clone object so that caller can own the copy. In ICU2.4, UObject doesn't define
858
* clone, so we need an instance-aware method that knows how to do this.
859
* This is public so factories can call it, but should really be protected.</p>
861
* @param instance the service instance to clone.
862
* @return a clone of the passed-in instance, or NULL if cloning was unsuccessful.
864
virtual UObject* cloneInstance(UObject* instance) const = 0;
867
/************************************************************************
874
* <p>Create a factory that wraps a single service object. Called by registerInstance.</p>
876
* <p>The default implementation returns an instance of SimpleFactory.</p>
878
* @param instanceToAdopt the service instance to adopt.
879
* @param id the ID to assign to this service instance.
880
* @param visible if TRUE, the ID will be visible.
881
* @param status the error code status.
882
* @return an instance of ICUServiceFactory that maps this instance to the provided ID.
884
virtual ICUServiceFactory* createSimpleFactory(UObject* instanceToAdopt, const UnicodeString& id, UBool visible, UErrorCode& status);
887
* <p>Reinitialize the factory list to its default state. After this call, isDefault()
888
* must return TRUE.</p>
890
* <p>This issues a serviceChanged notification to registered listeners.</p>
892
* <p>The default implementation clears the factory list.
893
* Subclasses can override to provide other default initialization
894
* of the factory list. Subclasses must not call this method
895
* directly, since it must only be called while holding write
896
* access to the factory list.</p>
898
virtual void reInitializeFactories(void);
901
* <p>Default handler for this service if no factory in the factory list
902
* handled the key passed to getKey.</p>
904
* <p>The default implementation returns NULL.</p>
906
* @param key the key.
907
* @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL.
908
* @param status the error code status.
909
* @return the service instance, or NULL.
911
virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const;
914
* <p>Clear caches maintained by this service.</p>
916
* <p>Subclasses can override if they implement additional caches
917
* that need to be cleared when the service changes. Subclasses
918
* should generally not call this method directly, as it must only
919
* be called while synchronized on the factory lock.</p>
921
virtual void clearCaches(void);
924
* <p>Return true if the listener is accepted.</p>
926
* <p>The default implementation accepts the listener if it is
927
* a ServiceListener. Subclasses can override this to accept
928
* different listeners.</p>
930
* @param l the listener to test.
931
* @return TRUE if the service accepts the listener.
933
virtual UBool acceptsListener(const EventListener& l) const;
936
* <p>Notify the listener of a service change.</p>
938
* <p>The default implementation assumes a ServiceListener.
939
* If acceptsListener has been overridden to accept different
940
* listeners, this should be overridden as well.</p>
942
* @param l the listener to notify.
944
virtual void notifyListener(EventListener& l) const;
946
/************************************************************************
947
* Utilities for subclasses.
951
* <p>Clear only the service cache.</p>
953
* <p>This can be called by subclasses when a change affects the service
954
* cache but not the ID caches, e.g., when the default locale changes
955
* the resolution of IDs also changes, requiring the cache to be
956
* flushed, but not the visible IDs themselves.</p>
958
void clearServiceCache(void);
961
* <p>Return a map from visible IDs to factories.
962
* This must only be called when the mutex is held.</p>
964
* @param status the error code status.
965
* @return a Hashtable containing mappings from visible
968
const Hashtable* getVisibleIDMap(UErrorCode& status) const;
971
* <p>Allow subclasses to read the time stamp.</p>
973
* @return the timestamp.
975
int32_t getTimestamp(void) const;
978
* <p>Return the number of registered factories.</p>
980
* @return the number of factories registered at the time of the call.
982
int32_t countFactories(void) const;
986
friend class ::ICUServiceTest; // give tests access to countFactories.
991
/* UCONFIG_NO_SERVICE */