]> git.saurik.com Git - apple/icu.git/blame - icuSources/common/servnotf.h
ICU-62108.0.1.tar.gz
[apple/icu.git] / icuSources / common / servnotf.h
CommitLineData
f3c0d7a5
A
1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
b75a7d8f
A
3/**
4 *******************************************************************************
b331163b 5 * Copyright (C) 2001-2014, International Business Machines Corporation and *
b75a7d8f
A
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 {
374ca955
A
37public:
38 virtual ~EventListener();
b75a7d8f 39
374ca955
A
40public:
41 static UClassID U_EXPORT2 getStaticClassID();
b75a7d8f 42
374ca955 43 virtual UClassID getDynamicClassID() const;
b75a7d8f 44
374ca955
A
45public:
46#ifdef SERVICE_DEBUG
b75a7d8f
A
47 virtual UnicodeString& debug(UnicodeString& result) const {
48 return debugClass(result);
49 }
50
51 virtual UnicodeString& debugClass(UnicodeString& result) const {
b331163b 52 return result.append((UnicodeString)"Key");
b75a7d8f 53 }
374ca955 54#endif
b75a7d8f
A
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 {
374ca955
A
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;
b75a7d8f
A
117};
118
119U_NAMESPACE_END
120
121/* UCONFIG_NO_SERVICE */
122#endif
123
124/* ICUNOTIF_H */
125#endif