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