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