diff options
Diffstat (limited to 'src/components/application_manager')
9 files changed, 283 insertions, 205 deletions
diff --git a/src/components/application_manager/include/application_manager/event_engine/event.h b/src/components/application_manager/include/application_manager/event_engine/event.h index 55f5cd1320..18c9a972e9 100644 --- a/src/components/application_manager/include/application_manager/event_engine/event.h +++ b/src/components/application_manager/include/application_manager/event_engine/event.h @@ -141,7 +141,7 @@ int32_t Event::smart_object_type() const { strings::params).getElement(strings::message_type).asInt(); } -} -} +} // namespace event_engine +} // namespace application_manager #endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_H_ diff --git a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h index ff21b01c58..1af42898be 100644 --- a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h +++ b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2016, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -34,11 +34,6 @@ #define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_DISPATCHER_H_ #include <list> -#include <map> - -#include "utils/lock.h" -#include "utils/singleton.h" - #include "application_manager/event_engine/event.h" namespace application_manager { @@ -46,7 +41,7 @@ namespace event_engine { class EventObserver; -class EventDispatcher : public utils::Singleton<EventDispatcher> { +class EventDispatcher { public: /* @@ -54,7 +49,7 @@ class EventDispatcher : public utils::Singleton<EventDispatcher> { * * @param event Received event */ - void raise_event(const Event& event); + virtual void raise_event(const Event& event) = 0; /* * @brief Subscribe the observer to event @@ -63,9 +58,9 @@ class EventDispatcher : public utils::Singleton<EventDispatcher> { * @param hmi_correlation_id The event HMI correlation ID * @param observer The observer to subscribe for event */ - void add_observer(const Event::EventID& event_id, + virtual void add_observer(const Event::EventID& event_id, int32_t hmi_correlation_id, - EventObserver* const observer); + EventObserver* const observer) = 0; /* * @brief Unsubscribes the observer from specific event @@ -73,55 +68,24 @@ class EventDispatcher : public utils::Singleton<EventDispatcher> { * @param event_id The event ID to unsubscribe from * @param observer The observer to be unsubscribed */ - void remove_observer(const Event::EventID& event_id, - EventObserver* const observer); + virtual void remove_observer(const Event::EventID& event_id, + EventObserver* const observer) = 0; /* * @brief Unsubscribes the observer from all events * * @param observer The observer to be unsubscribed */ - void remove_observer(EventObserver* const observer); - - protected: - - private: - - /* - * @brief Default constructor - */ - EventDispatcher(); + virtual void remove_observer(EventObserver* const observer) = 0; /* * @brief Destructor */ - virtual ~EventDispatcher(); - - /* - * @brief removes observer - * when occurs unsubscribe from event - * @param observer to be removed - */ - void remove_observer_from_list(EventObserver* const observer); - - DISALLOW_COPY_AND_ASSIGN(EventDispatcher); - - FRIEND_BASE_SINGLETON_CLASS(EventDispatcher); - - // Data types section - typedef std::list<EventObserver*> ObserverList; - typedef std::map<int32_t, ObserverList> ObserversMap; - typedef std::map<Event::EventID, ObserversMap> EventObserverMap; - - // Members section - sync_primitives::Lock state_lock_; - sync_primitives::Lock observer_list_lock_; - EventObserverMap observers_; - ObserverList observers_list_; - + virtual ~EventDispatcher() { + }; }; -} -} +} // namespace event_engine +} // namespace application_manager #endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_DISPATCHER_H_ diff --git a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h new file mode 100644 index 0000000000..e834889bff --- /dev/null +++ b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h @@ -0,0 +1,127 @@ +/* + Copyright (c) 2016, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_DISPATCHER_IMPL_H_ +#define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_DISPATCHER_IMPL_H_ + +#include <vector> +#include <map> + +#include "utils/lock.h" +#include "utils/singleton.h" + +#include "application_manager/event_engine/event.h" +#include "application_manager/event_engine/event_dispatcher.h" + +namespace application_manager { +namespace event_engine { + +class EventObserver; + +class EventDispatcherImpl : public EventDispatcher, + public utils::Singleton<EventDispatcherImpl> { + public: + + /* + * @brief Delivers the event to all subscribers + * + * @param event Received event + */ + virtual void raise_event(const Event& event); + + /* + * @brief Subscribe the observer to event + * + * @param event_id The event ID to subscribe for + * @param hmi_correlation_id The event HMI correlation ID + * @param observer The observer to subscribe for event + */ + virtual void add_observer(const Event::EventID& event_id, + int32_t hmi_correlation_id, + EventObserver* const observer); + + /* + * @brief Unsubscribes the observer from specific event + * + * @param event_id The event ID to unsubscribe from + * @param observer The observer to be unsubscribed + */ + virtual void remove_observer(const Event::EventID& event_id, + EventObserver* const observer); + + /* + * @brief Unsubscribes the observer from all events + * + * @param observer The observer to be unsubscribed + */ + virtual void remove_observer(EventObserver* const observer); + + /* + * @brief Destructor + */ + virtual ~EventDispatcherImpl(); + + private: + + /* + * @brief Default constructor + */ + EventDispatcherImpl(); + + /* + * @brief removes observer + * when occurs unsubscribe from event + * @param observer to be removed + */ + void remove_observer_from_vector(EventObserver* const observer); + + DISALLOW_COPY_AND_ASSIGN(EventDispatcherImpl); + + FRIEND_BASE_SINGLETON_CLASS(EventDispatcherImpl); + + // Data types section + typedef std::vector<EventObserver*> ObserverVector; + typedef std::map<int32_t, ObserverVector> ObserversMap; + typedef std::map<Event::EventID, ObserversMap> EventObserverMap; + + // Members section + sync_primitives::Lock state_lock_; + sync_primitives::Lock observer_lock_; + EventObserverMap observers_event_; + ObserverVector observers_; + +}; + +} // namespace event_engine +} // namespace application_manager + +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_DISPATCHER_IMPL_H_ diff --git a/src/components/application_manager/include/application_manager/event_engine/event_observer.h b/src/components/application_manager/include/application_manager/event_engine/event_observer.h index 8631203290..04e73e3d86 100644 --- a/src/components/application_manager/include/application_manager/event_engine/event_observer.h +++ b/src/components/application_manager/include/application_manager/event_engine/event_observer.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2016, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -35,7 +35,7 @@ #include <string> #include "application_manager/event_engine/event.h" -#include "application_manager/event_engine/event_dispatcher.h" +#include "application_manager/event_engine/event_dispatcher_impl.h" namespace application_manager { namespace event_engine { @@ -44,8 +44,6 @@ class EventObserver { public: - friend class EventDispatcher; - // Typedef for possible Observer ID's from mobile_apis functionID enum typedef unsigned long ObserverID; @@ -110,7 +108,7 @@ const EventObserver::ObserverID& EventObserver::id() const { return id_; } -} -} +} // namespace event_engine +} // namespace application_manager #endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_EVENT_OBSERVER_H_ diff --git a/src/components/application_manager/src/event_engine/event.cc b/src/components/application_manager/src/event_engine/event.cc index 561e8a841f..874716cc9c 100644 --- a/src/components/application_manager/src/event_engine/event.cc +++ b/src/components/application_manager/src/event_engine/event.cc @@ -31,7 +31,7 @@ */ #include "application_manager/event_engine/event.h" -#include "application_manager/event_engine/event_dispatcher.h" +#include "application_manager/event_engine/event_dispatcher_impl.h" namespace application_manager { namespace event_engine { @@ -45,12 +45,12 @@ Event::~Event() { } void Event::raise() { - EventDispatcher::instance()->raise_event(*this); + EventDispatcherImpl::instance()->raise_event(*this); } void Event::set_smart_object(const smart_objects::SmartObject& so) { response_so_ = so; } -} -} +} // namespace event_engine +} // namespace application_manager diff --git a/src/components/application_manager/src/event_engine/event_dispatcher.cc b/src/components/application_manager/src/event_engine/event_dispatcher.cc deleted file mode 100644 index bac94431f0..0000000000 --- a/src/components/application_manager/src/event_engine/event_dispatcher.cc +++ /dev/null @@ -1,138 +0,0 @@ -/* - Copyright (c) 2013, Ford Motor Company - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following - disclaimer in the documentation and/or other materials provided with the - distribution. - - Neither the name of the Ford Motor Company nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - */ - -#include "interfaces/HMI_API.h" -#include "application_manager/event_engine/event_observer.h" -#include "application_manager/event_engine/event_dispatcher.h" - -namespace application_manager { -namespace event_engine { -using namespace sync_primitives; - -EventDispatcher::EventDispatcher() - : observer_list_lock_(true), - observers_() { -} - -EventDispatcher::~EventDispatcher() { -} - -void EventDispatcher::raise_event(const Event& event) { - { - AutoLock auto_lock(state_lock_); - // check if event is notification - if (hmi_apis::messageType::notification == event.smart_object_type()) { - const uint32_t notification_correlation_id = 0; - observers_list_ = observers_[event.id()][notification_correlation_id]; - } - - if (hmi_apis::messageType::response == event.smart_object_type() - || hmi_apis::messageType::error_response == event.smart_object_type()) { - observers_list_ = observers_[event.id()][event.smart_object_correlation_id()]; - } - } - - // Call observers - EventObserver* temp; - while (observers_list_.size() > 0) { - observer_list_lock_.Acquire(); - if (!observers_list_.empty()) { - temp = observers_list_.front(); - observers_list_.pop_front(); - temp->on_event(event); - } - observer_list_lock_.Release(); - } -} - -void EventDispatcher::add_observer(const Event::EventID& event_id, - int32_t hmi_correlation_id, - EventObserver* const observer) { - AutoLock auto_lock(state_lock_); - observers_[event_id][hmi_correlation_id].push_back(observer); -} - -void EventDispatcher::remove_observer(const Event::EventID& event_id, - EventObserver* const observer) { - remove_observer_from_list(observer); - AutoLock auto_lock(state_lock_); - ObserversMap::iterator it = observers_[event_id].begin(); - for (; observers_[event_id].end() != it; ++it) { - - //ObserverList iterator - ObserverList::iterator observer_it = it->second.begin(); - while (it->second.end() != observer_it) { - if (observer->id() == (*observer_it)->id()) { - observer_it = it->second.erase(observer_it); - } else { - ++observer_it; - } - } - } -} - -void EventDispatcher::remove_observer(EventObserver* const observer) { - remove_observer_from_list(observer); - AutoLock auto_lock(state_lock_); - EventObserverMap::iterator event_map = observers_.begin(); - for (; observers_.end() != event_map; ++event_map) { - ObserversMap::iterator it = event_map->second.begin(); - for (; event_map->second.end() != it; ++it) { - - //ObserverList iterator - ObserverList::iterator observer_it = it->second.begin(); - while (it->second.end() != observer_it) { - if (observer->id() == (*observer_it)->id()) { - observer_it = it->second.erase(observer_it); - } else { - ++observer_it; - } - } - } - } -} - -void EventDispatcher::remove_observer_from_list(EventObserver* const observer) { - AutoLock auto_lock(observer_list_lock_); - if (!observers_list_.empty()) { - ObserverList::iterator it_begin = observers_list_.begin(); - for(; it_begin != observers_list_.end(); ++it_begin) { - if ((*it_begin)->id() == observer->id()) { - it_begin = observers_list_.erase(it_begin); - } - } - } -} - -} // namespace event_engine - -}// namespace application_manager 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 new file mode 100644 index 0000000000..cb7b822246 --- /dev/null +++ b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc @@ -0,0 +1,126 @@ +/* + Copyright (c) 2016, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "application_manager/event_engine/event_dispatcher_impl.h" +#include "interfaces/HMI_API.h" +#include "application_manager/event_engine/event_observer.h" +#include <algorithm> + +namespace application_manager { +namespace event_engine { +using namespace sync_primitives; + +EventDispatcherImpl::EventDispatcherImpl() + : state_lock_(false), observer_lock_(true), observers_event_() {} + +EventDispatcherImpl::~EventDispatcherImpl() {} + +void EventDispatcherImpl::raise_event(const Event& event) { + { + AutoLock auto_lock(state_lock_); + // check if event is notification + if (hmi_apis::messageType::notification == event.smart_object_type()) { + const uint32_t notification_correlation_id = 0; + observers_ = observers_event_[event.id()][notification_correlation_id]; + } + + if (hmi_apis::messageType::response == event.smart_object_type() || + hmi_apis::messageType::error_response == event.smart_object_type()) { + observers_ = + observers_event_[event.id()][event.smart_object_correlation_id()]; + } + } + + // Call observers + EventObserver* temp; + while (!observers_.empty()) { + AutoLock auto_lock(observer_lock_); + temp = *observers_.begin(); + observers_.erase(observers_.begin()); + temp->on_event(event); + } +} + +void EventDispatcherImpl::add_observer(const Event::EventID& event_id, + int32_t hmi_correlation_id, + EventObserver* const observer) { + AutoLock auto_lock(state_lock_); + observers_event_[event_id][hmi_correlation_id].push_back(observer); +} + +struct IdCheckFunctor { + IdCheckFunctor(const unsigned long id) : target_id(id) {} + + bool operator()(const EventObserver* obs) const { + return (obs->id() == target_id); + } + + private: + const unsigned long target_id; +}; + +void EventDispatcherImpl::remove_observer(const Event::EventID& event_id, + EventObserver* const observer) { + remove_observer_from_vector(observer); + AutoLock auto_lock(state_lock_); + ObserversMap::iterator it = observers_event_[event_id].begin(); + + for (; 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_observer(EventObserver* const observer) { + remove_observer_from_vector(observer); + EventObserverMap::iterator event_map = observers_event_.begin(); + + for (; observers_event_.end() != event_map; ++event_map) { + remove_observer(event_map->first, observer); + } +} + +void EventDispatcherImpl::remove_observer_from_vector( + EventObserver* const observer) { + AutoLock auto_lock(observer_lock_); + + observers_.erase( + std::remove_if(observers_.begin(), observers_.end(), + IdCheckFunctor(observer->id())), + observers_.end()); +} + +} // namespace event_engine +} // namespace application_manager diff --git a/src/components/application_manager/src/event_engine/event_observer.cc b/src/components/application_manager/src/event_engine/event_observer.cc index c6d81529f9..bb29eea3b2 100644 --- a/src/components/application_manager/src/event_engine/event_observer.cc +++ b/src/components/application_manager/src/event_engine/event_observer.cc @@ -1,5 +1,5 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2016, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -30,8 +30,8 @@ POSSIBILITY OF SUCH DAMAGE. */ -#include "application_manager/event_engine/event.h" #include "application_manager/event_engine/event_observer.h" +#include "application_manager/event_engine/event.h" namespace application_manager { namespace event_engine { @@ -48,16 +48,16 @@ EventObserver::~EventObserver() { void EventObserver::subscribe_on_event(const Event::EventID& event_id, int32_t hmi_correlation_id) { - EventDispatcher::instance()->add_observer(event_id, hmi_correlation_id, this); + EventDispatcherImpl::instance()->add_observer(event_id, hmi_correlation_id, this); } void EventObserver::unsubscribe_from_event(const Event::EventID& event_id) { - EventDispatcher::instance()->remove_observer(event_id, this); + EventDispatcherImpl::instance()->remove_observer(event_id, this); } void EventObserver::unsubscribe_from_all_events() { - EventDispatcher::instance()->remove_observer(this); + EventDispatcherImpl::instance()->remove_observer(this); } -} -} +} // namespace event_engine +} // namespace application_manager diff --git a/src/components/application_manager/test/mock/include/application_manager/event_engine/event_dispatcher_impl.h b/src/components/application_manager/test/mock/include/application_manager/event_engine/event_dispatcher_impl.h new file mode 120000 index 0000000000..1e76796cfe --- /dev/null +++ b/src/components/application_manager/test/mock/include/application_manager/event_engine/event_dispatcher_impl.h @@ -0,0 +1 @@ +../../../../../include/application_manager/event_engine/event_dispatcher_impl.h
\ No newline at end of file |