void KEventObject::FireEvent(const char* event, const ValueList& args) { // Make a copy of the listeners map here, because firing the event might // take a while and we don't want to block other threads that just need // too add event listeners. EventListenerList listenersCopy; { Poco::FastMutex::ScopedLock lock(this->listenersMutex); listenersCopy = listeners; } KObjectRef thisObject(this, true); EventListenerList::iterator li = listenersCopy.begin(); while (li != listenersCopy.end()) { EventListener* listener = *li++; if (listener->Handles(event)) { try { if (!listener->Dispatch(thisObject, args, true)) { // Stop event dispatch if callback tells us break; } } catch (ValueException& e) { this->ReportDispatchError(e.ToString()); break; } } } }
bool KEventObject::FireEvent(AutoPtr<Event> event, bool synchronous) { // Make a copy of the listeners map here, because firing the event might // take a while and we don't want to block other threads that just need // too add event listeners. EventListenerList listenersCopy; { Poco::FastMutex::ScopedLock lock(listenersMutex); listenersCopy = listeners; } KObjectRef thisObject(this, true); EventListenerList::iterator li = listenersCopy.begin(); while (li != listenersCopy.end()) { EventListener* listener = *li++; if (listener->Handles(event->eventName.c_str())) { ValueList args(Value::NewObject(event)); bool result = false; try { result = listener->Dispatch(thisObject, args, synchronous); } catch (ValueException& e) { this->ReportDispatchError(e.ToString()); } if (synchronous && (event->stopped || !result)) return !event->preventedDefault; } } if (this != GlobalObject::GetInstance().get()) GlobalObject::GetInstance()->FireEvent(event, synchronous); return !synchronous || !event->preventedDefault; }