STDMETHODIMP EventSource::EventProcessed(IEventListener * aListener, IEvent * aEvent) { CheckComArgNotNull(aListener); CheckComArgNotNull(aEvent); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); Listeners::iterator it = m->mListeners.find(aListener); HRESULT rc; BOOL aWaitable = FALSE; aEvent->COMGETTER(Waitable)(&aWaitable); if (it != m->mListeners.end()) { ListenerRecord* aRecord = it->second.obj(); if (aRecord->isActive()) return setError(E_INVALIDARG, tr("Only applicable to passive listeners")); if (aWaitable) { PendingEventsMap::iterator pit = m->mPendingMap.find(aEvent); if (pit == m->mPendingMap.end()) { AssertFailed(); rc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("Unknown event")); } else rc = aRecord->eventProcessed(aEvent, pit); } else { // for non-waitable events we're done rc = S_OK; } } else { rc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("Listener was never registered")); } return rc; }
HRESULT EventSource::eventProcessed(const ComPtr<IEventListener> &aListener, const ComPtr<IEvent> &aEvent) { AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); if (m->fShutdown) return setError(VBOX_E_INVALID_OBJECT_STATE, tr("This event source is already shut down")); Listeners::iterator it = m->mListeners.find(aListener); HRESULT rc; BOOL aWaitable = FALSE; aEvent->COMGETTER(Waitable)(&aWaitable); if (it != m->mListeners.end()) { ListenerRecord *aRecord = it->second.obj(); if (aRecord->isActive()) return setError(E_INVALIDARG, tr("Only applicable to passive listeners")); if (aWaitable) { PendingEventsMap::iterator pit = m->mPendingMap.find(aEvent); if (pit == m->mPendingMap.end()) { AssertFailed(); rc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("Unknown event")); } else rc = aRecord->eventProcessed(aEvent, pit); } else { // for non-waitable events we're done rc = S_OK; } } else { rc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("Listener was never registered")); } return rc; }