diff options
Diffstat (limited to 'src/components/application_manager/src/application_impl.cc')
-rw-r--r-- | src/components/application_manager/src/application_impl.cc | 137 |
1 files changed, 85 insertions, 52 deletions
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index ac21219d7d..717fbeba1b 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2018, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -72,7 +72,7 @@ mobile_apis::FileType::eType StringToFileType(const char* str) { return mobile_apis::FileType::BINARY; } } -} +} // namespace CREATE_LOGGERPTR_GLOBAL(logger_, "ApplicationManager") @@ -105,6 +105,7 @@ ApplicationImpl::ApplicationImpl( , active_message_(NULL) , is_media_(false) , is_navi_(false) + , is_remote_control_supported_(false) , mobile_projection_enabled_(false) , video_streaming_approved_(false) , audio_streaming_approved_(false) @@ -123,11 +124,14 @@ ApplicationImpl::ApplicationImpl( , list_files_in_none_count_(0) , mac_address_(mac_address) , device_id_(device_id) + , secondary_device_id_(0) , usage_report_(mobile_app_id, statistics_manager) + , help_prompt_manager_impl_(*this, application_manager) , protocol_version_( protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_3) , is_voice_communication_application_(false) , is_resuming_(false) + , deferred_resumption_hmi_level_(mobile_api::HMILevel::eType::INVALID_ENUM) , is_hash_changed_during_suspend_(false) , video_stream_retry_number_(0) , audio_stream_retry_number_(0) @@ -139,6 +143,8 @@ ApplicationImpl::ApplicationImpl( "AudioStreamSuspend", new ::timer::TimerTaskImpl<ApplicationImpl>( this, &ApplicationImpl::OnAudioStreamSuspend)) + , vi_lock_ptr_(std::make_shared<sync_primitives::Lock>()) + , button_lock_ptr_(std::make_shared<sync_primitives::Lock>()) , application_manager_(application_manager) { cmd_number_to_time_limits_[mobile_apis::FunctionID::ReadDIDID] = { date_time::DateTime::getCurrentTime(), 0}; @@ -168,7 +174,6 @@ ApplicationImpl::~ApplicationImpl() { } subscribed_buttons_.clear(); - subscribed_vehicle_info_.clear(); if (is_perform_interaction_active()) { set_perform_interaction_active(0); set_perform_interaction_mode(-1); @@ -220,6 +225,14 @@ void ApplicationImpl::set_is_navi(bool allow) { is_navi_ = allow; } +bool ApplicationImpl::is_remote_control_supported() const { + return is_remote_control_supported_; +} + +void ApplicationImpl::set_remote_control_supported(const bool allow) { + is_remote_control_supported_ = allow; +} + bool ApplicationImpl::is_voice_communication_supported() const { return is_voice_communication_application_; } @@ -230,7 +243,26 @@ void ApplicationImpl::set_voice_communication_supported( } bool ApplicationImpl::IsAudioApplication() const { - return is_media_ || is_voice_communication_application_ || is_navi_; + const bool is_audio_app = + is_media_application() || is_voice_communication_supported() || is_navi(); + LOG4CXX_DEBUG(logger_, + std::boolalpha << "is audio app --> ((is_media_app: " + << is_media_application() << ")" + << " || (is_voice_communication_app: " + << is_voice_communication_supported() << ")" + << " || (is_navi: " << is_navi() << ")) --> " + << is_audio_app); + return is_audio_app; +} + +bool ApplicationImpl::IsVideoApplication() const { + const bool is_video_app = is_navi() || mobile_projection_enabled(); + LOG4CXX_DEBUG(logger_, + std::boolalpha + << "is video app --> ((is_navi: " << is_navi() << ")" + << " || (mobile_projection: " << mobile_projection_enabled() + << ")) --> " << is_video_app); + return is_video_app; } void ApplicationImpl::SetRegularState(HmiStatePtr state) { @@ -360,6 +392,10 @@ connection_handler::DeviceHandle ApplicationImpl::device() const { return device_id_; } +connection_handler::DeviceHandle ApplicationImpl::secondary_device() const { + return secondary_device_id_; +} + const std::string& ApplicationImpl::mac_address() const { return mac_address_; } @@ -473,6 +509,9 @@ void ApplicationImpl::StopStreamingForce( using namespace protocol_handler; LOG4CXX_AUTO_TRACE(logger_); + // see the comment in StopStreaming() + sync_primitives::AutoLock lock(streaming_stop_lock_); + SuspendStreaming(service_type); if (service_type == ServiceType::kMobileNav) { @@ -487,6 +526,12 @@ void ApplicationImpl::StopStreaming( using namespace protocol_handler; LOG4CXX_AUTO_TRACE(logger_); + // since WakeUpStreaming() is called from another thread, it is possible that + // the stream will be restarted after we call SuspendStreaming() and before + // we call StopXxxStreaming(). To avoid such timing issue, make sure that + // we run SuspendStreaming() and StopXxxStreaming() atomically. + sync_primitives::AutoLock lock(streaming_stop_lock_); + SuspendStreaming(service_type); if (service_type == ServiceType::kMobileNav && video_streaming_approved()) { @@ -537,6 +582,10 @@ void ApplicationImpl::WakeUpStreaming( using namespace protocol_handler; LOG4CXX_AUTO_TRACE(logger_); + // See the comment in StopStreaming(). Also, please make sure that we acquire + // streaming_stop_lock_ then xxx_streaming_suspended_lock_ in this order! + sync_primitives::AutoLock lock(streaming_stop_lock_); + if (ServiceType::kMobileNav == service_type) { sync_primitives::AutoLock lock(video_streaming_suspended_lock_); if (video_streaming_suspended_) { @@ -620,6 +669,11 @@ void ApplicationImpl::set_device(connection_handler::DeviceHandle device) { device_id_ = device; } +void ApplicationImpl::set_secondary_device( + connection_handler::DeviceHandle secondary_device) { + secondary_device_id_ = secondary_device; +} + uint32_t ApplicationImpl::get_grammar_id() const { return grammar_id_; } @@ -665,6 +719,16 @@ bool ApplicationImpl::is_resuming() const { return is_resuming_; } +void ApplicationImpl::set_deferred_resumption_hmi_level( + mobile_api::HMILevel::eType level) { + deferred_resumption_hmi_level_ = level; +} + +mobile_api::HMILevel::eType ApplicationImpl::deferred_resumption_hmi_level() + const { + return deferred_resumption_hmi_level_; +} + bool ApplicationImpl::AddFile(const AppFile& file) { if (app_files_.count(file.file_name) == 0) { LOG4CXX_INFO(logger_, @@ -712,13 +776,13 @@ const AppFile* ApplicationImpl::GetFile(const std::string& file_name) { bool ApplicationImpl::SubscribeToButton( mobile_apis::ButtonName::eType btn_name) { - sync_primitives::AutoLock lock(button_lock_); + sync_primitives::AutoLock lock(button_lock_ptr_); return subscribed_buttons_.insert(btn_name).second; } bool ApplicationImpl::IsSubscribedToButton( mobile_apis::ButtonName::eType btn_name) { - sync_primitives::AutoLock lock(button_lock_); + sync_primitives::AutoLock lock(button_lock_ptr_); std::set<mobile_apis::ButtonName::eType>::iterator it = subscribed_buttons_.find(btn_name); return (subscribed_buttons_.end() != it); @@ -726,35 +790,18 @@ bool ApplicationImpl::IsSubscribedToButton( bool ApplicationImpl::UnsubscribeFromButton( mobile_apis::ButtonName::eType btn_name) { - sync_primitives::AutoLock lock(button_lock_); + sync_primitives::AutoLock lock(button_lock_ptr_); return subscribed_buttons_.erase(btn_name); } -bool ApplicationImpl::SubscribeToIVI(uint32_t vehicle_info_type) { - sync_primitives::AutoLock lock(vi_lock_); - return subscribed_vehicle_info_ - .insert( - static_cast<mobile_apis::VehicleDataType::eType>(vehicle_info_type)) - .second; -} - -bool ApplicationImpl::IsSubscribedToIVI(uint32_t vehicle_info_type) const { - sync_primitives::AutoLock lock(vi_lock_); - VehicleInfoSubscriptions::const_iterator it = subscribed_vehicle_info_.find( - static_cast<mobile_apis::VehicleDataType::eType>(vehicle_info_type)); - return (subscribed_vehicle_info_.end() != it); -} - -bool ApplicationImpl::UnsubscribeFromIVI(uint32_t vehicle_info_type) { - sync_primitives::AutoLock lock(vi_lock_); - return subscribed_vehicle_info_.erase( - static_cast<mobile_apis::VehicleDataType::eType>(vehicle_info_type)); -} - UsageStatistics& ApplicationImpl::usage_report() { return usage_report_; } +HelpPromptManager& ApplicationImpl::help_prompt_manager() { + return help_prompt_manager_impl_; +} + bool ApplicationImpl::AreCommandLimitsExceeded( mobile_apis::FunctionID::eType cmd_id, TLimitSource source) { TimevalStruct current = date_time::DateTime::getCurrentTime(); @@ -857,12 +904,8 @@ bool ApplicationImpl::AreCommandLimitsExceeded( } DataAccessor<ButtonSubscriptions> ApplicationImpl::SubscribedButtons() const { - return DataAccessor<ButtonSubscriptions>(subscribed_buttons_, button_lock_); -} - -DataAccessor<VehicleInfoSubscriptions> ApplicationImpl::SubscribedIVI() const { - return DataAccessor<VehicleInfoSubscriptions>(subscribed_vehicle_info_, - vi_lock_); + return DataAccessor<ButtonSubscriptions>(subscribed_buttons_, + button_lock_ptr_); } const std::string& ApplicationImpl::curHash() const { @@ -1040,8 +1083,6 @@ void ApplicationImpl::UnsubscribeFromSoftButtons(int32_t cmd_id) { } } -#ifdef SDL_REMOTE_CONTROL - void ApplicationImpl::set_system_context( const mobile_api::SystemContext::eType& system_context) { const HmiStatePtr hmi_state = CurrentHmiState(); @@ -1077,10 +1118,6 @@ void ApplicationImpl::set_hmi_level( usage_report_.RecordHmiStateChanged(new_hmi_level); } -const VehicleInfoSubscriptions& ApplicationImpl::SubscribesIVI() const { - return subscribed_vehicle_info_; -} - AppExtensionPtr ApplicationImpl::QueryInterface(AppExtensionUID uid) { std::list<AppExtensionPtr>::const_iterator it = extensions_.begin(); for (; it != extensions_.end(); ++it) { @@ -1101,21 +1138,17 @@ bool ApplicationImpl::AddExtension(AppExtensionPtr extension) { } bool ApplicationImpl::RemoveExtension(AppExtensionUID uid) { - for (std::list<AppExtensionPtr>::iterator it = extensions_.begin(); - extensions_.end() != it; - ++it) { - if ((*it)->uid() == uid) { - extensions_.erase(it); - return true; - } - } - return false; + auto it = std::find_if( + extensions_.begin(), + extensions_.end(), + [uid](AppExtensionPtr extension) { return extension->uid() == uid; }); + + return it != extensions_.end(); } -void ApplicationImpl::RemoveExtensions() { - application_manager_.GetPluginManager().RemoveAppExtension(app_id_); +const std::list<AppExtensionPtr>& ApplicationImpl::Extensions() const { + return extensions_; } -#endif // SDL_REMOTE_CONTROL void ApplicationImpl::PushMobileMessage( smart_objects::SmartObjectSPtr mobile_message) { |