HRESULT WebNotificationCenter::addObserver(_In_opt_ IWebNotificationObserver* observer, _In_ BSTR notificationName, _In_opt_ IUnknown* anObject) { String name(notificationName, SysStringLen(notificationName)); MappedObservers::iterator it = d->m_mappedObservers.find(name); if (it != d->m_mappedObservers.end()) it->value.append(ObjectObserverPair(anObject, observer)); else { ObjectObserverList list; list.append(ObjectObserverPair(anObject, observer)); d->m_mappedObservers.add(name, list); } return S_OK; }
HRESULT STDMETHODCALLTYPE WebNotificationCenter::addObserver( /* [in] */ IWebNotificationObserver* observer, /* [in] */ BSTR notificationName, /* [in] */ IUnknown* anObject) { String name(notificationName, SysStringLen(notificationName)); MappedObservers::iterator it = d->m_mappedObservers.find(name); if (it != d->m_mappedObservers.end()) it->second.append(ObjectObserverPair(anObject, observer)); else { ObjectObserverList list; list.append(ObjectObserverPair(anObject, observer)); d->m_mappedObservers.add(name, list); } return S_OK; }
void WebNotificationCenter::postNotificationInternal(IWebNotification* notification, BSTR notificationName, IUnknown* anObject) { String name(notificationName, SysStringLen(notificationName)); MappedObservers::iterator it = d->m_mappedObservers.find(name); if (it == d->m_mappedObservers.end()) return; // Intentionally make a copy of the list to avoid the possibility of errors // from a mutation of the list in the onNotify callback. ObjectObserverList list = it->second; ObserverListIterator end = list.end(); for (ObserverListIterator it2 = list.begin(); it2 != end; ++it2) { IUnknown* observedObject = it2->first.get(); IWebNotificationObserver* observer = it2->second.get(); if (!observedObject || !anObject || observedObject == anObject) observer->onNotify(notification); } }