diff options
Diffstat (limited to 'src/components/application_manager/src/event_engine/event_dispatcher_impl.cc')
-rw-r--r-- | src/components/application_manager/src/event_engine/event_dispatcher_impl.cc | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc index f1e5bf9735..3f3cfae1d3 100644 --- a/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc +++ b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc @@ -122,5 +122,77 @@ void EventDispatcherImpl::remove_observer_from_vector(EventObserver& observer) { observers_.end()); } +// Mobile Events + +void EventDispatcherImpl::raise_mobile_event(const MobileEvent& event) { + AutoLock observer_lock(mobile_observer_lock_); + { + AutoLock state_lock(mobile_state_lock_); + + // check if event is notification + if (mobile_apis::messageType::notification == event.smart_object_type()) { + const uint32_t notification_correlation_id = 0; + mobile_observers_ = + mobile_observers_event_[event.id()][notification_correlation_id]; + } + + if (mobile_apis::messageType::response == event.smart_object_type()) { + mobile_observers_ = mobile_observers_event_ + [event.id()][event.smart_object_correlation_id()]; + } + } + + // Call observers + while (!mobile_observers_.empty()) { + EventObserver* temp = *mobile_observers_.begin(); + mobile_observers_.erase(mobile_observers_.begin()); + AutoUnlock unlock_observer(observer_lock); + temp->on_event(event); + } +} + +void EventDispatcherImpl::add_mobile_observer( + const MobileEvent::MobileEventID& event_id, + int32_t mobile_correlation_id, + EventObserver& observer) { + AutoLock auto_lock(mobile_state_lock_); + mobile_observers_event_[event_id][mobile_correlation_id].push_back(&observer); +} + +void EventDispatcherImpl::remove_mobile_observer( + const MobileEvent::MobileEventID& event_id, EventObserver& observer) { + remove_mobile_observer_from_vector(observer); + AutoLock auto_lock(mobile_state_lock_); + ObserversMap::iterator it = mobile_observers_event_[event_id].begin(); + + for (; mobile_observers_event_[event_id].end() != it; ++it) { + ObserverVector& obs_vec = it->second; + const ObserverVector::iterator obs_vec_it = obs_vec.end(); + obs_vec.erase( + std::remove_if( + obs_vec.begin(), obs_vec_it, IdCheckFunctor(observer.id())), + obs_vec_it); + } +} + +void EventDispatcherImpl::remove_mobile_observer(EventObserver& observer) { + remove_mobile_observer_from_vector(observer); + MobileEventObserverMap::iterator event_map = mobile_observers_event_.begin(); + + for (; mobile_observers_event_.end() != event_map; ++event_map) { + remove_mobile_observer(event_map->first, observer); + } +} + +void EventDispatcherImpl::remove_mobile_observer_from_vector( + EventObserver& observer) { + AutoLock auto_lock(mobile_observer_lock_); + + mobile_observers_.erase( + std::remove_if( + observers_.begin(), observers_.end(), IdCheckFunctor(observer.id())), + observers_.end()); +} + } // namespace event_engine } // namespace application_manager |