1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /** 4 ******************************************************************************* 5 * Copyright (C) 2001-2014, International Business Machines Corporation and * 6 * others. All Rights Reserved. * 7 ******************************************************************************* 8 */ 9 #ifndef ICUNOTIF_H 10 #define ICUNOTIF_H 11 12 #include "unicode/utypes.h" 13 14 #if UCONFIG_NO_SERVICE 15 16 U_NAMESPACE_BEGIN 17 18 /* 19 * Allow the declaration of APIs with pointers to BreakIterator 20 * even when break iteration is removed from the build. 21 */ 22 class ICUNotifier; 23 24 U_NAMESPACE_END 25 26 #else 27 28 #include "unicode/uobject.h" 29 #include "unicode/unistr.h" 30 31 #include "mutex.h" 32 #include "uvector.h" 33 34 U_NAMESPACE_BEGIN 35 36 class U_COMMON_API EventListener : public UObject { 37 public: 38 virtual ~EventListener(); 39 40 public: 41 static UClassID U_EXPORT2 getStaticClassID(); 42 43 virtual UClassID getDynamicClassID() const override; 44 45 public: 46 #ifdef SERVICE_DEBUG 47 virtual UnicodeString& debug(UnicodeString& result) const { 48 return debugClass(result); 49 } 50 51 virtual UnicodeString& debugClass(UnicodeString& result) const { 52 return result.append((UnicodeString)"Key"); 53 } 54 #endif 55 }; 56 57 /** 58 * <p>Abstract implementation of a notification facility. Clients add 59 * EventListeners with addListener and remove them with removeListener. 60 * Notifiers call notifyChanged when they wish to notify listeners. 61 * This queues the listener list on the notification thread, which 62 * eventually dequeues the list and calls notifyListener on each 63 * listener in the list.</p> 64 * 65 * <p>Subclasses override acceptsListener and notifyListener 66 * to add type-safe notification. AcceptsListener should return 67 * true if the listener is of the appropriate type; ICUNotifier 68 * itself will ensure the listener is non-null and that the 69 * identical listener is not already registered with the Notifier. 70 * NotifyListener should cast the listener to the appropriate 71 * type and call the appropriate method on the listener. 72 */ 73 74 class U_COMMON_API ICUNotifier : public UMemory { 75 private: UVector* listeners; 76 77 public: 78 ICUNotifier(void); 79 80 virtual ~ICUNotifier(void); 81 82 /** 83 * Add a listener to be notified when notifyChanged is called. 84 * The listener must not be null. AcceptsListener must return 85 * true for the listener. Attempts to concurrently 86 * register the identical listener more than once will be 87 * silently ignored. 88 */ 89 virtual void addListener(const EventListener* l, UErrorCode& status); 90 91 /** 92 * Stop notifying this listener. The listener must 93 * not be null. Attempts to remove a listener that is 94 * not registered will be silently ignored. 95 */ 96 virtual void removeListener(const EventListener* l, UErrorCode& status); 97 98 /** 99 * ICU doesn't spawn its own threads. All listeners are notified in 100 * the thread of the caller. Misbehaved listeners can therefore 101 * indefinitely block the calling thread. Callers should beware of 102 * deadlock situations. 103 */ 104 virtual void notifyChanged(void); 105 106 protected: 107 /** 108 * Subclasses implement this to return true if the listener is 109 * of the appropriate type. 110 */ 111 virtual UBool acceptsListener(const EventListener& l) const = 0; 112 113 /** 114 * Subclasses implement this to notify the listener. 115 */ 116 virtual void notifyListener(EventListener& l) const = 0; 117 }; 118 119 U_NAMESPACE_END 120 121 /* UCONFIG_NO_SERVICE */ 122 #endif 123 124 /* ICUNOTIF_H */ 125 #endif 126