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
16U_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 */
22class ICUNotifier;
23
24U_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
34U_NAMESPACE_BEGIN
35
36class U_COMMON_API EventListener : public UObject {
37public:
38 virtual ~EventListener();
39
40public:
41 static UClassID U_EXPORT2 getStaticClassID();
42
43 virtual UClassID getDynamicClassID() const;
44
45public:
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
74class U_COMMON_API ICUNotifier : public UMemory {
75private: UVector* listeners;
76
77public:
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. Attemps 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
106protected:
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
119U_NAMESPACE_END
120
121/* UCONFIG_NO_SERVICE */
122#endif
123
124/* ICUNOTIF_H */
125#endif
126