michael@0: /** michael@0: ******************************************************************************* michael@0: * Copyright (C) 2001-2012, International Business Machines Corporation and * michael@0: * others. All Rights Reserved. * michael@0: ******************************************************************************* michael@0: */ michael@0: michael@0: #include "unicode/utypes.h" michael@0: michael@0: #if !UCONFIG_NO_SERVICE michael@0: michael@0: #include "servnotf.h" michael@0: #ifdef NOTIFIER_DEBUG michael@0: #include michael@0: #endif michael@0: michael@0: U_NAMESPACE_BEGIN michael@0: michael@0: EventListener::~EventListener() {} michael@0: UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener) michael@0: michael@0: static UMutex notifyLock = U_MUTEX_INITIALIZER; michael@0: michael@0: ICUNotifier::ICUNotifier(void) michael@0: : listeners(NULL) michael@0: { michael@0: } michael@0: michael@0: ICUNotifier::~ICUNotifier(void) { michael@0: { michael@0: Mutex lmx(¬ifyLock); michael@0: delete listeners; michael@0: listeners = NULL; michael@0: } michael@0: } michael@0: michael@0: michael@0: void michael@0: ICUNotifier::addListener(const EventListener* l, UErrorCode& status) michael@0: { michael@0: if (U_SUCCESS(status)) { michael@0: if (l == NULL) { michael@0: status = U_ILLEGAL_ARGUMENT_ERROR; michael@0: return; michael@0: } michael@0: michael@0: if (acceptsListener(*l)) { michael@0: Mutex lmx(¬ifyLock); michael@0: if (listeners == NULL) { michael@0: listeners = new UVector(5, status); michael@0: } else { michael@0: for (int i = 0, e = listeners->size(); i < e; ++i) { michael@0: const EventListener* el = (const EventListener*)(listeners->elementAt(i)); michael@0: if (l == el) { michael@0: return; michael@0: } michael@0: } michael@0: } michael@0: michael@0: listeners->addElement((void*)l, status); // cast away const michael@0: } michael@0: #ifdef NOTIFIER_DEBUG michael@0: else { michael@0: fprintf(stderr, "Listener invalid for this notifier."); michael@0: exit(1); michael@0: } michael@0: #endif michael@0: } michael@0: } michael@0: michael@0: void michael@0: ICUNotifier::removeListener(const EventListener *l, UErrorCode& status) michael@0: { michael@0: if (U_SUCCESS(status)) { michael@0: if (l == NULL) { michael@0: status = U_ILLEGAL_ARGUMENT_ERROR; michael@0: return; michael@0: } michael@0: michael@0: { michael@0: Mutex lmx(¬ifyLock); michael@0: if (listeners != NULL) { michael@0: // identity equality check michael@0: for (int i = 0, e = listeners->size(); i < e; ++i) { michael@0: const EventListener* el = (const EventListener*)listeners->elementAt(i); michael@0: if (l == el) { michael@0: listeners->removeElementAt(i); michael@0: if (listeners->size() == 0) { michael@0: delete listeners; michael@0: listeners = NULL; michael@0: } michael@0: return; michael@0: } michael@0: } michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: void michael@0: ICUNotifier::notifyChanged(void) michael@0: { michael@0: if (listeners != NULL) { michael@0: Mutex lmx(¬ifyLock); michael@0: if (listeners != NULL) { michael@0: for (int i = 0, e = listeners->size(); i < e; ++i) { michael@0: EventListener* el = (EventListener*)listeners->elementAt(i); michael@0: notifyListener(*el); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: U_NAMESPACE_END michael@0: michael@0: /* UCONFIG_NO_SERVICE */ michael@0: #endif michael@0: