diff options
author | JackLivio <jack@livio.io> | 2020-11-05 11:59:29 -0500 |
---|---|---|
committer | JackLivio <jack@livio.io> | 2020-11-05 11:59:29 -0500 |
commit | 7af66962b29992166de8b2162a82db6aa3ebce80 (patch) | |
tree | 2a939d5f8f58a4ec7928c9314a16c9ddce5e74ca | |
parent | 9f61819139ad4944b73257893936d1328eed15b0 (diff) | |
parent | f270af493ab11d2491da67390f1614ba4e24ea4e (diff) | |
download | sdl_core-7af66962b29992166de8b2162a82db6aa3ebce80.tar.gz |
Merge remote-tracking branch 'origin/master' into develop
225 files changed, 3302 insertions, 3896 deletions
@@ -13,7 +13,7 @@ SmartDeviceLink (SDL) is a standard set of protocols and messages that connect a ## SDL Core -The Core component of SDL runs on a vehicle's computing system (head unit). Core’s primary responsibility is to route messages between connected smartphone applications and the vehicle HMI. It can connect a smartphone to a vehicle's head unit via a variety of transport protocols such as Bluetooth, USB, Android AOA, and TCP. Once a connection is established, Core discovers compatible applications and displays them to the driver for interaction via voice or display. The Core component is configured to follow a set of policies defined in its local policy database and updated by a [policy server](https://www.github.com/smartdevicelink/sdl_server). The messaging between a connected application and SDL Core is defined by the [Mobile API](https://github.com/smartdevicelink/sdl_core/blob/master/src/components/interfaces/MOBILE_API.xml) and the messaging between SDL Core and the vehicle is defined by the [HMI API](https://github.com/smartdevicelink/sdl_core/blob/master/src/components/interfaces/HMI_API.xml). +The Core component of SDL runs on a vehicle's computing system (head unit). Core’s primary responsibility is to route messages between connected smartphone applications and the vehicle HMI. It can connect a smartphone to a vehicle's head unit via a variety of transport protocols such as Bluetooth, USB, Android AOA, and TCP. Once a connection is established, Core discovers compatible applications and displays them to the driver for interaction via voice or display. The Core component is configured to follow a set of policies defined in its local policy database and updated by a [policy server](https://www.github.com/smartdevicelink/sdl_server). The messaging between a connected application and SDL Core is defined by the [Mobile API](https://github.com/smartdevicelink/rpc_spec/blob/master/MOBILE_API.xml) and the messaging between SDL Core and the vehicle is defined by the [HMI API](https://github.com/smartdevicelink/sdl_core/blob/master/src/components/interfaces/HMI_API.xml). Pull Requests Welcome! diff --git a/cppcheck.xml b/cppcheck.xml new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/cppcheck.xml diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json index 99a2e4c0cc..1e1c5aea79 100755 --- a/src/appMain/hmi_capabilities.json +++ b/src/appMain/hmi_capabilities.json @@ -287,12 +287,12 @@ }, "audioPassThruCapabilities": [{ "samplingRate": "44KHZ", - "bitsPerSample": "RATE_8_BIT", + "bitsPerSample": "8_BIT", "audioType": "PCM" }], "pcmStreamCapabilities": { "samplingRate": "16KHZ", - "bitsPerSample": "RATE_16_BIT", + "bitsPerSample": "16_BIT", "audioType": "PCM" }, "hmiZoneCapabilities": "FRONT", diff --git a/src/appMain/sdl_preloaded_pt.json b/src/appMain/sdl_preloaded_pt.json index 9f1b0490f3..eff433fd1e 100644 --- a/src/appMain/sdl_preloaded_pt.json +++ b/src/appMain/sdl_preloaded_pt.json @@ -1675,6 +1675,17 @@ ] } } + }, + "DialNumber": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } } }, "consumer_friendly_messages": { @@ -4080,7 +4091,7 @@ "key": "OEM_REF_WND_LOC_LVL", "type": "Integer", "mandatory": false, - "defvalue" : 0, + "defvalue" : "0", "minvalue": -1, "maxvalue": 100 }, @@ -4089,7 +4100,7 @@ "key": "OEM_REF_WND_LOC_COLSPN", "type": "Integer", "mandatory": false, - "defvalue" : 1, + "defvalue" : "1", "minvalue": 1, "maxvalue": 100 }, @@ -4098,7 +4109,7 @@ "key": "OEM_REF_WND_LOC_ROWSPN", "type": "Integer", "mandatory": false, - "defvalue" : 1, + "defvalue" : "1", "minvalue": 1, "maxvalue": 100 }, @@ -4107,7 +4118,7 @@ "key": "OEM_REF_WND_LOC_LVLSPN", "type": "Integer", "mandatory": false, - "defvalue" : 1, + "defvalue" : "1", "minvalue": 1, "maxvalue": 100 } diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini index bd23e5b90c..0b27e6263a 100644 --- a/src/appMain/smartDeviceLink.ini +++ b/src/appMain/smartDeviceLink.ini @@ -316,7 +316,8 @@ OpenAttemptTimeoutMsResumptionDB = 500 ; Social, BackgroundProcess, Testing, System, Projection, RemoteControl, ; EmptyApp ; Possible transport types: TCP_WIFI, IAP_CARPLAY, IAP_USB_HOST_MODE, IAP_USB_DEVICE_MODE, -; IAP_USB, AOA_USB, IAP_BLUETOOTH, SPP_BLUETOOTH +; IAP_USB, AOA_USB, IAP_BLUETOOTH, SPP_BLUETOOTH, WEBSOCKET, +; WEBENGINE ; ; The default behavior is to always enable resumption. If an AppHMIType is not listed in this ; section, resumption is enabled for an app with the AppHMIType. diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h index 59c9d35320..c08bb37082 100644 --- a/src/components/application_manager/include/application_manager/application.h +++ b/src/components/application_manager/include/application_manager/application.h @@ -520,6 +520,10 @@ class DynamicApplicationData { class Application : public virtual InitialApplicationData, public virtual DynamicApplicationData { public: + /** + * @brief The StreamingState enum defines current streaming state + */ + enum class StreamingState { kStopped, kStarted, kSuspended }; enum ApplicationRegisterState { kRegistered = 0, kWaitingForRegistration }; Application() : is_greyed_out_(false) {} @@ -660,10 +664,8 @@ class Application : public virtual InitialApplicationData, /** * @brief Wakes up streaming process for application * @param service_type Type of streaming service - * @param timer_len The amount of time in ms the timer will wait */ - virtual void WakeUpStreaming(protocol_handler::ServiceType service_type, - uint32_t timer_len = 0) = 0; + virtual void WakeUpStreaming(protocol_handler::ServiceType service_type) = 0; virtual bool is_voice_communication_supported() const = 0; virtual void set_voice_communication_supported( diff --git a/src/components/application_manager/include/application_manager/application_impl.h b/src/components/application_manager/include/application_manager/application_impl.h index 6c1a897054..88668a2505 100644 --- a/src/components/application_manager/include/application_manager/application_impl.h +++ b/src/components/application_manager/include/application_manager/application_impl.h @@ -142,8 +142,7 @@ class ApplicationImpl : public virtual Application, void StopStreamingForce(protocol_handler::ServiceType service_type); void StopStreaming(protocol_handler::ServiceType service_type); void SuspendStreaming(protocol_handler::ServiceType service_type); - void WakeUpStreaming(protocol_handler::ServiceType service_type, - uint32_t timer_len = 0); + void WakeUpStreaming(protocol_handler::ServiceType service_type); virtual bool is_voice_communication_supported() const; virtual void set_voice_communication_supported(bool option); diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h index 4ec26b014e..bda1e5f49e 100644 --- a/src/components/application_manager/include/application_manager/application_manager_impl.h +++ b/src/components/application_manager/include/application_manager/application_manager_impl.h @@ -35,6 +35,7 @@ #include <stdint.h> #include <algorithm> +#include <atomic> #include <deque> #include <map> #include <memory> @@ -369,6 +370,9 @@ class ApplicationManagerImpl ApplicationSharedPtr RegisterApplication( const std::shared_ptr<smart_objects::SmartObject>& request_for_registration) OVERRIDE; + + void FinalizeAppRegistration(ApplicationSharedPtr application, + const uint32_t connection_key) OVERRIDE; /* * @brief Closes application by id * @@ -411,6 +415,7 @@ class ApplicationManagerImpl * @brief Closes all registered applications */ void UnregisterAllApplications(); + bool ActivateApplication(ApplicationSharedPtr app) OVERRIDE; /** @@ -866,29 +871,16 @@ class ApplicationManagerImpl void ForbidStreaming(uint32_t app_id, protocol_handler::ServiceType service_type) OVERRIDE; - /** - * @brief Called when application completes streaming configuration - * @param app_id Streaming application id - * @param service_type Streaming service type - * @param result true if configuration is successful, false otherwise - * @param rejected_params list of rejected parameters' name. Valid - * only when result is false. - */ - void OnStreamingConfigured( - uint32_t app_id, - protocol_handler::ServiceType service_type, - bool result, - std::vector<std::string>& rejected_params) OVERRIDE; + void OnStreamingConfigurationSuccessful( + uint32_t app_id, protocol_handler::ServiceType service_type) OVERRIDE; + + void OnStreamingConfigurationFailed(uint32_t app_id, + std::vector<std::string>& rejected_params, + const std::string& reason) OVERRIDE; - /** - * @brief Callback calls when application starts/stops data streaming - * @param app_id Streaming application id - * @param service_type Streaming service type - * @param state Shows if streaming started or stopped - */ void OnAppStreaming(uint32_t app_id, protocol_handler::ServiceType service_type, - bool state) OVERRIDE; + const Application::StreamingState new_state) OVERRIDE; mobile_api::HMILevel::eType GetDefaultHmiLevel( ApplicationConstSharedPtr application) const; @@ -1229,21 +1221,6 @@ class ApplicationManagerImpl smart_objects::SmartObject& vrSynonym); /** - * @brief Method transforms string to AppHMIType - * @param str contains string AppHMIType - * @return enum AppHMIType - */ - mobile_apis::AppHMIType::eType StringToAppHMIType(std::string str); - - /** - * @brief Returns a string representation of AppHMIType - * @param type an enum value of AppHMIType - * @return string representation of the enum value - */ - const std::string AppHMITypeToString( - mobile_apis::AppHMIType::eType type) const; - - /** * @brief Method compares arrays of app HMI type * @param from_policy contains app HMI type from policy * @param from_application contains app HMI type from application @@ -1260,7 +1237,7 @@ class ApplicationManagerImpl const bool allow_unknown_parameters = false); template <typename ApplicationList> - void PrepareApplicationListSO(ApplicationList app_list, + void PrepareApplicationListSO(ApplicationList& app_list, smart_objects::SmartObject& applications, ApplicationManager& app_mngr) { smart_objects::SmartArray* app_array = applications.asArray(); @@ -1666,7 +1643,6 @@ class ApplicationManagerImpl sync_primitives::Lock close_app_timer_pool_lock_; sync_primitives::Lock end_stream_timer_pool_lock_; - mutable sync_primitives::RecursiveLock stopping_application_mng_lock_; StateControllerImpl state_ctrl_; std::unique_ptr<app_launch::AppLaunchData> app_launch_dto_; std::unique_ptr<app_launch::AppLaunchCtrl> app_launch_ctrl_; @@ -1700,7 +1676,7 @@ class ApplicationManagerImpl std::atomic<bool> registered_during_timer_execution_; - volatile bool is_stopping_; + std::atomic<bool> is_stopping_; std::unique_ptr<CommandHolder> commands_holder_; diff --git a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h index 1e75499a07..0bc98827c8 100644 --- a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h +++ b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h @@ -39,6 +39,7 @@ #include "interfaces/MOBILE_API.h" #include "json/json.h" #include "utils/macro.h" +#include "utils/rwlock.h" namespace application_manager { class ApplicationManager; @@ -485,6 +486,7 @@ class HMICapabilitiesImpl : public HMICapabilities { ApplicationManager& app_mngr_; HMILanguageHandler hmi_language_handler_; + mutable sync_primitives::RWLock hmi_capabilities_lock_; std::set<hmi_apis::FunctionID::eType> requests_required_for_capabilities_; DISALLOW_COPY_AND_ASSIGN(HMICapabilitiesImpl); diff --git a/src/components/application_manager/include/application_manager/message_helper.h b/src/components/application_manager/include/application_manager/message_helper.h index 380b14af1e..7af9bacf27 100644 --- a/src/components/application_manager/include/application_manager/message_helper.h +++ b/src/components/application_manager/include/application_manager/message_helper.h @@ -49,6 +49,7 @@ #include "interfaces/MOBILE_API.h" #include "policy/policy_types.h" #include "protocol_handler/session_observer.h" +#include "smart_objects/enum_schema_item.h" #include "smart_objects/smart_object.h" #include "transport_manager/common.h" #include "utils/macro.h" @@ -103,6 +104,35 @@ struct ResetGlobalPropertiesResult { typedef std::map<std::string, mobile_apis::VehicleDataType::eType> VehicleData; /** + * @brief Converts stringified value to enum value + * @param str stringified value + * @return Enum value if succedeed, otherwise - + * INVALID_ENUM + */ +template <typename T> +T StringToEnum(const std::string& str) { + using namespace ns_smart_device_link::ns_smart_objects; + T enum_value; + EnumConversionHelper<T>::StringToEnum(str, &enum_value); + return enum_value; +} + +/** + * @brief Converts enum value to string + * @param enum_value enum value + * @return stringified value for enum if succedeed, otherwise - empty string + */ +template <typename T> +std::string EnumToString(T enum_value) { + using namespace ns_smart_device_link::ns_smart_objects; + const char* str = 0; + if (EnumConversionHelper<T>::EnumToCString(enum_value, &str)) { + return str; + } + return std::string(); +} + +/** * @brief MessageHelper class **/ class MessageHelper { @@ -184,42 +214,9 @@ class MessageHelper { */ static const VehicleData& vehicle_data(); - /** - * @brief Converts HMI Result enum value to string - * @param hmi_result HMI Result enum value - * @return stringified value for enum if succedeed, otherwise - empty string - */ - static std::string HMIResultToString( - hmi_apis::Common_Result::eType hmi_result); - - /** - * @brief Converts string to HMI Result enum value - * @param hmi_result stringified value - * @return HMI Result enum value if succedeed, otherwise - INVALID_ENUM - * value - */ - static hmi_apis::Common_Result::eType HMIResultFromString( - const std::string& hmi_result); - - /** - * @brief Converts mobile Result enum value to string - * @param mobile_result mobile Result enum value - * @return stringified value for enum if succedeed, otherwise - empty string - */ - static std::string MobileResultToString( - mobile_apis::Result::eType mobile_result); - static std::string GetDeviceMacAddressForHandle( const transport_manager::DeviceHandle device_handle, const ApplicationManager& app_mngr); - /** - * @brief Converts string to mobile Result enum value - * @param mobile_result stringified value - * @return mobile Result enum value if succedeed, otherwise - INVALID_ENUM - * value - */ - static mobile_api::Result::eType MobileResultFromString( - const std::string& mobile_result); /** * @brief Converts HMI Result enum value to mobile Result enum value @@ -239,23 +236,6 @@ class MessageHelper { const mobile_api::Result::eType mobile_result); /** - * @brief Convert string to HMI level, if possible - * @param hmi_level Stringified HMI level - * @return Appropriate enum from HMI level, or INVALID_ENUM, if conversiion - * is not possible - */ - static mobile_api::HMILevel::eType StringToHMILevel( - const std::string& hmi_level); - - /** - * @brief Used to obtain string representation of app's - * HMI Level. - * @param hmi_level Desired HMI Level - */ - static std::string StringifiedHMILevel( - const mobile_apis::HMILevel::eType hmi_level); - - /** * @brief Used to obtain function name by its id * @param function_id Function ID */ @@ -888,29 +868,6 @@ class MessageHelper { } static const uint32_t GetPriorityCode(const std::string& priority); - /** - * @brief Convert common language to string representation - * @param language Common language - * @return Common language string representation - */ - static std::string CommonLanguageToString( - hmi_apis::Common_Language::eType language); - - /** - * @brief Converts mobile language to string representation - * @param language Mobile UI language - * @return Mobile language string representation - */ - static std::string MobileLanguageToString( - mobile_apis::Language::eType language); - - /** - * @brief Converts string to mobile language enum value - * @param language language as string - * @return Mobile language enum value - */ - static mobile_apis::Language::eType MobileLanguageFromString( - const std::string& language); /** * @brief Converts mobile language enum to HMI language enum @@ -963,17 +920,6 @@ class MessageHelper { const std::string& icon_path, ApplicationManager& application_manager); - static hmi_apis::Common_Language::eType CommonLanguageFromString( - const std::string& language); - - /** - * @brief CommonLightNameFromString convert string to LightName enum value - * @param lightName string to convert - * @return value LightName enum value - */ - static hmi_apis::Common_LightName::eType CommonLightNameFromString( - const std::string& lightName); - static smart_objects::SmartObjectSPtr GetOnAppInterfaceUnregisteredNotificationToMobile( int32_t connection_key, diff --git a/src/components/application_manager/include/application_manager/policies/policy_handler.h b/src/components/application_manager/include/application_manager/policies/policy_handler.h index 9206b1d155..c123bcc764 100644 --- a/src/components/application_manager/include/application_manager/policies/policy_handler.h +++ b/src/components/application_manager/include/application_manager/policies/policy_handler.h @@ -703,7 +703,7 @@ class PolicyHandler : public PolicyHandlerInterface, #ifdef BUILD_TESTS void SetPolicyManager(std::shared_ptr<PolicyManager> pm) { - policy_manager_ = pm; + ExchangePolicyManager(pm); } #endif // BUILD_TESTS @@ -901,8 +901,28 @@ class PolicyHandler : public PolicyHandlerInterface, */ void GetRegisteredLinks(std::map<std::string, std::string>& out_links) const; + /** + * @brief Load policy manager + * This method is thread safe + * @return Pointer to the policy manager instance or null if not inited + */ + std::shared_ptr<PolicyManager> LoadPolicyManager() const; + + /** + * @brief Exchange a policy manager + * This method is thread safe + * @param policy_manager - new policy manager + */ + void ExchangePolicyManager(std::shared_ptr<PolicyManager> policy_manager); + mutable sync_primitives::RWLock policy_manager_lock_; - std::shared_ptr<PolicyManager> policy_manager_; + + /** + * @brief Policy manager + * @note Use atomic_policy_manager_ only with + * LoadPolicyManager and ExchangePolicyManager methods! + */ + std::shared_ptr<PolicyManager> atomic_policy_manager_; std::shared_ptr<PolicyEventObserver> event_observer_; uint32_t last_activated_app_id_; @@ -918,8 +938,6 @@ class PolicyHandler : public PolicyHandlerInterface, */ DeviceHandles pending_device_handles_; - inline bool CreateManager(); - typedef std::list<PolicyHandlerObserver*> HandlersCollection; HandlersCollection listeners_; mutable sync_primitives::Lock listeners_lock_; diff --git a/src/components/application_manager/include/application_manager/postponed_activation_controller.h b/src/components/application_manager/include/application_manager/postponed_activation_controller.h new file mode 100644 index 0000000000..e096800a25 --- /dev/null +++ b/src/components/application_manager/include/application_manager/postponed_activation_controller.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020, 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_POSTPONED_ACTIVATION_CONTROLLER_H_ +#define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_POSTPONED_ACTIVATION_CONTROLLER_H_ + +#include "application.h" + +namespace application_manager { + +/** + * @brief AppToActivateSet is a map of application ids expected to be + * activated after the registration is completed (default hmi level is assigned) + * and correlation_ids of the SDLActivateApp requests + */ +typedef std::map<uint32_t, uint32_t> AppToActivate; + +class PostponedActivationController { + public: + PostponedActivationController(); + + /** + * @brief AddAppToActivate adds app_id to app_to_activate_ map + * @param app_id id of the app that should be activated + * @param corr_id correlation_id of the SDLActivateApp request + */ + void AddAppToActivate(uint32_t app_id, uint32_t corr_id); + + /** + * @brief GetPendingActivationCorrId gets the pending + * activation correlation id + * @param app_id application id + * @return correlation id of the SDLActivateApp requests + */ + uint32_t GetPendingActivationCorrId(uint32_t app_id) const; + + /** + * @brief RemoveAppToActivate removes app_id from app_to_activate_ map + * @param app_id application id + */ + void RemoveAppToActivate(uint32_t app_id); + + private: + AppToActivate app_to_activate_; + mutable std::shared_ptr<sync_primitives::Lock> activate_app_list_lock_ptr_; +}; +} // namespace application_manager + +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_POSTPONED_ACTIVATION_CONTROLLER_H_ diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h index d945df6154..456eccd29c 100644 --- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h +++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h @@ -84,9 +84,8 @@ class ResumeCtrl { /** * @brief Set application HMI Level and ausio_state as saved * @param application is application witch HMI Level is need to restore - * @return true if success, otherwise return false */ - virtual bool RestoreAppHMIState( + virtual void RestoreAppHMIState( application_manager::ApplicationSharedPtr application) = 0; /** @@ -255,7 +254,7 @@ class ResumeCtrl { * @param application - application to restore hmi level * and audio streaming state */ - virtual bool StartAppHmiStateResumption( + virtual void StartAppHmiStateResumption( application_manager::ApplicationSharedPtr application) = 0; /** diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h index 379b25d8d4..9c529b5f9a 100644 --- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h +++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h @@ -83,9 +83,8 @@ class ResumeCtrlImpl : public ResumeCtrl { /** * @brief Set application HMI Level and ausio_state as saved * @param application is application witch HMI Level is need to restore - * @return true if success, otherwise return false */ - bool RestoreAppHMIState(app_mngr::ApplicationSharedPtr application) OVERRIDE; + void RestoreAppHMIState(app_mngr::ApplicationSharedPtr application) OVERRIDE; /** * @brief Set application HMI Level as stored in policy @@ -234,9 +233,8 @@ class ResumeCtrlImpl : public ResumeCtrl { * @brief Resume HMI Level and audio streaming state if needed * @param application - application to restore hmi level * and audio streaming state - * @return true if success otherwise false */ - bool StartAppHmiStateResumption( + void StartAppHmiStateResumption( app_mngr::ApplicationSharedPtr application) OVERRIDE; /** diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data_processor_impl.h b/src/components/application_manager/include/application_manager/resumption/resumption_data_processor_impl.h index 12d25e2ac5..c2040852ca 100644 --- a/src/components/application_manager/include/application_manager/resumption/resumption_data_processor_impl.h +++ b/src/components/application_manager/include/application_manager/resumption/resumption_data_processor_impl.h @@ -125,14 +125,22 @@ class ResumptionDataProcessorImpl const ResumptionRequest& found_request); /** - * @brief IsResumptionFinished checks whether some responses are still waiting + * @brief EraseProcessedRequest erases processed request from list of pending + * requests * @param app_id ID of application, related to event * @param found_request reference to found request + */ + void EraseProcessedRequest(const uint32_t app_id, + const ResumptionRequest& found_request); + + /** + * @brief IsResumptionFinished checks whether some responses are still + * waiting + * @param app_id ID of application, related to event * @return true, if resumption for this application is finished, or false, if - * some requests aren't processed yet + * some requests aren't processed yet */ - bool IsResumptionFinished(const uint32_t app_id, - const ResumptionRequest& found_request); + bool IsResumptionFinished(const uint32_t app_id) const; /** * @brief IsResumptionSuccessful checks whether overall resumption status @@ -156,12 +164,8 @@ class ResumptionDataProcessorImpl * @brief EraseAppResumptionData erases data, needed for resumption, for * given application * @param app_id ID of application, related to event - * @param function_id Function ID - * @param corr_id Correlation ID */ - void EraseAppResumptionData(const uint32_t app_id, - const hmi_apis::FunctionID::eType function_id, - const int32_t corr_id); + void EraseAppResumptionData(const uint32_t app_id); /** * @brief Processes response message from HMI @@ -174,6 +178,14 @@ class ResumptionDataProcessorImpl const int32_t corr_id); /** + * @brief Checks whether resumption is successful and finalizes resumption + * corresponding to result of this check + * @param callback Function to be called when data resumption will be finished + * @param app_id ID of application, related to event + */ + void FinalizeResumption(const ResumeCtrl::ResumptionCallBack& callback, + const uint32_t app_id); + /** * @brief Revert the data to the state before Resumption * @param shared ptr to application */ @@ -355,34 +367,25 @@ class ResumptionDataProcessorImpl const smart_objects::SmartObject& request, const smart_objects::SmartObject& response) const; - /** - * @brief Determines whether application has saved data, including - * submenus, commands, choice sets, global properties, subscriptions to - * restore. - * @param saved_app smart object containing saved app data - * @return bool value stating whether app has mentioned data to restore - */ - bool HasDataToRestore(const smart_objects::SmartObject& saved_app) const; - app_mngr::ApplicationManager& application_manager_; /** * @brief A map of the IDs and Application Resumption Status for these ID **/ std::map<std::int32_t, ApplicationResumptionStatus> resumption_status_; - sync_primitives::RWLock resumption_status_lock_; + mutable sync_primitives::RWLock resumption_status_lock_; /** * @brief A map of callbacks used when resumption is finished */ std::map<std::int32_t, ResumeCtrl::ResumptionCallBack> register_callbacks_; - sync_primitives::RWLock register_callbacks_lock_; + mutable sync_primitives::RWLock register_callbacks_lock_; /** * @brief A map of sent requests and corresponding app_id */ std::map<ResumptionRequestID, std::uint32_t> request_app_ids_; - sync_primitives::RWLock request_app_ids_lock_; + mutable sync_primitives::RWLock request_app_ids_lock_; }; } // namespace resumption diff --git a/src/components/application_manager/include/application_manager/state_controller_impl.h b/src/components/application_manager/include/application_manager/state_controller_impl.h index 210ddf9720..4dc4c1ad7d 100644 --- a/src/components/application_manager/include/application_manager/state_controller_impl.h +++ b/src/components/application_manager/include/application_manager/state_controller_impl.h @@ -133,6 +133,8 @@ class StateControllerImpl : public event_engine::EventObserver, void DropPostponedWindows(const uint32_t app_id) OVERRIDE; + PostponedActivationController& GetPostponedActivationController() OVERRIDE; + private: int64_t RequestHMIStateChange(ApplicationConstSharedPtr app, hmi_apis::Common_HMILevel::eType level, @@ -434,6 +436,7 @@ class StateControllerImpl : public event_engine::EventObserver, std::unordered_set<uint32_t> apps_with_pending_hmistatus_notification_; mutable sync_primitives::Lock apps_with_pending_hmistatus_notification_lock_; ApplicationManager& app_mngr_; + PostponedActivationController postponed_activation_controller_; }; } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc index fd7b03fabc..e03973614d 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_rpc_plugin.cc @@ -107,14 +107,15 @@ void AppServiceRpcPlugin::DeleteSubscriptions( } // namespace app_service_rpc_plugin -extern "C" __attribute__((visibility("default"))) -application_manager::plugin_manager::RPCPlugin* -Create(logger::Logger* logger_instance) { +using RPCPlugin = application_manager::plugin_manager::RPCPlugin; +// cppcheck-suppress unusedFunction +extern "C" __attribute__((visibility("default"))) RPCPlugin* Create( + logger::Logger* logger_instance) { logger::Logger::instance(logger_instance); return new app_service_rpc_plugin::AppServiceRpcPlugin(); } -extern "C" __attribute__((visibility("default"))) void Delete( - application_manager::plugin_manager::RPCPlugin* data) { +// cppcheck-suppress unusedFunction +extern "C" __attribute__((visibility("default"))) void Delete(RPCPlugin* data) { delete data; } diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_on_remote_control_settings_notification.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_on_remote_control_settings_notification.cc index b7a343a907..217258b086 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_on_remote_control_settings_notification.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_on_remote_control_settings_notification.cc @@ -65,15 +65,6 @@ RCOnRemoteControlSettingsNotification::RCOnRemoteControlSettingsNotification( RCOnRemoteControlSettingsNotification:: ~RCOnRemoteControlSettingsNotification() {} -hmi_apis::Common_RCAccessMode::eType AccessModeFromString( - const std::string& access_mode) { - std::map<std::string, hmi_apis::Common_RCAccessMode::eType>::const_iterator - mode = access_modes.find(access_mode); - return access_modes.end() != mode - ? mode->second - : hmi_apis::Common_RCAccessMode::INVALID_ENUM; -} - std::string AccessModeToString( const hmi_apis::Common_RCAccessMode::eType access_mode) { std::map<std::string, hmi_apis::Common_RCAccessMode::eType>::const_iterator diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc index 2b801f7406..8d3a3d796e 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc @@ -245,7 +245,10 @@ void GetInteriorVehicleDataRequest::on_event( helpers::Compare<mobile_apis::Result::eType, helpers::EQ, helpers::ONE>( result_code, mobile_apis::Result::SUCCESS, - mobile_apis::Result::WARNINGS); + mobile_apis::Result::WARNINGS, + mobile_apis::Result::WRONG_LANGUAGE, + mobile_apis::Result::RETRY, + mobile_apis::Result::SAVED); if (mobile_apis::Result::READ_ONLY == result_code) { result = false; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/release_interior_vehicle_data_module_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/release_interior_vehicle_data_module_request.cc index e7532636b2..47430c2487 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/release_interior_vehicle_data_module_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/release_interior_vehicle_data_module_request.cc @@ -55,9 +55,9 @@ struct ResponseParams { void PrepareResponseResult( ResponseParams& response_params_out, - rc_rpc_plugin::ResourceReleasedState::eType& released_result) { + const rc_rpc_plugin::ResourceReleasedState::eType& released_result) { std::stringstream ss; - auto info_inserter = [&ss, response_params_out](std::string info) { + auto info_inserter = [&ss, response_params_out](const std::string& info) { ss << "Module [" << response_params_out.module_type << ":" << response_params_out.module_id << "] " << info; }; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc index 8dd4eab306..dea660b780 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc @@ -105,8 +105,9 @@ mobile_apis::Result::eType PrepareResultCodeAndInfo( } else { info = "Accessing not supported module data."; } - return result_code; + SDL_LOG_WARN(info); + return result_code; } void SetInteriorVehicleDataRequest::Execute() { diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc index 53222e0d04..12608d64c1 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc @@ -247,8 +247,8 @@ void RCCommandRequest::ProcessAccessResponse( mobile_apis::Result::SUCCESS, mobile_apis::Result::WARNINGS); - bool is_allowed = false; if (result) { + bool is_allowed = false; if (message[app_mngr::strings::msg_params].keyExists( message_params::kAllowed)) { is_allowed = diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/interior_data_manager_impl.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/interior_data_manager_impl.cc index 1db25265e7..c295ad4f11 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/interior_data_manager_impl.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/interior_data_manager_impl.cc @@ -197,9 +197,12 @@ InteriorDataManagerImpl::AppsSubscribedModuleTypes() { auto app_subscriptions = rc_extension->InteriorVehicleDataSubscriptions(); std::vector<std::string> app_module_types; - for (auto& app_subscription : app_subscriptions) { - app_module_types.push_back(app_subscription.first); - } + std::transform(app_subscriptions.begin(), + app_subscriptions.end(), + std::back_inserter(app_module_types), + [](const ModuleUid& app_subscription) { + return app_subscription.first; + }); std::sort(app_module_types.begin(), app_module_types.end()); result[app_ptr] = app_module_types; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_command_factory.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_command_factory.cc index e2b67effee..c1743c8540 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_command_factory.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_command_factory.cc @@ -71,7 +71,7 @@ using rc_rpc_plugin::ResourceAllocationManager; template <typename RCCommandType> class RCCommandCreator : public CommandCreator { public: - RCCommandCreator(const RCCommandParams& params) : params_(params) {} + explicit RCCommandCreator(const RCCommandParams& params) : params_(params) {} private: bool CanBeCreated() const override { @@ -92,7 +92,8 @@ struct RCInvalidCommand {}; template <> class RCCommandCreator<RCInvalidCommand> : public CommandCreator { public: - RCCommandCreator(const RCCommandParams& params) { + // cppcheck-suppress unusedFunction //Used in RCCommandCreatorFactory + explicit RCCommandCreator(const RCCommandParams& params) { UNUSED(params); } @@ -109,7 +110,8 @@ class RCCommandCreator<RCInvalidCommand> : public CommandCreator { }; struct RCCommandCreatorFactory { - RCCommandCreatorFactory(const RCCommandParams& params) : params_(params) {} + explicit RCCommandCreatorFactory(const RCCommandParams& params) + : params_(params) {} template <typename RCCommandType> CommandCreator& GetCreator() { diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc index 61524546a8..b2d1f1513b 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc @@ -111,18 +111,28 @@ rc_rpc_types::ModuleIdConsentVector RCHelpers::FillModuleConsents( std::vector<std::string> RCHelpers::RetrieveModuleIds( const ns_smart_device_link::ns_smart_objects::SmartObject& moduleIds) { std::vector<std::string> module_ids; - for (const auto& module_id : (*moduleIds.asArray())) { - module_ids.push_back(module_id.asString()); - } + + std::transform((*moduleIds.asArray()).begin(), + (*moduleIds.asArray()).end(), + std::back_inserter(module_ids), + [](const smart_objects::SmartObject& module_id) { + return module_id.asString(); + }); + return module_ids; } std::vector<bool> RCHelpers::RetrieveModuleConsents( const ns_smart_device_link::ns_smart_objects::SmartObject& consents) { std::vector<bool> module_consents; - for (const auto& allowed_item : (*consents.asArray())) { - module_consents.push_back(allowed_item.asBool()); - } + + std::transform((*consents.asArray()).begin(), + (*consents.asArray()).end(), + std::back_inserter(module_consents), + [](const smart_objects::SmartObject& allowed_item) { + return allowed_item.asBool(); + }); + return module_consents; } @@ -333,11 +343,14 @@ smart_objects::SmartObject RCHelpers::MergeArray( } auto& data2_array = *data2.asArray(); - for (const auto& data_item : data2_array) { - if (data_item.getType() != smart_objects::SmartType_Map || - !data_item.keyExists(application_manager::strings::id)) { - return data2; - } + + auto compare = [](const smart_objects::SmartObject& data_item) { + return (data_item.getType() != smart_objects::SmartType_Map || + !data_item.keyExists(application_manager::strings::id)); + }; + + if (std::any_of(data2_array.begin(), data2_array.end(), compare)) { + return data2; } smart_objects::SmartObject result = data1; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc index 4345aa044a..87090405e7 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc @@ -212,11 +212,14 @@ RCRPCPlugin::Apps RCRPCPlugin::GetRCApplications( ApplicationSet accessor = app_mngr.applications().GetData(); std::vector<ApplicationSharedPtr> result; - for (const auto& it : accessor) { - if (it->is_remote_control_supported()) { - result.push_back(it); - } - } + + std::copy_if(accessor.begin(), + accessor.end(), + std::back_inserter(result), + [](const ApplicationSharedPtr& app) { + return app->is_remote_control_supported(); + }); + return result; } diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc index 956a53994d..20f9c27912 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc @@ -31,11 +31,17 @@ */ #include "rc_rpc_plugin/commands/mobile/get_interior_vehicle_data_request.h" + +#include "gtest/gtest.h" + +#include <stdint.h> +#include <chrono> +#include <thread> + #include "application_manager/commands/command_request_test.h" #include "application_manager/event_engine/event_dispatcher.h" #include "application_manager/message_helper.h" #include "application_manager/mock_application.h" -#include "gtest/gtest.h" #include "rc_rpc_plugin/mock/mock_interior_data_cache.h" #include "rc_rpc_plugin/mock/mock_interior_data_manager.h" #include "rc_rpc_plugin/mock/mock_rc_capabilities_manager.h" @@ -46,10 +52,6 @@ #include "rc_rpc_plugin/rc_module_constants.h" #include "rc_rpc_plugin/rc_rpc_plugin.h" -#include <stdint.h> -#include <chrono> -#include <thread> - using application_manager::ApplicationSet; using ::application_manager::ApplicationSharedPtr; using ::application_manager::Message; @@ -824,4 +826,61 @@ TEST_F(GetInteriorVehicleDataRequestTest, EXPECT_TRUE(climate_enable_available); } +TEST_F(GetInteriorVehicleDataRequestTest, ProcessingSuccessResultCodes) { + using rc_rpc_plugin::commands::GetInteriorVehicleDataRequest; + namespace hmi_response = application_manager::hmi_response; + namespace strings = application_manager::strings; + + std::set<hmi_apis::Common_Result::eType> success_result_codes{ + hmi_apis::Common_Result::SUCCESS, + hmi_apis::Common_Result::WARNINGS, + hmi_apis::Common_Result::WRONG_LANGUAGE, + hmi_apis::Common_Result::RETRY, + hmi_apis::Common_Result::SAVED}; + + ON_CALL(mock_interior_data_cache_, Contains(_)).WillByDefault(Return(false)); + ON_CALL(mock_interior_data_manager_, CheckRequestsToHMIFrequency(_)) + .WillByDefault(Return(true)); + + MessageSharedPtr hmi_response_message = CreateBasicMessage(); + auto& hmi_response_params = + (*hmi_response_message)[application_manager::strings::msg_params]; + hmi_response_params[strings::connection_key] = kAppId; + auto climate_control_data = + smart_objects::SmartObject(smart_objects::SmartType_Boolean); + climate_control_data = true; + + auto& msg_params = (*hmi_response_message)[strings::msg_params]; + msg_params[message_params::kModuleData][message_params::kClimateControlData] + [message_params::kClimateEnableAvailable] = climate_control_data; + msg_params[message_params::kModuleData][message_params::kModuleId] = + "00bd6d93-e093-4bf0-9784-281febe41bed"; + + MessageSharedPtr mobile_message = CreateBasicMessage(); + auto message_to_mob = CreateBasicMessage(); + + for (const auto& result_code : success_result_codes) { + hmi_response_params[hmi_response::code] = result_code; + + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)) + .WillOnce(DoAll(SaveArg<0>(&message_to_mob), Return(true))); + + auto command = + CreateRCCommand<GetInteriorVehicleDataRequest>(mobile_message); + ASSERT_TRUE(command->Init()); + command->Run(); + + application_manager::event_engine::Event event( + hmi_apis::FunctionID::RC_GetInteriorVehicleData); + event.set_smart_object(*hmi_response_message); + command->on_event(event); + + const bool success = + (*message_to_mob)[strings::msg_params][strings::success].asBool(); + EXPECT_TRUE(success); + } +} + } // namespace rc_rpc_plugin_test diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc index 81e0fa87af..e521d81ef6 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc @@ -167,6 +167,8 @@ TEST_F(ReleaseInteriorVehicleDataModuleRequestTest, ON_CALL(mock_allocation_manager_, ReleaseResource(kModuleType, kModuleID, kAppID)) .WillByDefault(Return(ResourceReleasedState::eType::NOT_ALLOCATED)); + ON_CALL(mock_hmi_capabilities_, rc_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); MessageSharedPtr message_to_mobile = CreateMessage(); @@ -197,7 +199,8 @@ TEST_F(ReleaseInteriorVehicleDataModuleRequestTest, ReleaseResource(kModuleType, kModuleID, kAppID)) .WillByDefault(Return(ResourceReleasedState::eType::IS_ALLOCATED)); MessageSharedPtr message_to_mobile = CreateMessage(); - + ON_CALL(mock_hmi_capabilities_, rc_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); EXPECT_CALL( mock_rpc_service_, ManageMobileCommand( @@ -224,6 +227,8 @@ TEST_F(ReleaseInteriorVehicleDataModuleRequestTest, ON_CALL(mock_allocation_manager_, ReleaseResource(kModuleType, kModuleID, kAppID)) .WillByDefault(Return(ResourceReleasedState::eType::IS_RELEASED)); + ON_CALL(mock_hmi_capabilities_, rc_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); MessageSharedPtr message_to_mobile = CreateMessage(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_audio_start_stream_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_audio_start_stream_request.h index fa9eee485e..ac6f1474e6 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_audio_start_stream_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_audio_start_stream_request.h @@ -77,13 +77,13 @@ class AudioStartStreamRequest : public app_mngr::commands::RequestToHMI, **/ virtual void on_event(const app_mngr::event_engine::Event& event); + private: /** * @brief RetryStartSession resend HMI startSession request if needed. * If limit expired, set audio_stream_retry_number counter to 0 */ void RetryStartSession(); - private: uint32_t retry_number_; DISALLOW_COPY_AND_ASSIGN(AudioStartStreamRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_start_stream_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_start_stream_request.h index afad744eb3..76413cd55d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_start_stream_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_start_stream_request.h @@ -77,13 +77,13 @@ class NaviStartStreamRequest : public app_mngr::commands::RequestToHMI, */ virtual void onTimeOut(); + private: /** * @brief RetryStartSession resend HMI startSession request if needed. * If limit expired, set video_stream_retry_number counter to 0 */ void RetryStartSession(); - private: uint32_t retry_number_; DISALLOW_COPY_AND_ASSIGN(NaviStartStreamRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/waypoints_pending_resumption_handler.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/waypoints_pending_resumption_handler.h index 5dad6d07ac..871359bc9a 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/waypoints_pending_resumption_handler.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/waypoints_pending_resumption_handler.h @@ -58,35 +58,50 @@ class WayPointsPendingResumptionHandler private: /** * @brief RaiseFakeSuccessfulResponse raise event for the subscriber that - * contains emulated successful response from HMI To avoid double subscription - * WayPointsPendingResumptionHandler freezes sending requests to HMI. But - * resumption_data_processor().SubscribeOnResponse() need to be called to - * provide information that some data need to be resumed. So if pending - * request exists, SDL creates preliminary requests to HMI, subscribe the - * subscriber to this request but do not send it to HMI. It freezes this - * requests to precess the one by one when a response to the current request - * will be received When SDL receives a response from HMI it may satisfy some - * frozen requests. If it does SDL will create faked HMI response(based on the - * real one with corr_id replacement) and raise event. So that - * subscriber::on_event will be called with an appropriate response to the - * request that SDL was not sent to HMI. - * @param response message that will be raised with corr_id replacement - * @param corr_id correlation id that will be replaced in response to notify - * the subscriber + * contains emulated successful response from HMI. To avoid double + * subscription WayPointsPendingResumptionHandler freezes sending requests to + * HMI. But resumption_data_processor().SubscribeOnResponse() need to be + * called to provide information that some data need to be resumed. So if + * pending request exists, SDL creates preliminary requests to HMI, subscribe + * the subscriber to this request but do not send it to HMI. It freezes this + * requests to process the one by one when a response to the current request + * will be received. When SDL receives a response from HMI it may satisfy some + * frozen requests. If it does SDL will create fake successful HMI + * response and raise event. So that subscriber::on_event will be called with + * an appropriate response to the request that SDL was not sent to HMI. + * @param corr_id correlation id of next pending request */ - void RaiseFakeSuccessfulResponse(smart_objects::SmartObject response, - const int32_t corr_id); + void RaiseFakeSuccessfulResponse(const int32_t corr_id); smart_objects::SmartObjectSPtr CreateSubscriptionRequest(); - struct ResumptionAwaitingHandling { - const uint32_t app_id; - WayPointsAppExtension& ext; - resumption::ResumptionRequest request_to_send_; + /** + * @brief ProcessNextPendingResumption is responsible for processing of next + * pending request. If any application is already subscribed to waypoints, + * this method ensures that current application will be subscribed to + * waypoints too or send request to HMI otherwise + */ + void ProcessNextPendingResumption(); + + struct PendingRequest { + explicit PendingRequest(const uint32_t app_id, const uint32_t corr_id) + : app_id_(app_id) + , corr_id_(corr_id) + , waiting_for_hmi_response_(false) {} + uint32_t app_id_; + uint32_t corr_id_; + bool waiting_for_hmi_response_; }; - std::vector<ResumptionAwaitingHandling> frozen_resumptions_; - std::map<uint32_t, smart_objects::SmartObject> pending_requests_; - std::queue<uint32_t> app_ids_; + /** + * @brief SendPendingHMIRequest is responsible for creating and sending of + * next pending request to HMI. Also here this request is marked as waiting + * for response. + * @param pending_request Next pending request + */ + void SendPendingHMIRequest(PendingRequest& pending_request); + + std::deque<PendingRequest> pending_requests_; + sync_primitives::RecursiveLock pending_resumption_lock_; }; } // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc index 77605b31c3..8229e1978c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc @@ -84,9 +84,10 @@ const SystemInfo GetSystemInfoResponse::GetSystemInfo() const { info.wers_country_code = (*message_)[strings::msg_params]["wersCountryCode"].asString(); - const auto lang_code = static_cast<hmi_apis::Common_Language::eType>( - (*message_)[strings::msg_params]["language"].asUInt()); - info.language = MessageHelper::CommonLanguageToString(lang_code); + const uint32_t lang_code = + (*message_)[strings::msg_params]["language"].asUInt(); + info.language = application_manager::EnumToString( + static_cast<hmi_apis::Common_Language::eType>(lang_code)); return info; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_audio_start_stream_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_audio_start_stream_request.cc index b9860bcd02..21d6282436 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_audio_start_stream_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_audio_start_stream_request.cc @@ -144,41 +144,46 @@ void AudioStartStreamRequest::onTimeOut() { void AudioStartStreamRequest::RetryStartSession() { SDL_LOG_AUTO_TRACE(); - application_manager_.TerminateRequest( - connection_key(), correlation_id(), function_id()); + auto retry_start_session = [this](const uint32_t hmi_app_id) { + ApplicationSharedPtr app = + application_manager_.application_by_hmi_app(hmi_app_id); - ApplicationSharedPtr app = - application_manager_.application_by_hmi_app(application_id()); - if (!app) { - SDL_LOG_ERROR("StartAudioStreamRequest aborted. Application not found"); - return; - } + if (!app) { + SDL_LOG_ERROR("StartAudioStreamRequest aborted. Application not found"); + return; + } - if (!app->audio_streaming_allowed()) { - SDL_LOG_WARN("Audio streaming not allowed"); - return; - } + if (!app->audio_streaming_allowed()) { + SDL_LOG_WARN("Audio streaming not allowed"); + return; + } - if (app->audio_streaming_approved()) { - SDL_LOG_INFO("AudioStartStream retry sequence stopped. " - << "SUCCESS received"); - app->set_audio_stream_retry_number(0); - return; - } + if (app->audio_streaming_approved()) { + SDL_LOG_INFO("AudioStartStream retry sequence stopped. " + << "SUCCESS received"); + app->set_audio_stream_retry_number(0); + return; + } - uint32_t curr_retry_number = app->audio_stream_retry_number(); + uint32_t curr_retry_number = app->audio_stream_retry_number() + 1; - if (curr_retry_number <= retry_number_) { - SDL_LOG_DEBUG("Retry number " << curr_retry_number << " of " - << retry_number_); - MessageHelper::SendAudioStartStream(app->app_id(), application_manager_); - app->set_audio_stream_retry_number(++curr_retry_number); - } else { - SDL_LOG_DEBUG("Audio start stream retry sequence stopped. " - << "Attempts expired."); + if (curr_retry_number <= retry_number_) { + SDL_LOG_DEBUG("Retry number " << curr_retry_number << " of " + << retry_number_); + MessageHelper::SendAudioStartStream(app->app_id(), application_manager_); + app->set_audio_stream_retry_number(curr_retry_number); + } else { + SDL_LOG_DEBUG("Audio start stream retry sequence stopped. " + << "Attempts expired."); - application_manager_.EndNaviServices(app->app_id()); - } + application_manager_.EndNaviServices(app->app_id()); + } + }; + + retry_start_session(application_id()); + + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } } // namespace commands diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_set_video_config_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_set_video_config_request.cc index e4fbdaa0d6..ff9d861def 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_set_video_config_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_set_video_config_request.cc @@ -93,16 +93,15 @@ void NaviSetVideoConfigRequest::on_event(const event_engine::Event& event) { const hmi_apis::Common_Result::eType code = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); - bool result = false; - std::vector<std::string> rejected_params; if (code == hmi_apis::Common_Result::SUCCESS) { SDL_LOG_DEBUG("Received SetVideoConfig success response"); - result = true; + application_manager_.OnStreamingConfigurationSuccessful( + app->app_id(), protocol_handler::ServiceType::kMobileNav); } else { SDL_LOG_DEBUG("Received SetVideoConfig failure response (" << event.id() << ")"); - result = false; + std::vector<std::string> rejected_params; if (message[strings::msg_params].keyExists(strings::rejected_params)) { const smart_objects::SmartArray* list = message[strings::msg_params][strings::rejected_params].asArray(); @@ -118,13 +117,14 @@ void NaviSetVideoConfigRequest::on_event(const event_engine::Event& event) { } } } + + application_manager_.OnStreamingConfigurationFailed( + app->app_id(), + rejected_params, + "Received SetVideoConfig failure response"); + + break; } - application_manager_.OnStreamingConfigured( - app->app_id(), - protocol_handler::ServiceType::kMobileNav, - result, - rejected_params); - break; } default: SDL_LOG_ERROR("Received unknown event " << event.id()); @@ -143,8 +143,10 @@ void NaviSetVideoConfigRequest::onTimeOut() { } std::vector<std::string> empty; - application_manager_.OnStreamingConfigured( - app->app_id(), protocol_handler::ServiceType::kMobileNav, false, empty); + application_manager_.OnStreamingConfigurationFailed( + app->app_id(), + empty, + "Timed out while waiting for SetVideoConfig response"); application_manager_.TerminateRequest( connection_key(), correlation_id(), function_id()); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_start_stream_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_start_stream_request.cc index d0f95ee385..973c323ebe 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_start_stream_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_start_stream_request.cc @@ -146,41 +146,46 @@ void NaviStartStreamRequest::onTimeOut() { void NaviStartStreamRequest::RetryStartSession() { SDL_LOG_AUTO_TRACE(); - application_manager_.TerminateRequest( - connection_key(), correlation_id(), function_id()); + auto retry_start_session = [this](const uint32_t hmi_app_id) { + ApplicationSharedPtr app = + application_manager_.application_by_hmi_app(hmi_app_id); - ApplicationSharedPtr app = - application_manager_.application_by_hmi_app(application_id()); - if (!app) { - SDL_LOG_ERROR("NaviStartStreamRequest aborted. Application not found"); - return; - } + if (!app) { + SDL_LOG_ERROR("NaviStartStreamRequest aborted. Application not found"); + return; + } - if (!app->video_streaming_allowed()) { - SDL_LOG_WARN("Video streaming not allowed"); - return; - } + if (!app->video_streaming_allowed()) { + SDL_LOG_WARN("Video streaming not allowed"); + return; + } - if (app->video_streaming_approved()) { - SDL_LOG_INFO("NaviStartStream retry sequence stopped. " - << "SUCCESS received"); - app->set_video_stream_retry_number(0); - return; - } + if (app->video_streaming_approved()) { + SDL_LOG_INFO("NaviStartStream retry sequence stopped. " + << "SUCCESS received"); + app->set_video_stream_retry_number(0); + return; + } - uint32_t curr_retry_number = app->video_stream_retry_number(); + uint32_t curr_retry_number = app->video_stream_retry_number() + 1; - if (curr_retry_number <= retry_number_) { - SDL_LOG_DEBUG("Retry number " << curr_retry_number << " of " - << retry_number_); - MessageHelper::SendNaviStartStream(app->app_id(), application_manager_); - app->set_video_stream_retry_number(++curr_retry_number); - } else { - SDL_LOG_DEBUG("NaviStartStream retry sequence stopped. " - << "Attempts expired"); + if (curr_retry_number <= retry_number_) { + SDL_LOG_DEBUG("Retry number " << curr_retry_number << " of " + << retry_number_); + MessageHelper::SendNaviStartStream(app->app_id(), application_manager_); + app->set_video_stream_retry_number(curr_retry_number); + } else { + SDL_LOG_DEBUG("NaviStartStream retry sequence stopped. " + << "Attempts expired"); - application_manager_.EndNaviServices(app->app_id()); - } + application_manager_.EndNaviServices(app->app_id()); + } + }; + + retry_start_session(application_id()); + + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } } // namespace commands diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_app_permission_consent_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_app_permission_consent_notification.cc index 37552e003a..e9e0c65424 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_app_permission_consent_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_app_permission_consent_notification.cc @@ -50,7 +50,7 @@ namespace { struct PermissionsAppender : public std::unary_function<void, const smart_objects::SmartArray::value_type&> { - PermissionsAppender(policy::PermissionConsent& consents) + explicit PermissionsAppender(policy::PermissionConsent& consents) : allowed_key_(application_manager::hmi_response::allowed) , consents_(consents) {} void operator()(const smart_objects::SmartArray::value_type& item) const { @@ -82,7 +82,7 @@ struct PermissionsAppender */ struct ExternalConsentStatusAppender : std::unary_function<void, const smart_objects::SmartArray::value_type&> { - ExternalConsentStatusAppender( + explicit ExternalConsentStatusAppender( policy::ExternalConsentStatus& external_consent_status) : external_consent_status_(external_consent_status) {} void operator()(const smart_objects::SmartArray::value_type& item) const { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc index f701713d96..167176aa0f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc @@ -78,8 +78,7 @@ struct OnDriverDistractionProcessor { if (is_lock_screen_dismissal_exists && msg_params[mobile_notification::lock_screen_dismissal_enabled] .asBool()) { - const auto language = - MessageHelper::MobileLanguageToString(application->ui_language()); + const auto language = EnumToString(application->ui_language()); const auto warning_message = application_manager_.GetPolicyHandler() diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_exit_application_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_exit_application_notification.cc index 2b95d2e3e8..4a6a3df3b4 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_exit_application_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_exit_application_notification.cc @@ -119,7 +119,6 @@ void OnExitApplicationNotification::Run() { MessageHelper::GetOnAppInterfaceUnregisteredNotificationToMobile( app_id, AppInterfaceUnregisteredReason::RESOURCE_CONSTRAINT); SendNotificationToMobile(message); - application_manager_.UnregisterApplication(app_id, Result::SUCCESS); return; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_info_changed_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_info_changed_notification.cc index 6a3b814d05..48071cc1b2 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_info_changed_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_info_changed_notification.cc @@ -60,9 +60,8 @@ void OnSystemInfoChangedNotification::Run() { SDL_LOG_AUTO_TRACE(); uint32_t lang_code = (*message_)[strings::msg_params][strings::language].asUInt(); - const std::string language = - application_manager::MessageHelper::CommonLanguageToString( - static_cast<hmi_apis::Common_Language::eType>(lang_code)); + const std::string language = application_manager::EnumToString( + static_cast<hmi_apis::Common_Language::eType>(lang_code)); policy_handler_.OnSystemInfoChanged(language); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc index 527cf911b9..66ac9c458b 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc @@ -43,7 +43,7 @@ namespace commands { namespace { struct ProtoV4AppsOnDevice : std::unary_function<ApplicationSharedPtr, bool> { connection_handler::DeviceHandle handle_; - ProtoV4AppsOnDevice(const connection_handler::DeviceHandle handle) + explicit ProtoV4AppsOnDevice(const connection_handler::DeviceHandle handle) : handle_(handle) {} bool operator()(const ApplicationSharedPtr app) const { return app ? handle_ == app->device() && @@ -118,6 +118,15 @@ void SDLActivateAppRequest::Run() { ApplicationConstSharedPtr app = application_manager_.WaitingApplicationByID(app_id()); + + if (!app) { + app = application_manager_.application(app_id()); + if (!app) { + SDL_LOG_WARN("Can't find application within waiting apps: " << app_id()); + return; + } + } + if (application_manager_.state_controller().IsStateActive( HmiState::STATE_ID_DEACTIVATE_HMI)) { SDL_LOG_DEBUG( @@ -139,6 +148,18 @@ void SDLActivateAppRequest::Run() { application_manager_.connection_handler().ConnectToDevice(app->device()); } else { const uint32_t application_id = app_id(); + auto main_state = + app->CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); + if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { + SDL_LOG_DEBUG( + "Application registration is not completed, HMI level hasn't set " + "yet, postpone activation"); + auto& postponed_activation_ctrl = application_manager_.state_controller() + .GetPostponedActivationController(); + postponed_activation_ctrl.AddAppToActivate(application_id, + correlation_id()); + return; + } policy_handler_.OnActivateApp(application_id, correlation_id()); } } @@ -186,6 +207,18 @@ void SDLActivateAppRequest::Run() { if (app_to_activate->IsRegistered()) { SDL_LOG_DEBUG("Application is registered. Activating."); + auto main_state = app_to_activate->CurrentHmiState( + mobile_apis::PredefinedWindows::DEFAULT_WINDOW); + if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { + SDL_LOG_DEBUG( + "Application registration is not completed, HMI level hasn't set " + "yet, postpone activation"); + auto& postponed_activation_ctrl = application_manager_.state_controller() + .GetPostponedActivationController(); + postponed_activation_ctrl.AddAppToActivate(application_id, + correlation_id()); + return; + } policy_handler_.OnActivateApp(application_id, correlation_id()); return; } else if (app_to_activate->is_cloud_app()) { @@ -269,6 +302,19 @@ void SDLActivateAppRequest::on_event(const event_engine::Event& event) { "Application not found by HMI app id: " << hmi_application_id); return; } + + auto main_state = + app->CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); + if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { + SDL_LOG_DEBUG( + "Application registration is not completed, HMI level hasn't set " + "yet, postpone activation"); + auto& postponed_activation_ctrl = application_manager_.state_controller() + .GetPostponedActivationController(); + postponed_activation_ctrl.AddAppToActivate(app->app_id(), correlation_id()); + return; + } + policy_handler_.OnActivateApp(app->app_id(), correlation_id()); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_get_user_friendly_message_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_get_user_friendly_message_request.cc index e58961e581..57831bbc4a 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_get_user_friendly_message_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_get_user_friendly_message_request.cc @@ -86,15 +86,13 @@ void SDLGetUserFriendlyMessageRequest::Run() { if ((*message_)[strings::msg_params].keyExists(strings::language)) { uint32_t lang_code = (*message_)[strings::msg_params][strings::language].asUInt(); - required_language = - application_manager::MessageHelper::CommonLanguageToString( - static_cast<hmi_apis::Common_Language::eType>(lang_code)); + required_language = application_manager::EnumToString( + static_cast<hmi_apis::Common_Language::eType>(lang_code)); } else { hmi_apis::Common_Language::eType ui_language = hmi_capabilities_.active_ui_language(); - required_language = - application_manager::MessageHelper::CommonLanguageToString(ui_language); + required_language = application_manager::EnumToString(ui_language); } policy_handler_.OnGetUserFriendlyMessage( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc index 288cafb94e..e2a37f17bd 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc @@ -96,14 +96,24 @@ void AddSubMenuRequest::Run() { return; } - const std::string& menu_name = - received_msg_params[strings::menu_name].asString(); - const uint32_t parent_id = received_msg_params.keyExists(strings::parent_id) ? received_msg_params[strings::parent_id].asUInt() : 0; + if (0 != parent_id) { + smart_objects::SmartObject parent = app->FindSubMenu(parent_id); + if (smart_objects::SmartType_Null == parent.getType()) { + SDL_LOG_ERROR("Parent ID " << parent_id << " doesn't exist"); + SendResponse( + false, mobile_apis::Result::INVALID_ID, "Parent ID doesn't exist"); + return; + } + } + + const std::string& menu_name = + received_msg_params[strings::menu_name].asString(); + if (app->IsSubMenuNameAlreadyExist(menu_name, parent_id)) { SDL_LOG_ERROR("Menu name " << menu_name << " is duplicated."); SendResponse(false, mobile_apis::Result::DUPLICATE_NAME); @@ -209,9 +219,9 @@ bool AddSubMenuRequest::Init() { bool AddSubMenuRequest::CheckSubMenuName() { SDL_LOG_AUTO_TRACE(); - const char* str = NULL; - str = (*message_)[strings::msg_params][strings::menu_name].asCharArray(); + const char* str = + (*message_)[strings::msg_params][strings::menu_name].asCharArray(); if (!CheckSyntax(str)) { SDL_LOG_INFO("Invalid subMenu name."); return false; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc index 55783be4cd..cfd3106f4d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc @@ -111,10 +111,11 @@ void AlertRequest::Run() { (*message_)[strings::msg_params][strings::tts_chunks].length(); } - if ((tts_chunks_exists && length_tts_chunks) || - ((*message_)[strings::msg_params].keyExists(strings::play_tone) && - (*message_)[strings::msg_params][strings::play_tone].asBool())) { + if (tts_chunks_exists && length_tts_chunks) { awaiting_tts_speak_response_ = true; + } else if ((*message_)[strings::msg_params].keyExists(strings::play_tone) && + (*message_)[strings::msg_params][strings::play_tone].asBool()) { + set_warning_info("playTone ignored since TTS Chunks were not provided"); } SendAlertRequest(app_id); @@ -409,8 +410,6 @@ void AlertRequest::SendSpeakRequest(int32_t app_id, SmartObject msg_params = smart_objects::SmartObject(SmartType_Map); if (tts_chunks_exists && length_tts_chunks) { msg_params[hmi_request::tts_chunks] = - smart_objects::SmartObject(SmartType_Array); - msg_params[hmi_request::tts_chunks] = (*message_)[strings::msg_params][strings::tts_chunks]; } if ((*message_)[strings::msg_params].keyExists(strings::play_tone) && diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc index 8e13110515..13a57cf9a8 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc @@ -44,7 +44,8 @@ namespace { namespace custom_str = utils::custom_string; struct IsSameNickname { - IsSameNickname(const custom_str::CustomString& app_id) : app_id_(app_id) {} + explicit IsSameNickname(const custom_str::CustomString& app_id) + : app_id_(app_id) {} bool operator()(const policy::StringArray::value_type& nickname) const { return app_id_.CompareIgnoreCase(nickname.c_str()); } @@ -512,7 +513,6 @@ bool ChangeRegistrationRequest::IsLanguageSupportedByTTS( for (size_t i = 0; i < tts_languages->length(); ++i) { if (hmi_display_lang == tts_languages->getElement(i).asInt()) { return true; - break; } } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc index d43e8e0710..0d1d876497 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc @@ -221,9 +221,8 @@ bool CreateInteractionChoiceSetRequest::compareSynonyms( CreateInteractionChoiceSetRequest::compareStr); if (it != vr_cmds_1->end()) { - SDL_LOG_INFO( - - "Incoming choice set has duplicated VR synonyms " << it->asString()); + SDL_LOG_INFO("Incoming choice set has duplicated VR synonyms " + << it->asString()); return true; } @@ -239,9 +238,8 @@ bool CreateInteractionChoiceSetRequest::compareStr( bool CreateInteractionChoiceSetRequest::IsWhiteSpaceExist( const smart_objects::SmartObject& choice_set) { SDL_LOG_AUTO_TRACE(); - const char* str = NULL; - str = choice_set[strings::menu_name].asCharArray(); + const char* str = choice_set[strings::menu_name].asCharArray(); if (!CheckSyntax(str)) { SDL_LOG_ERROR("Invalid menu_name syntax check failed"); return true; @@ -322,8 +320,6 @@ void CreateInteractionChoiceSetRequest::SendVRAddCommandRequests( msg_params[strings::cmd_id] = choice_set[strings::choice_set][chs_num][strings::choice_id]; msg_params[strings::vr_commands] = - smart_objects::SmartObject(smart_objects::SmartType_Array); - msg_params[strings::vr_commands] = choice_set[strings::choice_set][chs_num][strings::vr_commands]; sync_primitives::AutoLock commands_lock(vr_commands_lock_); @@ -334,9 +330,8 @@ void CreateInteractionChoiceSetRequest::SendVRAddCommandRequests( VRCommandInfo vr_command(vr_cmd_id); sent_commands_map_[vr_corr_id] = vr_command; - SDL_LOG_DEBUG( - - "VR_command sent corr_id " << vr_corr_id << " cmd_id " << vr_corr_id); + SDL_LOG_DEBUG("VR_command sent corr_id " << vr_corr_id << " cmd_id " + << vr_corr_id); } expected_chs_count_ = chs_num; SDL_LOG_DEBUG("expected_chs_count_ = " << expected_chs_count_); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_command_request.cc index 0c731a027b..358a002606 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_command_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_command_request.cc @@ -96,15 +96,6 @@ void DeleteCommandRequest::Run() { (*message_)[strings::msg_params][strings::cmd_id]; msg_params[strings::app_id] = application->app_id(); - // we should specify amount of required responses in the 1st request - uint32_t chaining_counter = 0; - if (command.keyExists(strings::menu_params)) { - ++chaining_counter; - } - - if (command.keyExists(strings::vr_commands)) { - ++chaining_counter; - } /* Need to set all flags before sending request to HMI * for correct processing this flags in method on_event */ if (command.keyExists(strings::menu_params)) { @@ -164,7 +155,7 @@ void DeleteCommandRequest::on_event(const event_engine::Event& event) { ui_result_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); SDL_LOG_DEBUG("Received UI_DeleteCommand event with result " - << MessageHelper::HMIResultToString(ui_result_)); + << EnumToString(ui_result_)); GetInfo(message, ui_info_); break; } @@ -174,7 +165,7 @@ void DeleteCommandRequest::on_event(const event_engine::Event& event) { vr_result_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); SDL_LOG_DEBUG("Received VR_DeleteCommand event with result " - << MessageHelper::HMIResultToString(vr_result_)); + << EnumToString(vr_result_)); GetInfo(message, vr_info_); break; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc index d8b74eb770..3ff95a6f41 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc @@ -65,9 +65,8 @@ void DeleteInteractionChoiceSetRequest::Run() { ApplicationSharedPtr app = application_manager_.application(connection_key()); if (!app) { - SDL_LOG_ERROR( - - "No application associated with connection key " << connection_key()); + SDL_LOG_ERROR("No application associated with connection key " + << connection_key()); SendResponse(false, mobile_apis::Result::APPLICATION_NOT_REGISTERED); return; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_way_points_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_way_points_request.cc index 33d3479941..54b542d245 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_way_points_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_way_points_request.cc @@ -68,10 +68,8 @@ void GetWayPointsRequest::Run() { SendResponse(false, mobile_apis::Result::APPLICATION_NOT_REGISTERED); return; } - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params = (*message_)[strings::msg_params]; + smart_objects::SmartObject msg_params = (*message_)[strings::msg_params]; msg_params[strings::app_id] = app->app_id(); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_Navigation); SendHMIRequest(hmi_apis::FunctionID::Navigation_GetWayPoints, diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc index 90ed038b89..4a97d5b970 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc @@ -173,7 +173,7 @@ void OnSystemRequestNotification::AddHeader(BinaryMessage& message) const { } char timeout_str[24]; - if (0 > sprintf(timeout_str, "%d", timeout)) { + if (0 > sprintf(timeout_str, "%u", timeout)) { memset(timeout_str, 0, sizeof(timeout_str)); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc index 9c218e0e99..a3269847a1 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc @@ -34,12 +34,12 @@ #include "sdl_rpc_plugin/commands/mobile/perform_interaction_request.h" #include <string.h> + #include <numeric> #include <string> #include "application_manager/application_impl.h" #include "application_manager/message_helper.h" - #include "interfaces/HMI_API.h" #include "interfaces/MOBILE_API.h" #include "utils/custom_string.h" @@ -598,9 +598,8 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest( MessageHelper::VerifyTtsFiles(help_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { - SDL_LOG_WARN( - - "MessageHelper::VerifyTtsFiles return " << verification_result); + SDL_LOG_WARN("MessageHelper::VerifyTtsFiles return " + << verification_result); invalid_params.push_back("help_prompt"); } else { msg_params[strings::help_prompt] = help_prompt; @@ -646,9 +645,8 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest( timeout_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { - SDL_LOG_WARN( - - "MessageHelper::VerifyTtsFiles return " << verification_result); + SDL_LOG_WARN("MessageHelper::VerifyTtsFiles return " + << verification_result); invalid_params.push_back("timeout_prompt"); } else { msg_params[strings::timeout_prompt] = timeout_prompt; @@ -667,9 +665,8 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest( initial_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { - SDL_LOG_WARN( - - "MessageHelper::VerifyTtsFiles return " << verification_result); + SDL_LOG_WARN("MessageHelper::VerifyTtsFiles return " + << verification_result); invalid_params.push_back("initial_prompt"); } else { msg_params[strings::initial_prompt] = initial_prompt; @@ -871,9 +868,9 @@ void PerformInteractionRequest::DisablePerformInteraction() { bool PerformInteractionRequest::IsWhiteSpaceExist() { SDL_LOG_AUTO_TRACE(); - const char* str = NULL; - str = (*message_)[strings::msg_params][strings::initial_text].asCharArray(); + const char* str = + (*message_)[strings::msg_params][strings::initial_text].asCharArray(); if (!CheckSyntax(str)) { SDL_LOG_ERROR("Invalid initial_text syntax check failed"); return true; @@ -1008,7 +1005,6 @@ bool PerformInteractionRequest::CheckChoiceSetListVRCommands( // this should never ever happen since this was already checked if (smart_objects::SmartType_Null == choice_set.getType()) { SDL_LOG_ERROR( - "Couldn't find choiceset_id = " << choice_set_id_list[i].asInt()); SendResponse(false, mobile_apis::Result::INVALID_ID); return false; @@ -1038,7 +1034,6 @@ bool PerformInteractionRequest::CheckChoiceIDFromRequest( const smart_objects::SmartObject& choice_set_id_list) const { SDL_LOG_AUTO_TRACE(); - size_t choice_list_length = 0; std::set<uint32_t> choice_id_set; std::pair<std::set<uint32_t>::iterator, bool> ins_res; @@ -1046,12 +1041,11 @@ bool PerformInteractionRequest::CheckChoiceIDFromRequest( auto choice_set = app->FindChoiceSet(choice_set_id_list[i].asInt()); if (smart_objects::SmartType_Null == choice_set.getType()) { SDL_LOG_ERROR( - "Couldn't find choiceset_id = " << choice_set_id_list[i].asInt()); return false; } - choice_list_length = choice_set[strings::choice_set].length(); + size_t choice_list_length = choice_set[strings::choice_set].length(); const smart_objects::SmartObject& choices_list = choice_set[strings::choice_set]; for (size_t k = 0; k < choice_list_length; ++k) { @@ -1076,15 +1070,14 @@ const bool PerformInteractionRequest::HasHMIResponsesToWait() const { void PerformInteractionRequest::SendBothModeResponse( const smart_objects::SmartObject& msg_param) { SDL_LOG_AUTO_TRACE(); - mobile_apis::Result::eType perform_interaction_result_code = - mobile_apis::Result::INVALID_ENUM; + app_mngr::commands::ResponseInfo ui_perform_info( ui_result_code_, HmiInterfaces::HMI_INTERFACE_UI, application_manager_); app_mngr::commands::ResponseInfo vr_perform_info( vr_result_code_, HmiInterfaces::HMI_INTERFACE_VR, application_manager_); const bool result = PrepareResultForMobileResponse(ui_perform_info, vr_perform_info); - perform_interaction_result_code = + mobile_apis::Result::eType perform_interaction_result_code = PrepareResultCodeForResponse(ui_perform_info, vr_perform_info); const smart_objects::SmartObject* response_params = msg_param.empty() ? NULL : &msg_param; @@ -1164,18 +1157,23 @@ bool PerformInteractionRequest::SetChoiceIdToResponseMsgParams( return false; } - if (mobile_apis::InteractionMode::eType::MANUAL_ONLY == interaction_mode_) { - msg_param[strings::choice_id] = ui_choice_id_received_; - return true; - } - - if (mobile_apis::InteractionMode::eType::VR_ONLY == interaction_mode_) { - msg_param[strings::choice_id] = vr_choice_id_received_; - return true; + switch (interaction_mode_) { + case mobile_apis::InteractionMode::eType::MANUAL_ONLY: + if (ui_choice_id_valid) { + msg_param[strings::choice_id] = ui_choice_id_received_; + } + case mobile_apis::InteractionMode::eType::VR_ONLY: + if (vr_choice_id_valid) { + msg_param[strings::choice_id] = vr_choice_id_received_; + } + default: + if (ui_choice_id_valid) { + msg_param[strings::choice_id] = ui_choice_id_received_; + } else if (vr_choice_id_valid) { + msg_param[strings::choice_id] = vr_choice_id_received_; + } } - msg_param[strings::choice_id] = - ui_choice_id_valid ? ui_choice_id_received_ : vr_choice_id_received_; return true; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/put_file_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/put_file_request.cc index 50ff392e33..5263991716 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/put_file_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/put_file_request.cc @@ -165,7 +165,6 @@ void PutFileRequest::Run() { is_persistent_file_ = false; bool is_system_file = false; length_ = binary_data.size(); - bool is_download_complete = true; bool offset_exist = (*message_)[strings::msg_params].keyExists(strings::offset); @@ -252,6 +251,7 @@ void PutFileRequest::Run() { case mobile_apis::Result::SUCCESS: { SDL_LOG_INFO("PutFile is successful"); if (!is_system_file) { + bool is_download_complete = true; AppFile file(sync_file_name_, is_persistent_file_, is_download_complete, diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc index c30f83bc00..6ac830c378 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc @@ -56,66 +56,14 @@ namespace { namespace custom_str = utils::custom_string; -mobile_apis::AppHMIType::eType StringToAppHMIType(const std::string& str) { - if ("DEFAULT" == str) { - return mobile_apis::AppHMIType::DEFAULT; - } else if ("COMMUNICATION" == str) { - return mobile_apis::AppHMIType::COMMUNICATION; - } else if ("MEDIA" == str) { - return mobile_apis::AppHMIType::MEDIA; - } else if ("MESSAGING" == str) { - return mobile_apis::AppHMIType::MESSAGING; - } else if ("NAVIGATION" == str) { - return mobile_apis::AppHMIType::NAVIGATION; - } else if ("INFORMATION" == str) { - return mobile_apis::AppHMIType::INFORMATION; - } else if ("SOCIAL" == str) { - return mobile_apis::AppHMIType::SOCIAL; - } else if ("BACKGROUND_PROCESS" == str) { - return mobile_apis::AppHMIType::BACKGROUND_PROCESS; - } else if ("TESTING" == str) { - return mobile_apis::AppHMIType::TESTING; - } else if ("SYSTEM" == str) { - return mobile_apis::AppHMIType::SYSTEM; - } else if ("PROJECTION" == str) { - return mobile_apis::AppHMIType::PROJECTION; - } else if ("REMOTE_CONTROL" == str) { - return mobile_apis::AppHMIType::REMOTE_CONTROL; - } else if ("WEB_VIEW" == str) { - return mobile_apis::AppHMIType::WEB_VIEW; - } else { - return mobile_apis::AppHMIType::INVALID_ENUM; - } -} - -std::string AppHMITypeToString(mobile_apis::AppHMIType::eType type) { - const std::map<mobile_apis::AppHMIType::eType, std::string> app_hmi_type_map = - {{mobile_apis::AppHMIType::DEFAULT, "DEFAULT"}, - {mobile_apis::AppHMIType::REMOTE_CONTROL, "REMOTE_CONTROL"}, - {mobile_apis::AppHMIType::COMMUNICATION, "COMMUNICATION"}, - {mobile_apis::AppHMIType::MEDIA, "MEDIA"}, - {mobile_apis::AppHMIType::MESSAGING, "MESSAGING"}, - {mobile_apis::AppHMIType::NAVIGATION, "NAVIGATION"}, - {mobile_apis::AppHMIType::INFORMATION, "INFORMATION"}, - {mobile_apis::AppHMIType::SOCIAL, "SOCIAL"}, - {mobile_apis::AppHMIType::BACKGROUND_PROCESS, "BACKGROUND_PROCESS"}, - {mobile_apis::AppHMIType::TESTING, "TESTING"}, - {mobile_apis::AppHMIType::SYSTEM, "SYSTEM"}, - {mobile_apis::AppHMIType::PROJECTION, "PROJECTION"}, - {mobile_apis::AppHMIType::WEB_VIEW, "WEB_VIEW"}}; - - std::map<mobile_apis::AppHMIType::eType, std::string>::const_iterator iter = - app_hmi_type_map.find(type); - - return app_hmi_type_map.end() != iter ? iter->second : std::string(""); -} - struct AppHMITypeInserter { - AppHMITypeInserter(smart_objects::SmartObject& so_array) + explicit AppHMITypeInserter(smart_objects::SmartObject& so_array) : index_(0), so_array_(so_array) {} bool operator()(const std::string& app_hmi_type) { - so_array_[index_] = StringToAppHMIType(app_hmi_type); + so_array_[index_] = + application_manager::StringToEnum<mobile_apis::AppHMIType::eType>( + app_hmi_type); ++index_; return true; } @@ -131,7 +79,7 @@ struct CheckMissedTypes { : policy_app_types_(policy_app_types), log_(log) {} bool operator()(const smart_objects::SmartArray::value_type& value) { - std::string app_type_str = AppHMITypeToString( + std::string app_type_str = application_manager::EnumToString( static_cast<mobile_apis::AppHMIType::eType>(value.asInt())); if (!app_type_str.empty()) { policy::StringArray::const_iterator it = policy_app_types_.begin(); @@ -162,7 +110,7 @@ class SmartArrayValueExtractor { }; struct IsSameNickname { - IsSameNickname(const custom_str::CustomString app_name) + explicit IsSameNickname(const custom_str::CustomString app_name) : app_name_(app_name) {} bool operator()(const policy::StringArray::value_type& nickname) const { return app_name_.CompareIgnoreCase(nickname.c_str()); @@ -742,6 +690,16 @@ void RegisterAppInterfaceRequest::Run() { SetupAppDeviceInfo(application); auto status_notifier = AddApplicationDataToPolicy(application); + auto on_app_registered = [application](plugin_manager::RPCPlugin& plugin) { + plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, + application); + }; + // To prevent timing issues, this event is called before an app is accessible + // by the applications accessor. This prevents incoming hmi rpcs from + // attempting to access an app before it has been fully initialized. + application_manager_.ApplyFunctorForEachPlugin(on_app_registered); + application_manager_.FinalizeAppRegistration(application, connection_key()); + std::string add_info; const auto is_resumption_required = ApplicationDataShouldBeResumed(add_info); @@ -762,12 +720,6 @@ void RegisterAppInterfaceRequest::Run() { SendSubscribeCustomButtonNotification(); SendChangeRegistrationOnHMI(application); - auto on_app_registered = [application](plugin_manager::RPCPlugin& plugin) { - plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, - application); - }; - application_manager_.ApplyFunctorForEachPlugin(on_app_registered); - if (is_resumption_required) { const auto& msg_params = (*message_)[strings::msg_params]; const auto& hash_id = msg_params[strings::hash_id].asString(); @@ -1369,9 +1321,9 @@ bool RegisterAppInterfaceRequest::IsApplicationWithSameAppIdRegistered() { bool RegisterAppInterfaceRequest::IsWhiteSpaceExist() { SDL_LOG_AUTO_TRACE(); - const char* str = NULL; - str = (*message_)[strings::msg_params][strings::app_name].asCharArray(); + const char* str = + (*message_)[strings::msg_params][strings::app_name].asCharArray(); if (!CheckSyntax(str)) { SDL_LOG_ERROR("Invalid app_name syntax check failed"); return true; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc index 37d43a354b..fcc898b348 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc @@ -119,9 +119,7 @@ void SendLocationRequest::Run() { } if (msg_params.keyExists(strings::location_image)) { - mobile_apis::Result::eType verification_result = - mobile_apis::Result::SUCCESS; - verification_result = MessageHelper::VerifyImage( + mobile_apis::Result::eType verification_result = MessageHelper::VerifyImage( (*message_)[strings::msg_params][strings::location_image], app, application_manager_); @@ -132,8 +130,7 @@ void SendLocationRequest::Run() { } } - SmartObject request_msg_params = SmartObject(smart_objects::SmartType_Map); - request_msg_params = msg_params; + SmartObject request_msg_params = msg_params; request_msg_params[strings::app_id] = app->hmi_app_id(); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_Navigation); SendHMIRequest( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc index 922a45ebdb..396763ff98 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc @@ -111,10 +111,8 @@ void SetGlobalPropertiesRequest::Run() { return; } - mobile_apis::Result::eType verification_result = mobile_apis::Result::SUCCESS; - if (msg_params.keyExists(strings::menu_icon)) { - verification_result = MessageHelper::VerifyImage( + mobile_apis::Result::eType verification_result = MessageHelper::VerifyImage( msg_params[strings::menu_icon], app, application_manager_); if (mobile_apis::Result::INVALID_DATA == verification_result) { SDL_LOG_ERROR("MessageHelper::VerifyImage return " @@ -241,11 +239,11 @@ void SetGlobalPropertiesRequest::Run() { application_manager_.GetPluginManager().ForEachPlugin( on_global_properties_updated); - smart_objects::SmartObject params = + smart_objects::SmartObject rc_request_params = smart_objects::SmartObject(smart_objects::SmartType_Map); - params[strings::app_id] = app->app_id(); - params[strings::user_location] = user_location; - SendRCRequest(params, true); + rc_request_params[strings::app_id] = app->app_id(); + rc_request_params[strings::user_location] = user_location; + SendRCRequest(rc_request_params, true); } // check TTS params @@ -257,7 +255,7 @@ void SetGlobalPropertiesRequest::Run() { if (is_help_prompt_present) { smart_objects::SmartObject& help_prompt = (*message_)[strings::msg_params][strings::help_prompt]; - verification_result = + mobile_apis::Result::eType verification_result = MessageHelper::VerifyTtsFiles(help_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { @@ -273,8 +271,9 @@ void SetGlobalPropertiesRequest::Run() { if (is_timeout_prompt_present) { smart_objects::SmartObject& timeout_prompt = (*message_)[strings::msg_params][strings::timeout_prompt]; - verification_result = MessageHelper::VerifyTtsFiles( - timeout_prompt, app, application_manager_); + mobile_apis::Result::eType verification_result = + MessageHelper::VerifyTtsFiles( + timeout_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { SDL_LOG_ERROR("MessageHelper::VerifyTtsFiles return " @@ -291,7 +290,7 @@ void SetGlobalPropertiesRequest::Run() { std::begin(invalid_params), std::end(invalid_params), std::string(""), - [](std::string& first, std::string& second) { + [](std::string& first, const std::string& second) { return first.empty() ? second : first + ", " + second; }); const std::string info = @@ -518,7 +517,6 @@ SetGlobalPropertiesRequest::PrepareResultCodeForResponse( const app_mngr::commands::ResponseInfo& second, const app_mngr::commands::ResponseInfo& third) { SDL_LOG_AUTO_TRACE(); - mobile_apis::Result::eType result_code = mobile_apis::Result::INVALID_ENUM; if (IsResultCodeUnsupported(first, second, third) || IsResultCodeUnsupported(second, third, first) || IsResultCodeUnsupported(third, first, second)) { @@ -547,7 +545,7 @@ SetGlobalPropertiesRequest::PrepareResultCodeForResponse( hmi_apis::Common_Result::eType intermediate_result = std::max(first_result, second_result); - result_code = MessageHelper::HMIToMobileResult( + mobile_apis::Result::eType result_code = MessageHelper::HMIToMobileResult( std::max(intermediate_result, third_result)); return result_code; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc index b7b8fc27ad..cf5d80ecc0 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc @@ -77,10 +77,8 @@ void SetMediaClockRequest::Run() { } if (isDataValid()) { - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); // copy entirely msg - msg_params = (*message_)[strings::msg_params]; + smart_objects::SmartObject msg_params = (*message_)[strings::msg_params]; msg_params[strings::app_id] = app->app_id(); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_app_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_app_menu_request.cc index 7d2751ed0d..fdcf9d2434 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_app_menu_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_app_menu_request.cc @@ -62,9 +62,8 @@ void ShowAppMenuRequest::Run() { ApplicationSharedPtr app = application_manager_.application(connection_key()); if (!app) { - SDL_LOG_ERROR( - - "Application with id " << connection_key() << " is not registered."); + SDL_LOG_ERROR("Application with id " << connection_key() + << " is not registered."); SendResponse(false, mobile_apis::Result::APPLICATION_NOT_REGISTERED); return; } @@ -77,9 +76,8 @@ void ShowAppMenuRequest::Run() { app->system_context(mobile_apis::PredefinedWindows::DEFAULT_WINDOW), mobile_apis::SystemContext::SYSCTXT_MAIN, mobile_apis::SystemContext::SYSCTXT_MENU)) { - SDL_LOG_ERROR( - - "Application with id " << connection_key() << " is not activated."); + SDL_LOG_ERROR("Application with id " << connection_key() + << " is not activated."); SendResponse(false, mobile_apis::Result::REJECTED); return; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_request.cc index 04310bcd58..cfb9d5896e 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_request.cc @@ -80,9 +80,7 @@ void ShowConstantTBTRequest::Run() { return; } - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params = (*message_)[strings::msg_params]; + smart_objects::SmartObject msg_params = (*message_)[strings::msg_params]; if (IsWhiteSpaceExist()) { SDL_LOG_ERROR("Incoming show constant TBT has contains \t\n \\t \\n"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/slider_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/slider_request.cc index 15ced6d5a1..e46d3fd7f0 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/slider_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/slider_request.cc @@ -109,9 +109,7 @@ void SliderRequest::Run() { return; } - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params = (*message_)[strings::msg_params]; + smart_objects::SmartObject msg_params = (*message_)[strings::msg_params]; msg_params[strings::app_id] = application->app_id(); if (!(*message_)[strings::msg_params].keyExists(strings::timeout)) { @@ -183,9 +181,9 @@ void SliderRequest::on_event(const event_engine::Event& event) { bool SliderRequest::IsWhiteSpaceExist() { SDL_LOG_AUTO_TRACE(); - const char* str = NULL; - str = (*message_)[strings::msg_params][strings::slider_header].asCharArray(); + const char* str = + (*message_)[strings::msg_params][strings::slider_header].asCharArray(); if (!CheckSyntax(str)) { SDL_LOG_ERROR("Invalid slider_header value syntax check failed"); return true; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc index 502290328a..327315b372 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc @@ -349,7 +349,6 @@ void SubtleAlertRequest::SendSubtleAlertRequest(int32_t app_id) { hmi_apis::Common_TextFieldName::subtleAlertText2; msg_params[hmi_request::alert_strings][index][hmi_request::field_text] = (*message_)[strings::msg_params][strings::alert_text2]; - index++; } // softButtons @@ -408,8 +407,6 @@ void SubtleAlertRequest::SendSpeakRequest(int32_t app_id, SmartObject msg_params = smart_objects::SmartObject(SmartType_Map); if (tts_chunks_exists && length_tts_chunks) { msg_params[hmi_request::tts_chunks] = - smart_objects::SmartObject(SmartType_Array); - msg_params[hmi_request::tts_chunks] = (*message_)[strings::msg_params][strings::tts_chunks]; } msg_params[strings::app_id] = app_id; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc index 17e295304c..cca088ed2d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc @@ -34,10 +34,12 @@ Copyright (c) 2018, Ford Motor Company #include "sdl_rpc_plugin/commands/mobile/system_request.h" #include <stdio.h> + #include <algorithm> #include <sstream> #include <string> #include <vector> + #include "application_manager/policies/policy_handler_interface.h" #include "formatters/CFormatterJsonBase.h" #include "interfaces/MOBILE_API.h" @@ -70,11 +72,99 @@ const unsigned int kAppIdLengthMax = 40U; const unsigned int kAppNameLengthMax = 100U; const unsigned int kLanguageArraySizeMax = 100U; +typedef std::set<std::string> SynonymsSet; +typedef std::map<std::string, SynonymsSet> SynonymsMap; + +bool ValidateSynonymsAtLanguage(const smart_objects::SmartObject& language, + const std::string& language_name, + SynonymsMap& synonyms_map) { + if (!language[language_name].keyExists(json::vrSynonyms)) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "'languages.vrSynonyms' doesn't exist"); + return false; + } + const smart_objects::SmartArray* synonyms_array = + language[language_name][json::vrSynonyms].asArray(); + if (!synonyms_array) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "vrSynonyms is not array."); + return false; + } + const size_t synonyms_array_size = synonyms_array->size(); + if (synonyms_array_size < kVrArraySizeMin) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "vrSynomyms array has [" << synonyms_array_size + << "] size < allowed min size [" << kVrArraySizeMin << "]"); + return false; + } + if (synonyms_array_size > kVrArraySizeMax) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "vrSynomyms array size [" << synonyms_array_size + << "] exceeds maximum allowed size [" << kVrArraySizeMax + << "]"); + return false; + } + + for (std::size_t idx = 0; idx < synonyms_array_size; ++idx) { + const smart_objects::SmartObject& synonym = (*synonyms_array)[idx]; + const std::string vrSynonym = synonym.asString(); + if (vrSynonym.length() > kVrSynonymLengthMax) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "vrSYnomym item [" << idx << "] exceeds max length [" + << vrSynonym.length() << "]>[" << kVrSynonymLengthMax + << "]"); + return false; + } + if (vrSynonym.length() < kVrSynonymLengthMin) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "vrSYnomym item [" << idx << "] length [" + << vrSynonym.length() << "] is less then min length [" + << kVrSynonymLengthMin << "] allowed."); + return false; + } + // Verify duplicates + SynonymsMap::iterator synonyms_map_iter = synonyms_map.find(language_name); + if (synonyms_map_iter != synonyms_map.end()) { + if (!(*synonyms_map_iter).second.insert(vrSynonym).second) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "vrSYnomym item already defined [" << vrSynonym.c_str() + << "] for language [" << language_name << "]"); + return false; + } + } + } + return true; +} + +bool CheckMandatoryParametersPresent( + const smart_objects::SmartObject& app_data) { + if (!app_data.keyExists(json::android) && !app_data.keyExists(json::ios)) { + return false; + } + + if (app_data.keyExists(json::android) && + !app_data[json::android].keyExists(json::packageName)) { + return false; + } + + if (app_data.keyExists(json::ios) && + !app_data[json::ios].keyExists(json::urlScheme)) { + return false; + } + + if (!app_data.keyExists(json::appId)) { + return false; + } + + if (!app_data.keyExists(json::name)) { + return false; + } + + return true; +} + class QueryAppsDataValidator { public: - typedef std::set<std::string> SynonymsSet; - typedef std::map<std::string, SynonymsSet> SynonymsMap; - QueryAppsDataValidator(smart_objects::SmartObject& object, const ApplicationManager& manager) : data_(object), manager_(manager) {} @@ -298,96 +388,6 @@ class QueryAppsDataValidator { return true; } - bool ValidateSynonymsAtLanguage(const smart_objects::SmartObject& language, - const std::string& language_name, - SynonymsMap& synonyms_map) const { - if (!language[language_name].keyExists(json::vrSynonyms)) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "'languages.vrSynonyms' doesn't exist"); - return false; - } - const smart_objects::SmartArray* synonyms_array = - language[language_name][json::vrSynonyms].asArray(); - if (!synonyms_array) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "vrSynonyms is not array."); - return false; - } - const size_t synonyms_array_size = synonyms_array->size(); - if (synonyms_array_size < kVrArraySizeMin) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "vrSynomyms array has [" << synonyms_array_size - << "] size < allowed min size [" << kVrArraySizeMin << "]"); - return false; - } - if (synonyms_array_size > kVrArraySizeMax) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "vrSynomyms array size [" << synonyms_array_size - << "] exceeds maximum allowed size [" << kVrArraySizeMax - << "]"); - return false; - } - - for (std::size_t idx = 0; idx < synonyms_array_size; ++idx) { - const smart_objects::SmartObject& synonym = (*synonyms_array)[idx]; - const std::string vrSynonym = synonym.asString(); - if (vrSynonym.length() > kVrSynonymLengthMax) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "vrSYnomym item [" << idx << "] exceeds max length [" - << vrSynonym.length() << "]>[" << kVrSynonymLengthMax - << "]"); - return false; - } - if (vrSynonym.length() < kVrSynonymLengthMin) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "vrSYnomym item [" << idx << "] length [" - << vrSynonym.length() << "] is less then min length [" - << kVrSynonymLengthMin << "] allowed."); - return false; - } - // Verify duplicates - SynonymsMap::iterator synonyms_map_iter = - synonyms_map.find(language_name); - if (synonyms_map_iter != synonyms_map.end()) { - if (!(*synonyms_map_iter).second.insert(vrSynonym).second) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "vrSYnomym item already defined [" - << vrSynonym.c_str() << "] for language [" - << language_name << "]"); - return false; - } - } - } - return true; - } - - bool CheckMandatoryParametersPresent( - const smart_objects::SmartObject& app_data) const { - if (!app_data.keyExists(json::android) && !app_data.keyExists(json::ios)) { - return false; - } - - if (app_data.keyExists(json::android) && - !app_data[json::android].keyExists(json::packageName)) { - return false; - } - - if (app_data.keyExists(json::ios) && - !app_data[json::ios].keyExists(json::urlScheme)) { - return false; - } - - if (!app_data.keyExists(json::appId)) { - return false; - } - - if (!app_data.keyExists(json::name)) { - return false; - } - - return true; - } - smart_objects::SmartObject& data_; std::set<std::string> applications_id_set_; const ApplicationManager& manager_; @@ -466,7 +466,7 @@ void SystemRequest::Run() { SDL_LOG_TRACE("Request subtype: " << request_subtype << " is ALLOWED"); } - std::string file_name = kSYNC; + std::string file_name; if ((*message_)[strings::msg_params].keyExists(strings::file_name)) { file_name = (*message_)[strings::msg_params][strings::file_name].asString(); } else { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unregister_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unregister_app_interface_request.cc index 10f808b771..14b316f374 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unregister_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unregister_app_interface_request.cc @@ -51,11 +51,6 @@ void UnregisterAppInterfaceRequest::Run() { return; } - rpc_service_.ManageMobileCommand( - MessageHelper::GetOnAppInterfaceUnregisteredNotificationToMobile( - connection_key(), - mobile_api::AppInterfaceUnregisteredReason::INVALID_ENUM), - SOURCE_SDL); application_manager_.EndNaviServices(connection_key()); application_manager_.UnregisterApplication(connection_key(), mobile_apis::Result::SUCCESS); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_request.cc index 824d1150b3..3da9206184 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_request.cc @@ -112,9 +112,7 @@ void UpdateTurnListRequest::Run() { } } - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params = (*message_)[strings::msg_params]; + smart_objects::SmartObject msg_params = (*message_)[strings::msg_params]; if ((*message_)[strings::msg_params].keyExists(strings::turn_list)) { if (!CheckTurnListArray()) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc index e01165269a..4756c8b9a2 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc @@ -115,14 +115,6 @@ void SDLRPCPlugin::ProcessResumptionSubscription( application_manager::Application& app, WayPointsAppExtension& ext) { SDL_LOG_AUTO_TRACE(); - if (application_manager_->IsAnyAppSubscribedForWayPoints()) { - SDL_LOG_DEBUG( - "Subscription to waypoint already exist, no need to send " - "request to HMI"); - application_manager_->SubscribeAppForWayPoints(app.app_id()); - return; - } - pending_resumption_handler_->HandleResumptionSubscriptionRequest(ext, app); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc index 8b5d117f54..7aa6dd5273 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc @@ -36,6 +36,8 @@ namespace sdl_rpc_plugin { SDL_CREATE_LOG_VARIABLE("SdlRPCPlugin") +using hmi_apis::FunctionID::Navigation_SubscribeWayPoints; + WayPointsPendingResumptionHandler::WayPointsPendingResumptionHandler( application_manager::ApplicationManager& application_manager) : PendingResumptionHandler(application_manager) {} @@ -43,9 +45,10 @@ WayPointsPendingResumptionHandler::WayPointsPendingResumptionHandler( smart_objects::SmartObjectSPtr WayPointsPendingResumptionHandler::CreateSubscriptionRequest() { SDL_LOG_AUTO_TRACE(); + auto subscribe_waypoints_msg = application_manager::MessageHelper::CreateMessageForHMI( - hmi_apis::FunctionID::Navigation_SubscribeWayPoints, + Navigation_SubscribeWayPoints, application_manager_.GetNextHMICorrelationID()); (*subscribe_waypoints_msg)[application_manager::strings::params] [application_manager::strings::message_type] = @@ -53,40 +56,52 @@ WayPointsPendingResumptionHandler::CreateSubscriptionRequest() { return subscribe_waypoints_msg; } +void WayPointsPendingResumptionHandler::SendPendingHMIRequest( + PendingRequest& pending_request) { + SDL_LOG_AUTO_TRACE(); + using namespace application_manager; + + SDL_LOG_DEBUG("Sending request with function id: " + << Navigation_SubscribeWayPoints + << " and correlation_id: " << pending_request.corr_id_); + + auto request = MessageHelper::CreateMessageForHMI( + Navigation_SubscribeWayPoints, pending_request.corr_id_); + (*request)[strings::params][strings::message_type] = + hmi_apis::messageType::request; + subscribe_on_event(Navigation_SubscribeWayPoints, pending_request.corr_id_); + application_manager_.GetRPCService().ManageHMICommand(request); + pending_request.waiting_for_hmi_response_ = true; +} + void WayPointsPendingResumptionHandler::HandleResumptionSubscriptionRequest( application_manager::AppExtension& extension, application_manager::Application& app) { SDL_LOG_AUTO_TRACE(); - WayPointsAppExtension& ext = dynamic_cast<WayPointsAppExtension&>(extension); - smart_objects::SmartObjectSPtr request = CreateSubscriptionRequest(); - smart_objects::SmartObject& request_ref = *request; - const auto function_id = static_cast<hmi_apis::FunctionID::eType>( - request_ref[application_manager::strings::params] - [application_manager::strings::function_id] - .asInt()); - const uint32_t corr_id = - request_ref[application_manager::strings::params] - [application_manager::strings::correlation_id] - .asUInt(); + using namespace application_manager; + sync_primitives::AutoLock lock(pending_resumption_lock_); + UNUSED(extension); + + if (application_manager_.IsAnyAppSubscribedForWayPoints()) { + SDL_LOG_DEBUG( + "Subscription to waypoint already exist, no need to send " + "request to HMI"); + application_manager_.SubscribeAppForWayPoints(app.app_id()); + return; + } + const auto request = CreateSubscriptionRequest(); + const auto corr_id = + (*request)[strings::params][strings::correlation_id].asInt(); auto resumption_request = - MakeResumptionRequest(corr_id, function_id, *request); - app_ids_.push(app.app_id()); + MakeResumptionRequest(corr_id, Navigation_SubscribeWayPoints, *request); - if (pending_requests_.empty()) { - SDL_LOG_DEBUG("There are no pending requests for app_id: " << app.app_id()); - pending_requests_[corr_id] = request_ref; - subscribe_on_event(function_id, corr_id); - SDL_LOG_DEBUG("Sending request with function id: " - << function_id << " and correlation_id: " << corr_id); - - application_manager_.GetRPCService().ManageHMICommand(request); - } else { - SDL_LOG_DEBUG("There are pending requests. Frozen resumption for app id " - << app.app_id() << " corr id = " << corr_id); - ResumptionAwaitingHandling frozen_res{ - app.app_id(), ext, resumption_request}; - frozen_resumptions_.push_back(frozen_res); + PendingRequest pending_request(app.app_id(), corr_id); + pending_requests_.push_back(pending_request); + SDL_LOG_DEBUG("Add to pending resumptins corr_id = " << corr_id); + + if (pending_requests_.size() == 1) { + SendPendingHMIRequest(pending_requests_.front()); } resumption_data_processor().SubscribeToResponse(app.app_id(), resumption_request); @@ -94,42 +109,32 @@ void WayPointsPendingResumptionHandler::HandleResumptionSubscriptionRequest( void WayPointsPendingResumptionHandler::OnResumptionRevert() { SDL_LOG_AUTO_TRACE(); - using namespace application_manager; + sync_primitives::AutoLock lock(pending_resumption_lock_); - if (!pending_requests_.empty()) { - SDL_LOG_DEBUG("Still waiting for some response"); + if (pending_requests_.empty()) { + SDL_LOG_DEBUG("No pending resumptions"); return; } - if (!frozen_resumptions_.empty()) { - ResumptionAwaitingHandling frozen_resumption = frozen_resumptions_.back(); - frozen_resumptions_.pop_back(); - - auto request = std::make_shared<smart_objects::SmartObject>( - frozen_resumption.request_to_send_.message); - const uint32_t cid = - (*request)[strings::params][strings::correlation_id].asUInt(); - const auto fid = static_cast<hmi_apis::FunctionID::eType>( - (*request)[strings::params][strings::function_id].asInt()); - - SDL_LOG_DEBUG("Subscribing for event with function id: " - << fid << " correlation id: " << cid); - subscribe_on_event(fid, cid); - pending_requests_[cid] = *request; - SDL_LOG_DEBUG("Sending request with fid: " << fid << " and cid: " << cid); - application_manager_.GetRPCService().ManageHMICommand(request); + auto& pending_request = pending_requests_.front(); + if (pending_request.waiting_for_hmi_response_) { + SDL_LOG_DEBUG("Pending resumption for " + << pending_request.app_id_ + << " is already waiting for HMI response"); + return; } + SendPendingHMIRequest(pending_request); } void WayPointsPendingResumptionHandler::RaiseFakeSuccessfulResponse( - ns_smart_device_link::ns_smart_objects::SmartObject response, const int32_t corr_id) { using namespace application_manager; - response[strings::params][strings::correlation_id] = corr_id; - auto fid = static_cast<hmi_apis::FunctionID::eType>( - response[strings::params][strings::function_id].asInt()); - event_engine::Event event(fid); - event.set_smart_object(response); + + auto response = MessageHelper::CreateResponseMessageFromHmi( + Navigation_SubscribeWayPoints, corr_id, hmi_apis::Common_Result::SUCCESS); + + event_engine::Event event(Navigation_SubscribeWayPoints); + event.set_smart_object(*response); SDL_LOG_TRACE("Raise fake response for subscriber. corr_id : " << corr_id); event.raise(application_manager_.event_dispatcher()); @@ -139,6 +144,14 @@ void WayPointsPendingResumptionHandler::on_event( const application_manager::event_engine::Event& event) { using namespace application_manager; SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(pending_resumption_lock_); + + unsubscribe_from_event(Navigation_SubscribeWayPoints); + + if (pending_requests_.empty()) { + SDL_LOG_DEBUG("Not waiting for any response"); + return; + } const smart_objects::SmartObject& response = event.smart_object(); const uint32_t corr_id = event.smart_object_correlation_id(); @@ -146,64 +159,45 @@ void WayPointsPendingResumptionHandler::on_event( SDL_LOG_TRACE("Received event with function id: " << event.id() << " and correlation id: " << corr_id); - smart_objects::SmartObject pending_request; - if (pending_requests_.find(corr_id) == pending_requests_.end()) { - SDL_LOG_ERROR("corr id " << corr_id << " NOT found"); - return; - } - pending_request = pending_requests_[corr_id]; - pending_requests_.erase(corr_id); - if (app_ids_.empty()) { - SDL_LOG_ERROR("app_ids is empty"); - return; - } - uint32_t app_id = app_ids_.front(); - app_ids_.pop(); - auto app = application_manager_.application(app_id); + auto current_pending = pending_requests_.front(); + pending_requests_.pop_front(); + + auto app = application_manager_.application(current_pending.app_id_); if (!app) { - SDL_LOG_ERROR("Application not found " << app_id); + SDL_LOG_WARN("Application not found " << current_pending.app_id_); return; } if (resumption::IsResponseSuccessful(response)) { - SDL_LOG_DEBUG("Resumption of subscriptions is successful"); - + SDL_LOG_DEBUG("Resumption of waypoints is successful"); application_manager_.SubscribeAppForWayPoints(app); + } + ProcessNextPendingResumption(); +} - for (auto& frozen_resumption : frozen_resumptions_) { - auto corr_id = frozen_resumption.request_to_send_ - .message[strings::params][strings::correlation_id] - .asInt(); - RaiseFakeSuccessfulResponse(response, corr_id); - application_manager_.SubscribeAppForWayPoints(frozen_resumption.app_id); - } - frozen_resumptions_.clear(); - } else { - SDL_LOG_DEBUG("Resumption of subscriptions is NOT successful"); - - if (frozen_resumptions_.empty()) { - SDL_LOG_DEBUG("frozen resumptions list is empty"); - return; - } - - ResumptionAwaitingHandling frozen_resumption = frozen_resumptions_.back(); - frozen_resumptions_.pop_back(); - auto resumption_req = frozen_resumption.request_to_send_; - const uint32_t cid = - resumption_req.message[strings::params][strings::correlation_id] - .asInt(); - const hmi_apis::FunctionID::eType fid = - static_cast<hmi_apis::FunctionID::eType>( - resumption_req.message[strings::params][strings::function_id] - .asInt()); - subscribe_on_event(fid, cid); - auto request = - std::make_shared<smart_objects::SmartObject>(resumption_req.message); - SDL_LOG_DEBUG("Subscribing for event with function id: " - << fid << " correlation id: " << cid); - pending_requests_[cid] = *request; - SDL_LOG_DEBUG("Sending request with fid: " << fid << " and cid: " << cid); - application_manager_.GetRPCService().ManageHMICommand(request); +void WayPointsPendingResumptionHandler::ProcessNextPendingResumption() { + SDL_LOG_AUTO_TRACE(); + if (pending_requests_.empty()) { + SDL_LOG_DEBUG("No more pending resumptions"); + return; + } + auto& pending = pending_requests_.front(); + if (pending.waiting_for_hmi_response_) { + SDL_LOG_DEBUG("Request was already sent to HMI for " << pending.app_id_); + return; } + + if (!application_manager_.IsAnyAppSubscribedForWayPoints()) { + SendPendingHMIRequest(pending); + return; + } + + auto pending_copy = pending; + pending_requests_.pop_front(); + auto app = application_manager_.application(pending_copy.app_id_); + application_manager_.SubscribeAppForWayPoints(app); + RaiseFakeSuccessfulResponse(pending_copy.corr_id_); + ProcessNextPendingResumption(); } + } // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc index 30d125ff46..8cdce4fa74 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc @@ -69,8 +69,7 @@ namespace { const uint32_t kConnectionKey = 2u; const std::string ccpu_version("4.1.3.B_EB355B"); const std::string wers_country_code("WAEGB"); -const uint32_t lang_code = 0u; -const std::string kLanguage = ""; +const std::string lang_code("EN-US"); } // namespace class GetSystemInfoResponseTest @@ -99,15 +98,8 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) { ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg)); - std::string language; - EXPECT_CALL(mock_message_helper_, - CommonLanguageToString( - static_cast<hmi_apis::Common_Language::eType>(lang_code))) - .WillOnce(Return(language)); - EXPECT_EQ(kLanguage, language); - EXPECT_CALL(mock_policy_handler_, - OnGetSystemInfo(ccpu_version, wers_country_code, kLanguage)); + OnGetSystemInfo(ccpu_version, wers_country_code, lang_code)); command->Run(); } @@ -121,11 +113,6 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) { ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg)); - EXPECT_CALL(mock_message_helper_, - CommonLanguageToString( - static_cast<hmi_apis::Common_Language::eType>(lang_code))) - .Times(0); - EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities()); EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false)); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc index 20ca4d3dff..400481f506 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc @@ -256,8 +256,6 @@ class HMICommandsNotificationsTest ON_CALL(app_mngr_, application_by_hmi_app(_)).WillByDefault(Return(app_)); ON_CALL(*app_ptr_, app_id()).WillByDefault(Return(kAppId_)); ON_CALL(app_mngr_, application(kConnectionKey)).WillByDefault(Return(app_)); - ON_CALL(mock_message_helper_, MobileLanguageToString(kMobileLanguage)) - .WillByDefault(Return(kDefaultLanguage)); ON_CALL(app_mngr_, connection_handler()) .WillByDefault(ReturnRef(mock_connection_handler_)); } @@ -786,7 +784,6 @@ TEST_F(HMICommandsNotificationsTest, std::shared_ptr<Command> command = CreateCommand<OnSystemInfoChangedNotification>(message); - EXPECT_CALL(mock_message_helper_, CommonLanguageToString(_)); EXPECT_CALL(mock_policy_handler_, OnSystemInfoChanged(_)); command->Run(); } @@ -1031,14 +1028,12 @@ TEST_F(HMICommandsNotificationsTest, using ExitReason = hmi_apis::Common_ApplicationExitReason::eType; std::vector<ExitReason> reason_list = { ExitReason::UNAUTHORIZED_TRANSPORT_REGISTRATION, - ExitReason::UNSUPPORTED_HMI_RESOURCE, - ExitReason::RESOURCE_CONSTRAINT}; + ExitReason::UNSUPPORTED_HMI_RESOURCE}; using UnregisteredReason = mobile_apis::AppInterfaceUnregisteredReason::eType; std::vector<UnregisteredReason> mobile_reason_list = { UnregisteredReason::APP_UNAUTHORIZED, - UnregisteredReason::UNSUPPORTED_HMI_RESOURCE, - UnregisteredReason::RESOURCE_CONSTRAINT}; + UnregisteredReason::UNSUPPORTED_HMI_RESOURCE}; std::vector<mobile_apis::AppInterfaceUnregisteredReason::eType>::iterator it_mobile_reason = mobile_reason_list.begin(); @@ -1072,6 +1067,47 @@ TEST_F(HMICommandsNotificationsTest, } TEST_F(HMICommandsNotificationsTest, + OnExitApplicationNotificationResourceConstraintReason) { + auto message = CreateMessage(); + (*message)[am::strings::msg_params][am::strings::app_id] = kAppId_; + const auto notification = std::make_shared<smart_objects::SmartObject>(); + (*notification)[am::strings::params][am::strings::function_id] = + static_cast<int32_t>( + mobile_apis::FunctionID::OnAppInterfaceUnregisteredID); + (*notification)[am::strings::params][am::strings::message_type] = + static_cast<int32_t>(am::MessageType::kNotification); + (*notification)[am::strings::params][am::strings::connection_key] = kAppId_; + + using ExitReason = hmi_apis::Common_ApplicationExitReason::eType; + auto hmi_reason = ExitReason::RESOURCE_CONSTRAINT; + + using UnregisteredReason = mobile_apis::AppInterfaceUnregisteredReason::eType; + auto mobile_reason = UnregisteredReason::RESOURCE_CONSTRAINT; + + (*message)[am::strings::msg_params][am::strings::reason] = hmi_reason; + const auto command = CreateCommand<OnExitApplicationNotification>(message); + + (*notification)[am::strings::msg_params][am::strings::reason] = + static_cast<int32_t>(mobile_reason); + + am::plugin_manager::MockRPCPluginManager mock_rpc_plugin_manager_; + EXPECT_CALL(app_mngr_, GetPluginManager()) + .WillRepeatedly(ReturnRef(mock_rpc_plugin_manager_)); + + EXPECT_CALL(app_mngr_, application(kAppId_)).WillRepeatedly(Return(app_)); + EXPECT_CALL( + mock_message_helper_, + GetOnAppInterfaceUnregisteredNotificationToMobile(kAppId_, mobile_reason)) + .WillOnce(Return(notification)); + EXPECT_CALL(mock_rpc_service_, + ManageMobileCommand(notification, Command::SOURCE_SDL)); + EXPECT_CALL(app_mngr_, UnregisterApplication(_, _, _, _)).Times(0); + + ASSERT_TRUE(command->Init()); + command->Run(); +} + +TEST_F(HMICommandsNotificationsTest, OnExitApplicationNotificationUnhandledReason) { MessageSharedPtr message = CreateMessage(); (*message)[am::strings::msg_params][am::strings::app_id] = kAppId_; @@ -1842,7 +1878,7 @@ TEST_F(HMICommandsNotificationsTest, OnDriverDistractionNotificationEmptyData) { ON_CALL(mock_policy_handler_, LockScreenDismissalEnabledState()) .WillByDefault(Return(OptionalBool(true))); - std::string required_language = "en-us"; + std::string required_language = "EN-US"; ON_CALL(mock_policy_handler_, LockScreenDismissalWarningMessage(required_language)) .WillByDefault(Return( @@ -1872,7 +1908,7 @@ TEST_F(HMICommandsNotificationsTest, typedef boost::optional<bool> OptionalBool; ON_CALL(mock_policy_handler_, LockScreenDismissalEnabledState()) .WillByDefault(Return(OptionalBool(true))); - std::string required_language = "en-us"; + std::string required_language = "EN-US"; ON_CALL(mock_policy_handler_, LockScreenDismissalWarningMessage(required_language)) .WillByDefault(Return( @@ -1900,7 +1936,9 @@ TEST_F(HMICommandsNotificationsTest, OnDriverDistractionNotificationValidApp) { typedef boost::optional<bool> OptionalBool; ON_CALL(mock_policy_handler_, LockScreenDismissalEnabledState()) .WillByDefault(Return(OptionalBool(true))); - std::string required_language = "en-us"; + std::string required_language = "EN-US"; + ON_CALL(*app_ptr_, ui_language()).WillByDefault(ReturnRef(kMobileLanguage)); + ON_CALL(mock_policy_handler_, LockScreenDismissalWarningMessage(required_language)) .WillByDefault(Return( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/navi_set_video_config_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/navi_set_video_config_request_test.cc index d6ef540bc0..7ce3a353e9 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/navi_set_video_config_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/navi_set_video_config_request_test.cc @@ -101,11 +101,9 @@ TEST_F(NaviSetVideoConfigRequestTest, OnEventWithSuccessResponse) { Event event(kEventID); event.set_smart_object(*event_msg); - std::vector<std::string> empty; - EXPECT_CALL( - app_mngr_, - OnStreamingConfigured( - kAppId, protocol_handler::ServiceType::kMobileNav, true, empty)) + EXPECT_CALL(app_mngr_, + OnStreamingConfigurationSuccessful( + kAppId, protocol_handler::ServiceType::kMobileNav)) .Times(1); command->on_event(event); @@ -151,10 +149,9 @@ TEST_F(NaviSetVideoConfigRequestTest, OnEventWithRejectedResponse) { event.set_smart_object(*event_msg); std::vector<std::string> rejected_params; - EXPECT_CALL(app_mngr_, - OnStreamingConfigured( - kAppId, protocol_handler::ServiceType::kMobileNav, false, _)) - .WillOnce(SaveArg<3>(&rejected_params)); + std::string reason("Received SetVideoConfig failure response"); + EXPECT_CALL(app_mngr_, OnStreamingConfigurationFailed(kAppId, _, reason)) + .WillOnce(SaveArg<1>(&rejected_params)); command->on_event(event); @@ -181,10 +178,8 @@ TEST_F(NaviSetVideoConfigRequestTest, event.set_smart_object(*event_msg); std::vector<std::string> empty; - EXPECT_CALL( - app_mngr_, - OnStreamingConfigured( - kAppId, protocol_handler::ServiceType::kMobileNav, false, empty)) + std::string reason("Received SetVideoConfig failure response"); + EXPECT_CALL(app_mngr_, OnStreamingConfigurationFailed(kAppId, empty, reason)) .WillOnce(Return()); command->on_event(event); @@ -198,10 +193,8 @@ TEST_F(NaviSetVideoConfigRequestTest, OnTimeout) { CreateCommand<NaviSetVideoConfigRequest>(request_msg); std::vector<std::string> empty; - EXPECT_CALL( - app_mngr_, - OnStreamingConfigured( - kAppId, protocol_handler::ServiceType::kMobileNav, false, empty)) + std::string reason("Timed out while waiting for SetVideoConfig response"); + EXPECT_CALL(app_mngr_, OnStreamingConfigurationFailed(kAppId, empty, reason)) .WillOnce(Return()); EXPECT_CALL(app_mngr_, TerminateRequest(_, _, _)).Times(1); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_driver_distraction_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_driver_distraction_notification_test.cc index fe6ba7c4e3..642b4e651d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_driver_distraction_notification_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_driver_distraction_notification_test.cc @@ -95,8 +95,6 @@ class HMIOnDriverDistractionNotificationTest .WillByDefault(ReturnRef(kMobileLanguage)); ON_CALL(app_mngr_, application(kConnectionKey)) .WillByDefault(Return(mock_app_)); - ON_CALL(mock_message_helper_, MobileLanguageToString(kMobileLanguage)) - .WillByDefault(Return(kDefaultLanguage)); } MockAppPtr mock_app_; @@ -327,8 +325,6 @@ TEST_F(HMIOnDriverDistractionNotificationTest, mobile_apis::Language::FR_FR; std::string required_language = "FR-FR"; ON_CALL(*mock_app_, ui_language()).WillByDefault(ReturnRef(mobile_language)); - ON_CALL(mock_message_helper_, MobileLanguageToString(mobile_language)) - .WillByDefault(Return(required_language)); policy::CheckPermissionResult result; result.hmi_level_permitted = policy::kRpcAllowed; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc index 93344f1a0d..31285f5b17 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc @@ -40,6 +40,7 @@ #include "application_manager/mock_message_helper.h" #include "application_manager/mock_state_controller.h" #include "application_manager/policies/mock_policy_handler_interface.h" +#include "application_manager/postponed_activation_controller.h" #include "connection_handler/mock_connection_handler.h" #include "gtest/gtest.h" #include "hmi/sdl_activate_app_request.h" @@ -139,13 +140,20 @@ TEST_F(SDLActivateAppRequestTest, Run_ActivateApp_SUCCESS) { std::shared_ptr<SDLActivateAppRequest> command( CreateCommand<SDLActivateAppRequest>(msg)); + MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, WaitingApplicationByID(kAppID)) - .WillOnce(Return(ApplicationSharedPtr())); - EXPECT_CALL(app_mngr_, state_controller()) - .WillOnce(ReturnRef(mock_state_controller_)); + .WillOnce(Return(mock_app)); + ON_CALL(app_mngr_, state_controller()) + .WillByDefault(ReturnRef(mock_state_controller_)); EXPECT_CALL(mock_state_controller_, IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); + am::HmiStatePtr state = std::make_shared<am::HmiState>(mock_app, app_mngr_); + state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); + + EXPECT_CALL(*mock_app, + CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) + .WillOnce(Return(state)); EXPECT_CALL(mock_policy_handler_, OnActivateApp(kAppID, kCorrelationID)); @@ -303,7 +311,7 @@ TEST_F(SDLActivateAppRequestTest, FirstAppActive_SUCCESS) { command->Run(); } -TEST_F(SDLActivateAppRequestTest, FirstAppNotActive_SUCCESS) { +TEST_F(SDLActivateAppRequestTest, FirstAppNotActiveNONE_SUCCESS) { MessageSharedPtr msg = CreateMessage(); SetCorrelationAndAppID(msg); @@ -312,12 +320,18 @@ TEST_F(SDLActivateAppRequestTest, FirstAppNotActive_SUCCESS) { MockAppPtr mock_app(CreateMockApp()); ON_CALL(app_mngr_, application(kAppID)).WillByDefault(Return(mock_app)); - EXPECT_CALL(app_mngr_, state_controller()) - .WillOnce(ReturnRef(mock_state_controller_)); + ON_CALL(app_mngr_, state_controller()) + .WillByDefault(ReturnRef(mock_state_controller_)); EXPECT_CALL(mock_state_controller_, IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(true)); + am::HmiStatePtr state = std::make_shared<am::HmiState>(mock_app, app_mngr_); + state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); + + EXPECT_CALL(*mock_app, + CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) + .WillOnce(Return(state)); EXPECT_CALL(mock_policy_handler_, OnActivateApp(kAppID, kCorrelationID)); @@ -542,6 +556,10 @@ TEST_F(SDLActivateAppRequestTest, OnEvent_SUCCESS) { MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application_by_hmi_app(_)).WillOnce(Return(mock_app)); + + auto hmi_state = std::make_shared<am::HmiState>(mock_app, app_mngr_); + hmi_state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); + EXPECT_CALL(*mock_app, CurrentHmiState(_)).WillOnce(Return(hmi_state)); EXPECT_CALL(*mock_app, app_id()).WillOnce(Return(kAppID)); EXPECT_CALL(mock_policy_handler_, OnActivateApp(kAppID, kCorrelationID)); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_get_user_friendly_message_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_get_user_friendly_message_request_test.cc index 0e87acef1f..d457b2a697 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_get_user_friendly_message_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_get_user_friendly_message_request_test.cc @@ -62,8 +62,8 @@ using testing::ReturnRef; namespace { const uint32_t kCorrelationID = 1u; const uint32_t kAppID = 2u; -const std::string kLanguageDe = "de-de"; -const std::string kLanguageEn = "en-gb"; +const std::string kLanguageDe = "DE-DE"; +const std::string kLanguageEn = "EN-GB"; const std::string kMessageCodes = "messageCodes"; const hmi_apis::Common_Language::eType kLanguage = hmi_apis::Common_Language::EN_GB; @@ -102,8 +102,6 @@ TEST_F(SDLGetUserFriendlyMessageRequestTest, Run_LanguageSet_SUCCESS) { std::shared_ptr<SDLGetUserFriendlyMessageRequest> command( CreateCommand<SDLGetUserFriendlyMessageRequest>(msg)); - EXPECT_CALL(mock_message_helper_, CommonLanguageToString(kLanguage)) - .WillOnce(Return(kLanguageEn)); std::vector<std::string> msg_codes; msg_codes.push_back(kLanguageDe); msg_codes.push_back(kLanguageEn); @@ -129,8 +127,6 @@ TEST_F(SDLGetUserFriendlyMessageRequestTest, Run_LanguageNotSet_SUCCESS) { EXPECT_CALL(mock_hmi_capabilities_, active_ui_language()) .WillOnce(Return(kLanguage)); - EXPECT_CALL(mock_message_helper_, CommonLanguageToString(kLanguage)) - .WillOnce(Return(kLanguageEn)); std::vector<std::string> msg_codes; msg_codes.push_back(kLanguageDe); msg_codes.push_back(kLanguageEn); @@ -149,7 +145,6 @@ TEST_F(SDLGetUserFriendlyMessageRequestTest, Run_NoMsgCodes_Canceled) { std::shared_ptr<SDLGetUserFriendlyMessageRequest> command( CreateCommand<SDLGetUserFriendlyMessageRequest>(msg)); - EXPECT_CALL(mock_message_helper_, CommonLanguageToString(_)).Times(0); EXPECT_CALL(mock_policy_handler_, OnGetUserFriendlyMessage(_, _, _)).Times(0); command->Init(); @@ -181,7 +176,6 @@ TEST_F( std::shared_ptr<SDLGetUserFriendlyMessageRequest> command( CreateCommand<SDLGetUserFriendlyMessageRequest>(msg)); - EXPECT_CALL(mock_message_helper_, CommonLanguageToString(_)).Times(0); EXPECT_CALL(mock_policy_handler_, OnGetUserFriendlyMessage(_, _, _)).Times(0); command->Init(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_sub_menu_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_sub_menu_request_test.cc index a88a1ade69..23e4418726 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_sub_menu_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_sub_menu_request_test.cc @@ -104,6 +104,31 @@ TEST_F(AddSubMenuRequestTest, Run_ImageVerificationFailed_EXPECT_INVALID_DATA) { request_ptr->Run(); } +TEST_F(AddSubMenuRequestTest, Run_NonExistentParentID_EXPECT_INVALID_ID) { + const uint32_t menu_id = 10; + const uint32_t parent_id = 4; + MessageSharedPtr msg = CreateMsgParams(); + SmartObject& msg_params = (*msg)[am::strings::msg_params]; + + msg_params[am::strings::menu_id] = menu_id; + msg_params[am::strings::menu_name] = "test"; + msg_params[am::strings::parent_id] = parent_id; + + SmartObject sub_menu(smart_objects::SmartType_Null); + EXPECT_CALL(*mock_app, FindSubMenu(menu_id)).WillOnce(Return(sub_menu)); + + SmartObject parent(smart_objects::SmartType_Null); + EXPECT_CALL(*mock_app, FindSubMenu(parent_id)).WillOnce(Return(parent)); + + EXPECT_CALL(mock_rpc_service_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_ID), _)); + std::shared_ptr<AddSubMenuRequest> request_ptr = + CreateCommand<AddSubMenuRequest>(msg); + + request_ptr->Run(); +} + TEST_F(AddSubMenuRequestTest, OnEvent_UI_UNSUPPORTED_RESOURCE) { const uint32_t menu_id = 10u; MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc index 33771f6c3d..fab648fc95 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc @@ -217,6 +217,8 @@ class RegisterAppInterfaceRequestTest .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(mock_hmi_capabilities_, display_capabilities()) .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, seat_location_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(mock_hmi_capabilities_, audio_pass_thru_capabilities()) .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(mock_hmi_capabilities_, vehicle_type()) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unregister_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unregister_app_interface_request_test.cc index f244acb8d6..d7dcbdfa9d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unregister_app_interface_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unregister_app_interface_request_test.cc @@ -85,20 +85,9 @@ TEST_F(UnregisterAppInterfaceRequestTest, Run_SUCCESS) { MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillRepeatedly(Return(mock_app)); - - const mobile_apis::AppInterfaceUnregisteredReason::eType kUnregisterReason = - mobile_apis::AppInterfaceUnregisteredReason::INVALID_ENUM; - - MessageSharedPtr dummy_msg(CreateMessage()); - EXPECT_CALL(mock_message_helper_, - GetOnAppInterfaceUnregisteredNotificationToMobile( - kConnectionKey, kUnregisterReason)) - .WillOnce(Return(dummy_msg)); { ::testing::InSequence sequence; - EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(dummy_msg, _)); - EXPECT_CALL(app_mngr_, UnregisterApplication( kConnectionKey, mobile_apis::Result::SUCCESS, _, _)); diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h index 5b597cfcab..1910a9efdf 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h @@ -42,7 +42,8 @@ class VehicleInfoAppExtension; namespace app_mngr = application_manager; namespace plugins = application_manager::plugin_manager; -enum SubscribeStatus { SUBSCRIBE, UNSUBSCRIBE }; +bool IsSubscribedAppExist(const std::string& ivi, + const app_mngr::ApplicationManager& app_manager); class VehicleInfoPlugin : public plugins::RPCPlugin { public: @@ -96,7 +97,6 @@ class VehicleInfoPlugin : public plugins::RPCPlugin { const std::set<std::string>& list_of_subscriptions); private: - bool IsSubscribedAppExist(const std::string& ivi); bool IsAnyPendingSubscriptionExist(const std::string& ivi); void UnsubscribeFromRemovedVDItems(); smart_objects::SmartObjectSPtr GetUnsubscribeIVIRequest( diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc index d51790ea55..9e35e96ce3 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc @@ -261,7 +261,7 @@ void SubscribeVehicleDataRequest::AddAlreadySubscribedVI( struct SubscribedToIVIPredicate { std::string vehicle_info_; - SubscribedToIVIPredicate(std::string vehicle_info) + explicit SubscribedToIVIPredicate(const std::string& vehicle_info) : vehicle_info_(vehicle_info) {} bool operator()(const ApplicationSharedPtr app) const { DCHECK_OR_RETURN(app, false); @@ -393,6 +393,7 @@ void SubscribeVehicleDataRequest::CheckVISubscriptions( return; } + // cppcheck-suppress knownConditionTrueFalse if (0 == subscribed_items && is_interface_available) { out_result_code = mobile_apis::Result::IGNORED; out_info = "Already subscribed on provided VehicleData."; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc index b85fd5aaaf..af9d605ff0 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc @@ -161,7 +161,7 @@ smart_objects::SmartObject CustomVehicleDataManagerImpl::CreateHMIMessageParams( const policy_table::VehicleDataItem&)> ParamsConstructor; - auto fill_param = [](ParamsConstructor& constructor, + auto fill_param = [](const ParamsConstructor& constructor, const policy_table::VehicleDataItem& param, smart_objects::SmartObject* out_params) { DCHECK_OR_RETURN_VOID(out_params) @@ -354,12 +354,14 @@ void CustomVehicleDataManagerImpl::UpdateVehicleDataItems() { }; auto get_vehicle_data_history = - [&vehicle_data_items](std::string name) -> std::vector<VehicleDataItem> { + [&vehicle_data_items]( + const std::string& name) -> std::vector<VehicleDataItem> { std::vector<VehicleDataItem> result; - std::copy_if(vehicle_data_items.begin(), - vehicle_data_items.end(), - std::back_inserter(result), - [&name](VehicleDataItem& item) { return item.name == name; }); + std::copy_if( + vehicle_data_items.begin(), + vehicle_data_items.end(), + std::back_inserter(result), + [&name](const VehicleDataItem& item) { return item.name == name; }); std::sort(result.begin(), result.end(), diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc index b4ae7aca45..dce0a41183 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_data_item_schema.cc @@ -117,16 +117,21 @@ smart_objects::ISchemaItemPtr VehicleDataItemSchema::GetPODTypeSchema( using FloatItemParam = smart_objects::TSchemaItemParameter<double>; using StringSchemaItem = smart_objects::CStringSchemaItem; using StringItemParam = smart_objects::TSchemaItemParameter<size_t>; + using StringItemValueParam = smart_objects::TSchemaItemParameter<std::string>; using BoolSchemaItem = smart_objects::CBoolSchemaItem; using BoolItemParam = smart_objects::TSchemaItemParameter<bool>; if (policy_item.type == policy_table::VehicleDataItem::kInteger) { - return IntSchemaItem::create(policy_item.minvalue.is_initialized() - ? IntItemParam(*policy_item.minvalue) - : IntItemParam(), - policy_item.maxvalue.is_initialized() - ? IntItemParam(*policy_item.maxvalue) - : IntItemParam()); + return IntSchemaItem::create( + policy_item.minvalue.is_initialized() + ? IntItemParam(*policy_item.minvalue) + : IntItemParam(), + policy_item.maxvalue.is_initialized() + ? IntItemParam(*policy_item.maxvalue) + : IntItemParam(), + policy_item.defvalue.is_initialized() + ? IntItemParam(std::stol(*policy_item.defvalue)) + : IntItemParam()); } if (policy_item.type == policy_table::VehicleDataItem::kFloat || policy_item.type == policy_table::VehicleDataItem::kDouble) { @@ -136,6 +141,9 @@ smart_objects::ISchemaItemPtr VehicleDataItemSchema::GetPODTypeSchema( : FloatItemParam(), policy_item.maxvalue.is_initialized() ? FloatItemParam(double(*policy_item.maxvalue)) + : FloatItemParam(), + policy_item.defvalue.is_initialized() + ? FloatItemParam(std::stod(*policy_item.defvalue)) : FloatItemParam()); } if (policy_item.type == policy_table::VehicleDataItem::kString) { @@ -145,10 +153,16 @@ smart_objects::ISchemaItemPtr VehicleDataItemSchema::GetPODTypeSchema( : 0), policy_item.maxlength.is_initialized() ? StringItemParam(*policy_item.maxlength) - : StringItemParam()); + : StringItemParam(), + policy_item.defvalue.is_initialized() + ? StringItemValueParam(std::string(*policy_item.defvalue)) + : StringItemValueParam()); } if (policy_item.type == policy_table::VehicleDataItem::kBoolean) { - return BoolSchemaItem::create(BoolItemParam(true)); + return BoolSchemaItem::create( + policy_item.defvalue.is_initialized() + ? BoolItemParam(*policy_item.defvalue == "true") + : BoolItemParam()); } std::string error_msg = std::string("Invalid POD type provided: ") + diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_hmi_command_factory.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_hmi_command_factory.cc index 3687245066..131b5304c4 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_hmi_command_factory.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_hmi_command_factory.cc @@ -60,7 +60,7 @@ namespace strings = app_mngr::strings; template <typename VehicleInfoCommandType> class VehicleInfoCommandCreator : public application_manager::CommandCreator { public: - VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) + explicit VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) : params_(params) {} private: @@ -85,7 +85,8 @@ template <> class VehicleInfoCommandCreator<VehicleInfoInvalidCommand> : public application_manager::CommandCreator { public: - VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) { + // cppcheck-suppress unusedFunction //Used in VehicleInfoCommandCreatorFactory + explicit VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) { UNUSED(params); } @@ -103,7 +104,8 @@ class VehicleInfoCommandCreator<VehicleInfoInvalidCommand> }; struct VehicleInfoCommandCreatorFactory { - VehicleInfoCommandCreatorFactory(const VehicleInfoCommandParams& params) + explicit VehicleInfoCommandCreatorFactory( + const VehicleInfoCommandParams& params) : params_(params) {} template <typename VehicleInfoCommandType> diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_mobile_command_factory.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_mobile_command_factory.cc index b2d7df5d28..77cb5e71d7 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_mobile_command_factory.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_mobile_command_factory.cc @@ -60,7 +60,7 @@ namespace strings = app_mngr::strings; template <typename VehicleInfoCommandType> class VehicleInfoCommandCreator : public application_manager::CommandCreator { public: - VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) + explicit VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) : params_(params) {} private: @@ -85,7 +85,7 @@ template <> class VehicleInfoCommandCreator<VehicleInfoInvalidCommand> : public application_manager::CommandCreator { public: - VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) { + explicit VehicleInfoCommandCreator(const VehicleInfoCommandParams& params) { UNUSED(params); } @@ -103,7 +103,8 @@ class VehicleInfoCommandCreator<VehicleInfoInvalidCommand> }; struct VehicleInfoCommandCreatorFactory { - VehicleInfoCommandCreatorFactory(const VehicleInfoCommandParams& params) + explicit VehicleInfoCommandCreatorFactory( + const VehicleInfoCommandParams& params) : params_(params) {} template <typename VehicleInfoCommandType> diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc index bb71ea26b1..6721d93658 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc @@ -38,6 +38,7 @@ #include "application_manager/resumption/resumption_data_processor.h" #include "utils/helpers.h" #include "vehicle_info_plugin/custom_vehicle_data_manager.h" +#include "vehicle_info_plugin/vehicle_info_plugin.h" namespace vehicle_info_plugin { SDL_CREATE_LOG_VARIABLE("VehicleInfoPlugin") @@ -209,6 +210,7 @@ void VehicleInfoPendingResumptionHandler::on_event( SDL_LOG_AUTO_TRACE(); sync_primitives::AutoLock lock(pending_resumption_lock_); using namespace application_manager; + if (pending_requests_.empty()) { SDL_LOG_DEBUG("Not waiting for any response"); return; @@ -270,7 +272,17 @@ void VehicleInfoPendingResumptionHandler::HandleResumptionSubscriptionRequest( SDL_LOG_TRACE("app id " << app.app_id()); auto& ext = dynamic_cast<VehicleInfoAppExtension&>(extension); - const auto subscriptions = ext.PendingSubscriptions().GetData(); + auto subscriptions = ext.PendingSubscriptions().GetData(); + for (auto ivi = subscriptions.begin(); ivi != subscriptions.end();) { + if (IsSubscribedAppExist(*ivi, application_manager_)) { + ext.RemovePendingSubscription(*ivi); + ext.subscribeToVehicleInfo(*ivi); + subscriptions.erase(ivi++); + } else { + ++ivi; + } + } + if (subscriptions.empty()) { SDL_LOG_DEBUG("Subscriptions is empty"); return; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc index 718814b201..1a357a86ee 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc @@ -48,6 +48,21 @@ namespace strings = application_manager::strings; namespace plugins = application_manager::plugin_manager; namespace commands = application_manager::commands; +bool IsSubscribedAppExist( + const std::string& ivi, + const application_manager::ApplicationManager& app_manager) { + SDL_LOG_AUTO_TRACE(); + auto apps_accessor = app_manager.applications(); + + for (auto& app : apps_accessor.GetData()) { + auto& ext = VehicleInfoAppExtension::ExtractVIExtension(*app); + if (ext.isSubscribedToVehicleInfo(ivi)) { + return true; + } + } + return false; +} + VehicleInfoPlugin::VehicleInfoPlugin() : application_manager_(nullptr), pending_resumption_handler_(nullptr) {} @@ -164,13 +179,6 @@ void VehicleInfoPlugin::ProcessResumptionSubscription( application_manager::Application& app, VehicleInfoAppExtension& ext) { SDL_LOG_AUTO_TRACE(); - auto pending = ext.PendingSubscriptions().GetData(); - for (const auto& ivi : pending) { - if (IsSubscribedAppExist(ivi)) { - ext.RemovePendingSubscription(ivi); - ext.subscribeToVehicleInfo(ivi); - } - } pending_resumption_handler_->HandleResumptionSubscriptionRequest(ext, app); } @@ -181,10 +189,9 @@ void VehicleInfoPlugin::RevertResumption( UNUSED(app); pending_resumption_handler_->OnResumptionRevert(); - std::set<std::string> subscriptions_to_revert; for (auto& ivi_data : list_of_subscriptions) { - if (!IsSubscribedAppExist(ivi_data) && + if (!IsSubscribedAppExist(ivi_data, *application_manager_) && !IsAnyPendingSubscriptionExist(ivi_data)) { subscriptions_to_revert.insert(ivi_data); } @@ -230,19 +237,6 @@ smart_objects::SmartObjectSPtr VehicleInfoPlugin::CreateUnsubscriptionRequest( return request; } -bool VehicleInfoPlugin::IsSubscribedAppExist(const std::string& ivi) { - SDL_LOG_AUTO_TRACE(); - auto apps_accessor = application_manager_->applications(); - - for (auto& app : apps_accessor.GetData()) { - auto& ext = VehicleInfoAppExtension::ExtractVIExtension(*app); - if (ext.isSubscribedToVehicleInfo(ivi)) { - return true; - } - } - return false; -} - bool VehicleInfoPlugin::IsAnyPendingSubscriptionExist(const std::string& ivi) { SDL_LOG_AUTO_TRACE(); auto apps_accessor = application_manager_->applications(); diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc index 2443310409..262fef39f6 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_data_item_schema_test.cc @@ -85,6 +85,7 @@ class VehicleDataItemSchemaTest : public ::testing::Test { schema.params->mark_initialized(); schema.mandatory = true; *schema.array = false; + *schema.defvalue = "10"; // default value bounds *schema.minvalue = 10; *schema.maxvalue = 100; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_info_pending_resumption_test.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_info_pending_resumption_test.cc index c2af7236f8..5b2f4d5e25 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_info_pending_resumption_test.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/vehicle_info_pending_resumption_test.cc @@ -48,6 +48,7 @@ using namespace vehicle_info_plugin; using ::testing::_; using ::testing::DoAll; +using ::testing::Mock; using ::testing::NiceMock; using ::testing::Return; using ::testing::ReturnRef; @@ -226,8 +227,10 @@ class VehicleInfoPendingResumptionHandlerTest : public ::testing::Test { VehicleInfoPendingResumptionHandlerTest() : mock_message_helper_( *application_manager::MockMessageHelper::message_helper_mock()) - - {} + , applications_lock_(std::make_shared<sync_primitives::Lock>()) + , applications_(application_set_, applications_lock_) { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + } void SetUp() OVERRIDE { ON_CALL(app_manager_mock_, event_dispatcher()) @@ -238,6 +241,8 @@ class VehicleInfoPendingResumptionHandlerTest : public ::testing::Test { .WillByDefault(ReturnRef(resume_ctrl_mock_)); ON_CALL(resume_ctrl_mock_, resumption_data_processor()) .WillByDefault(ReturnRef(resumption_data_processor_mock_)); + EXPECT_CALL(app_manager_mock_, applications()) + .WillRepeatedly(Return(applications_)); resumption_handler_.reset( new vehicle_info_plugin::VehicleInfoPendingResumptionHandler( @@ -245,6 +250,11 @@ class VehicleInfoPendingResumptionHandlerTest : public ::testing::Test { MessageHelperResponseCreateExpectation(); } + ~VehicleInfoPendingResumptionHandlerTest() { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + Mock::VerifyAndClearExpectations(&app_manager_mock_); + } + void MessageHelperResponseCreateExpectation() { const int default_corr_id = 0; static auto response = CreateHMIResponseMessage( @@ -277,12 +287,15 @@ class VehicleInfoPendingResumptionHandlerTest : public ::testing::Test { MockMessageHelper& mock_message_helper_; MockApplicationManager app_manager_mock_; - MockResumeCtrl resume_ctrl_mock_; + NiceMock<MockResumeCtrl> resume_ctrl_mock_; MockResumptionDataProcessor resumption_data_processor_mock_; MockEventDispatcher event_dispatcher_mock_; MockRPCService mock_rpc_service_; NiceMock<MockCustomVehicleDataManager> custom_vehicle_data_manager_mock_; vehicle_info_plugin::VehicleInfoPlugin plugin_; + application_manager::ApplicationSet application_set_; + std::shared_ptr<sync_primitives::Lock> applications_lock_; + DataAccessor<application_manager::ApplicationSet> applications_; std::unique_ptr<vehicle_info_plugin::VehicleInfoPendingResumptionHandler> resumption_handler_; @@ -300,6 +313,8 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, NoSubscriptionNoAction) { TEST_F(VehicleInfoPendingResumptionHandlerTest, OneAppSeveralVehicleDataSuccess) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto ext = CreateExtension(*mock_app); ext->AddPendingSubscription("gps"); ext->AddPendingSubscription("speed"); @@ -327,6 +342,8 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TEST_F(VehicleInfoPendingResumptionHandlerTest, OneAppSeveralVehicleDataResponseSuccess) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto ext = CreateExtension(*mock_app); ext->AddPendingSubscription("gps"); ext->AddPendingSubscription("speed"); @@ -372,6 +389,8 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TEST_F(VehicleInfoPendingResumptionHandlerTest, OneAppSeveralVehicleDataResponseOneFailed) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto ext = CreateExtension(*mock_app); ext->AddPendingSubscription("gps"); ext->AddPendingSubscription("speed"); @@ -417,6 +436,8 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TEST_F(VehicleInfoPendingResumptionHandlerTest, OneAppSeveralVehicleDataResponseAllFailed) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto ext = CreateExtension(*mock_app); ext->AddPendingSubscription("gps"); ext->AddPendingSubscription("speed"); @@ -457,6 +478,8 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TEST_F(VehicleInfoPendingResumptionHandlerTest, OneAppSeveralVehicleDataResponseOveralResultFailed) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto ext = CreateExtension(*mock_app); ext->AddPendingSubscription("gps"); ext->AddPendingSubscription("speed"); @@ -491,7 +514,11 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TEST_F(VehicleInfoPendingResumptionHandlerTest, TwoAppsOneSharedDataSuccess) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto mock_app2 = CreateApp(2); + application_set_.insert(mock_app2); + auto ext = CreateExtension(*mock_app); auto ext2 = CreateExtension(*mock_app2); ext->AddPendingSubscription("gps"); @@ -533,7 +560,11 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TwoAppsOneSharedDataSuccess) { TEST_F(VehicleInfoPendingResumptionHandlerTest, TwoAppsMultipleSharedDataSuccessResumption) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto mock_app2 = CreateApp(2); + application_set_.insert(mock_app2); + auto ext = CreateExtension(*mock_app); auto ext2 = CreateExtension(*mock_app2); ext->AddPendingSubscription("gps"); @@ -580,7 +611,11 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, TEST_F(VehicleInfoPendingResumptionHandlerTest, TwoAppsOneSharedDataFailRetryforSecondApp) { auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + auto mock_app2 = CreateApp(2); + application_set_.insert(mock_app2); + auto ext = CreateExtension(*mock_app); auto ext2 = CreateExtension(*mock_app2); ext->AddPendingSubscription("gps"); @@ -633,4 +668,29 @@ TEST_F(VehicleInfoPendingResumptionHandlerTest, EXPECT_EQ(ext2->PendingSubscriptions().GetData().size(), 0u); } +TEST_F(VehicleInfoPendingResumptionHandlerTest, + TwoAppsOneSharedDataAlreadySubscribedByFirstAppNoRetryforSecondApp) { + auto mock_app = CreateApp(1); + application_set_.insert(mock_app); + + auto mock_app2 = CreateApp(2); + application_set_.insert(mock_app2); + + auto ext = CreateExtension(*mock_app); + auto ext2 = CreateExtension(*mock_app2); + + ext->subscribeToVehicleInfo("gps"); + ext2->AddPendingSubscription("gps"); + + EXPECT_CALL(resumption_data_processor_mock_, SubscribeToResponse(_, _)) + .Times(0); + EXPECT_CALL(event_dispatcher_mock_, raise_event(_)).Times(0); + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).Times(0); + + resumption_handler_->HandleResumptionSubscriptionRequest(*ext2, *mock_app2); + + EXPECT_TRUE(ext->isSubscribedToVehicleInfo("gps")); + EXPECT_TRUE(ext2->isSubscribedToVehicleInfo("gps")); + EXPECT_EQ(ext2->PendingSubscriptions().GetData().size(), 0u); +} } // namespace vehicle_info_plugin_test diff --git a/src/components/application_manager/src/app_launch/app_launch_data_db.cc b/src/components/application_manager/src/app_launch/app_launch_data_db.cc index 7c015b0707..c9357a0ec5 100644 --- a/src/components/application_manager/src/app_launch/app_launch_data_db.cc +++ b/src/components/application_manager/src/app_launch/app_launch_data_db.cc @@ -278,10 +278,9 @@ std::vector<ApplicationDataPtr> AppLaunchDataDB::GetAppDataByDevMac( bool AppLaunchDataDB::Clear() { SDL_LOG_AUTO_TRACE(); - bool retVal = false; utils::dbms::SQLQuery query(db()); - retVal = query.Exec(kDropSchema); + bool retVal = query.Exec(kDropSchema); if (retVal) { SDL_LOG_INFO("App_Launch table had been cleared successfully"); diff --git a/src/components/application_manager/src/app_launch/apps_launcher.cc b/src/components/application_manager/src/app_launch/apps_launcher.cc index bf1fa2fb5d..1ee7bffb2a 100644 --- a/src/components/application_manager/src/app_launch/apps_launcher.cc +++ b/src/components/application_manager/src/app_launch/apps_launcher.cc @@ -56,7 +56,8 @@ void AppsLauncher::StartLaunching(ApplicationDataPtr app_data) { } struct AppLauncherFinder { - AppLauncherFinder(const ApplicationDataPtr& app_data) : app_data_(app_data) {} + explicit AppLauncherFinder(const ApplicationDataPtr& app_data) + : app_data_(app_data) {} bool operator()(const AppsLauncher::LauncherPtr& launcher) const { DCHECK_OR_RETURN(launcher->app_data_ && app_data_, false) return *launcher->app_data_ == *app_data_; diff --git a/src/components/application_manager/src/app_launch/device_apps_launcher.cc b/src/components/application_manager/src/app_launch/device_apps_launcher.cc index 0a1bea3714..5f36e41efb 100644 --- a/src/components/application_manager/src/app_launch/device_apps_launcher.cc +++ b/src/components/application_manager/src/app_launch/device_apps_launcher.cc @@ -68,15 +68,6 @@ class Launcher { LaunchNext(); } - void OnAppRegistered(const ApplicationDataPtr& app_data) { - std::vector<ApplicationDataPtr>& apps = apps_on_device_->second; - std::vector<ApplicationDataPtr>::iterator it = - std::find(apps.begin(), apps.end(), app_data); - if (it != apps.end()) { - apps.erase(it); - } - } - void Clear() { gap_between_app_timer_.Stop(); wait_before_launch_timer_.Stop(); diff --git a/src/components/application_manager/src/app_service_manager.cc b/src/components/application_manager/src/app_service_manager.cc index 6bc970c8a3..9b31d57ca0 100644 --- a/src/components/application_manager/src/app_service_manager.cc +++ b/src/components/application_manager/src/app_service_manager.cc @@ -67,7 +67,7 @@ smart_objects::SmartObject AppServiceManager::PublishAppService( const bool mobile_service, const uint32_t connection_key) { SDL_LOG_AUTO_TRACE(); - std::string str_to_hash = ""; + std::string str_to_hash; std::string service_id = ""; std::string service_type = manifest[strings::service_type].asString(); @@ -413,10 +413,10 @@ bool AppServiceManager::ActivateAppService(const std::string service_id) { EnumConversionHelper<mobile_apis::AppServiceType::eType>::EnumToString( mobile_apis::AppServiceType::NAVIGATION, &navi_service_type); if (service_type == navi_service_type) { - smart_objects::SmartObject msg_params; - msg_params[strings::system_capability][strings::system_capability_type] = + smart_objects::SmartObject params; + params[strings::system_capability][strings::system_capability_type] = mobile_apis::SystemCapabilityType::NAVIGATION; - MessageHelper::BroadcastCapabilityUpdate(msg_params, app_manager_); + MessageHelper::BroadcastCapabilityUpdate(params, app_manager_); } return true; } diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index 2edf3860d6..6b4500e394 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -311,8 +311,9 @@ bool ApplicationImpl::webengine_projection_enabled() const { struct StateIDComparator { HmiState::StateID state_id_; - StateIDComparator(HmiState::StateID state_id) : state_id_(state_id) {} - bool operator()(const HmiStatePtr cur) { + explicit StateIDComparator(HmiState::StateID state_id) + : state_id_(state_id) {} + bool operator()(const HmiStatePtr cur) const { return cur->state_id() == state_id_; } }; @@ -475,10 +476,6 @@ void ApplicationImpl::set_is_media_application(bool option) { is_media_ = option; } -bool IsTTSState(const HmiStatePtr state) { - return state->state_id() == HmiState::STATE_ID_TTS_SESSION; -} - void ApplicationImpl::set_tts_properties_in_none(bool active) { tts_properties_in_none_ = active; } @@ -616,6 +613,9 @@ void ApplicationImpl::StopStreaming( void ApplicationImpl::StopNaviStreaming() { SDL_LOG_AUTO_TRACE(); video_stream_suspend_timer_.Stop(); + application_manager_.OnAppStreaming(app_id(), + protocol_handler::ServiceType::kMobileNav, + StreamingState::kStopped); MessageHelper::SendNaviStopStream(app_id(), application_manager_); set_video_streaming_approved(false); set_video_stream_retry_number(0); @@ -624,6 +624,9 @@ void ApplicationImpl::StopNaviStreaming() { void ApplicationImpl::StopAudioStreaming() { SDL_LOG_AUTO_TRACE(); audio_stream_suspend_timer_.Stop(); + application_manager_.OnAppStreaming(app_id(), + protocol_handler::ServiceType::kAudio, + StreamingState::kStopped); MessageHelper::SendAudioStopStream(app_id(), application_manager_); set_audio_streaming_approved(false); set_audio_stream_retry_number(0); @@ -634,14 +637,17 @@ void ApplicationImpl::SuspendStreaming( using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); - if (ServiceType::kMobileNav == service_type) { + if (ServiceType::kMobileNav == service_type && !video_streaming_suspended_) { video_stream_suspend_timer_.Stop(); - application_manager_.OnAppStreaming(app_id(), service_type, false); + application_manager_.OnAppStreaming( + app_id(), service_type, StreamingState::kSuspended); sync_primitives::AutoLock lock(video_streaming_suspended_lock_); video_streaming_suspended_ = true; - } else if (ServiceType::kAudio == service_type) { + } else if (ServiceType::kAudio == service_type && + !audio_streaming_suspended_) { audio_stream_suspend_timer_.Stop(); - application_manager_.OnAppStreaming(app_id(), service_type, false); + application_manager_.OnAppStreaming( + app_id(), service_type, StreamingState::kSuspended); sync_primitives::AutoLock lock(audio_streaming_suspended_lock_); audio_streaming_suspended_ = true; } @@ -650,7 +656,7 @@ void ApplicationImpl::SuspendStreaming( } void ApplicationImpl::WakeUpStreaming( - protocol_handler::ServiceType service_type, uint32_t timer_len) { + protocol_handler::ServiceType service_type) { using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); @@ -660,30 +666,31 @@ void ApplicationImpl::WakeUpStreaming( if (ServiceType::kMobileNav == service_type) { { // reduce the range of video_streaming_suspended_lock_ - sync_primitives::AutoLock lock(video_streaming_suspended_lock_); + sync_primitives::AutoLock auto_lock(video_streaming_suspended_lock_); if (video_streaming_suspended_) { - application_manager_.OnAppStreaming(app_id(), service_type, true); + application_manager_.OnAppStreaming( + app_id(), service_type, StreamingState::kStarted); application_manager_.ProcessOnDataStreamingNotification( service_type, app_id(), true); video_streaming_suspended_ = false; } } - video_stream_suspend_timer_.Start( - timer_len == 0 ? video_stream_suspend_timeout_ : timer_len, - timer::kPeriodic); + + video_stream_suspend_timer_.Start(video_stream_suspend_timeout_, + timer::kPeriodic); } else if (ServiceType::kAudio == service_type) { { // reduce the range of audio_streaming_suspended_lock_ - sync_primitives::AutoLock lock(audio_streaming_suspended_lock_); + sync_primitives::AutoLock auto_lock(audio_streaming_suspended_lock_); if (audio_streaming_suspended_) { - application_manager_.OnAppStreaming(app_id(), service_type, true); + application_manager_.OnAppStreaming( + app_id(), service_type, StreamingState::kStarted); application_manager_.ProcessOnDataStreamingNotification( service_type, app_id(), true); audio_streaming_suspended_ = false; } } - audio_stream_suspend_timer_.Start( - timer_len == 0 ? audio_stream_suspend_timeout_ : timer_len, - timer::kPeriodic); + audio_stream_suspend_timer_.Start(audio_stream_suspend_timeout_, + timer::kPeriodic); } } @@ -940,10 +947,7 @@ bool ApplicationImpl::AreCommandLimitsExceeded( limit.first = current; limit.second = 1; - return false; - - break; } // In case of policy table values, there is EVEN limitation for number of // commands per minute, e.g. 10 command per minute i.e. 1 command per 6 sec @@ -984,7 +988,6 @@ bool ApplicationImpl::AreCommandLimitsExceeded( cmd_number_to_time_limits_[cmd_id] = {current, dummy_limit}; return false; - break; } default: { SDL_LOG_WARN("Limit source is not implemented."); @@ -1163,10 +1166,10 @@ void ApplicationImpl::SubscribeToSoftButtons( struct FindSoftButtonId { uint32_t soft_button_id_; - FindSoftButtonId(const uint32_t soft_button_id) + explicit FindSoftButtonId(const uint32_t soft_button_id) : soft_button_id_(soft_button_id) {} - bool operator()(const std::pair<uint32_t, WindowID>& element) { + bool operator()(const std::pair<uint32_t, WindowID>& element) const { return soft_button_id_ == element.first; } }; diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index df58871c80..6b0ea39804 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -229,7 +229,7 @@ ApplicationManagerImpl::ApplicationManagerImpl( ApplicationManagerImpl::~ApplicationManagerImpl() { SDL_LOG_AUTO_TRACE(); - is_stopping_ = true; + is_stopping_.store(true); SendOnSDLClose(); media_manager_ = NULL; hmi_handler_ = NULL; @@ -693,9 +693,9 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( bool is_mismatched_cloud_app = false; if (apps_to_register_.end() == it) { - DevicePredicate finder(application->device()); + DevicePredicate device_finder(application->device()); it = std::find_if( - apps_to_register_.begin(), apps_to_register_.end(), finder); + apps_to_register_.begin(), apps_to_register_.end(), device_finder); bool found = apps_to_register_.end() != it; is_mismatched_cloud_app = found && (*it)->is_cloud_app() && @@ -755,6 +755,11 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( // Timer will be started after hmi level resumption. resume_controller().OnAppRegistrationStart(policy_app_id, device_mac); + return application; +} + +void ApplicationManagerImpl::FinalizeAppRegistration( + ApplicationSharedPtr application, const uint32_t connection_key) { AddAppToRegisteredAppList(application); // Update cloud app information, in case any pending apps are unable to be @@ -772,8 +777,6 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( connection_handler::DeviceHandle secondary_device_handle = itr->second; application->set_secondary_device(secondary_device_handle); } - - return application; } bool ApplicationManagerImpl::ActivateApplication(ApplicationSharedPtr app) { @@ -1218,10 +1221,13 @@ void ApplicationManagerImpl::CreatePendingApplication( application->set_hybrid_app_preference(hybrid_app_preference_enum); application->set_cloud_app_certificate(app_properties.certificate); - sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); - SDL_LOG_DEBUG("apps_to_register_ size before: " << apps_to_register_.size()); - apps_to_register_.insert(application); - SDL_LOG_DEBUG("apps_to_register_ size after: " << apps_to_register_.size()); + { + sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); + SDL_LOG_DEBUG( + "apps_to_register_ size before: " << apps_to_register_.size()); + apps_to_register_.insert(application); + SDL_LOG_DEBUG("apps_to_register_ size after: " << apps_to_register_.size()); + } SendUpdateAppList(); } @@ -1345,10 +1351,8 @@ void ApplicationManagerImpl::SetPendingApplicationState( app->app_id(), mobile_apis::Result::INVALID_ENUM, true, true); app->MarkUnregistered(); - { - sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); - apps_to_register_.insert(app); - } + sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); + apps_to_register_.insert(app); } void ApplicationManagerImpl::OnConnectionStatusUpdated() { @@ -1639,11 +1643,14 @@ void ApplicationManagerImpl::SendUpdateAppList() { (*request)[strings::msg_params][strings::applications] = SmartObject(SmartType_Array); - SmartObject& applications = + SmartObject& applications_so = (*request)[strings::msg_params][strings::applications]; - PrepareApplicationListSO(applications_, applications, *this); - PrepareApplicationListSO(apps_to_register_, applications, *this); + const auto applications_list = applications().GetData(); + PrepareApplicationListSO(applications_list, applications_so, *this); + + const auto pending_apps_list = AppsWaitingForRegistration().GetData(); + PrepareApplicationListSO(pending_apps_list, applications_so, *this); rpc_service_->ManageHMICommand(request); } @@ -1809,8 +1816,8 @@ bool ApplicationManagerImpl::CheckResumptionRequiredTransportAvailable( } else { // check all AppHMITypes that the app has for (size_t i = 0; i < app_types_array->length(); i++) { - const std::string app_type_string = - AppHMITypeToString(static_cast<mobile_apis::AppHMIType::eType>( + std::string app_type_string = + EnumToString(static_cast<mobile_apis::AppHMIType::eType>( app_types_array->getElement(i).asUInt())); bool transport_is_found = false; @@ -1891,8 +1898,8 @@ bool ApplicationManagerImpl::StartNaviService( /* Fix: For NaviApp1 Switch to NaviApp2, App1's Endcallback() arrives later than App2's Startcallback(). Cause streaming issue on HMI. */ - sync_primitives::AutoLock lock(applications_list_lock_ptr_); - for (auto app : applications_) { + auto accessor = applications(); + for (auto app : accessor.GetData()) { if (!app || (!app->is_navi() && !app->mobile_projection_enabled())) { SDL_LOG_DEBUG("Continue, Not Navi App Id: " << app->app_id()); continue; @@ -1919,7 +1926,7 @@ bool ApplicationManagerImpl::StartNaviService( } if (!rejected_params.empty()) { - OnStreamingConfigured(app_id, service_type, false, rejected_params); + OnStreamingConfigurationFailed(app_id, rejected_params, std::string()); return false; } else if (!converted_params.empty()) { SDL_LOG_INFO("Sending video configuration params"); @@ -1932,78 +1939,82 @@ bool ApplicationManagerImpl::StartNaviService( } } // no configuration is needed, or SetVideoConfig is not sent - std::vector<std::string> empty; - OnStreamingConfigured(app_id, service_type, true, empty); + OnStreamingConfigurationSuccessful(app_id, service_type); return true; - - } else { - SDL_LOG_WARN("Refused navi service by HMI level"); } + SDL_LOG_WARN("Refused navi service by HMI level"); std::vector<std::string> empty; - OnStreamingConfigured(app_id, service_type, false, empty); + OnStreamingConfigurationFailed( + app_id, + empty, + "Service type: " + std::to_string(service_type) + + " disallowed with current HMI level"); return false; } -void ApplicationManagerImpl::OnStreamingConfigured( - uint32_t app_id, - protocol_handler::ServiceType service_type, - bool result, - std::vector<std::string>& rejected_params) { - using namespace protocol_handler; +void ApplicationManagerImpl::OnStreamingConfigurationSuccessful( + uint32_t app_id, protocol_handler::ServiceType service_type) { SDL_LOG_AUTO_TRACE(); - SDL_LOG_INFO("OnStreamingConfigured called for service " - << service_type << ", result=" << result); - - if (result) { - std::vector<std::string> empty; - { - sync_primitives::AutoLock lock(navi_service_status_lock_); + SDL_LOG_INFO("Streaming configuration successful for service " + << service_type); + std::vector<std::string> empty; + std::string reason; + { + sync_primitives::AutoLock lock(navi_service_status_lock_); - NaviServiceStatusMap::iterator it = navi_service_status_.find(app_id); - if (navi_service_status_.end() == it) { - SDL_LOG_WARN("Application not found in navi status map"); - connection_handler().NotifyServiceStartedResult(app_id, false, empty); - return; - } + NaviServiceStatusMap::iterator it = navi_service_status_.find(app_id); + if (navi_service_status_.end() == it) { + SDL_LOG_WARN("Application not found in navi status map"); + connection_handler().NotifyServiceStartedResult( + app_id, false, empty, reason); + return; + } - // Fill NaviServices map. Set true to first value of pair if - // we've started video service or to second value if we've - // started audio service - service_type == ServiceType::kMobileNav ? it->second.first = true - : it->second.second = true; + // Fill NaviServices map. Set true to first value of pair if + // we've started video service or to second value if we've + // started audio service + service_type == protocol_handler::ServiceType::kMobileNav + ? it->second.first = true + : it->second.second = true; - { - sync_primitives::AutoLock lock(navi_app_to_stop_lock_); - for (size_t i = 0; i < navi_app_to_stop_.size(); ++i) { - if (app_id == navi_app_to_stop_[i]) { - sync_primitives::AutoLock lock(close_app_timer_pool_lock_); - close_app_timer_pool_.erase(close_app_timer_pool_.begin() + i); - navi_app_to_stop_.erase(navi_app_to_stop_.begin() + i); - break; - } + { + sync_primitives::AutoLock lock(navi_app_to_stop_lock_); + for (size_t i = 0; i < navi_app_to_stop_.size(); ++i) { + if (app_id == navi_app_to_stop_[i]) { + sync_primitives::AutoLock lock(close_app_timer_pool_lock_); + close_app_timer_pool_.erase(close_app_timer_pool_.begin() + i); + navi_app_to_stop_.erase(navi_app_to_stop_.begin() + i); + break; } } } + } - application(app_id)->StartStreaming(service_type); - connection_handler().NotifyServiceStartedResult(app_id, true, empty); + application(app_id)->StartStreaming(service_type); + connection_handler().NotifyServiceStartedResult(app_id, true, empty, reason); - // Fix: For wifi Secondary - // Should erase appid from deque of ForbidStreaming() push in the last time - std::deque<uint32_t>::const_iterator iter = std::find( - navi_app_to_end_stream_.begin(), navi_app_to_end_stream_.end(), app_id); - if (navi_app_to_end_stream_.end() != iter) { - navi_app_to_end_stream_.erase(iter); - } - } else { - std::vector<std::string> converted_params = - ConvertRejectedParamList(rejected_params); - connection_handler().NotifyServiceStartedResult( - app_id, false, converted_params); + // Fix: For wifi Secondary + // Should erase appid from deque of ForbidStreaming() push in the last time + std::deque<uint32_t>::const_iterator iter = std::find( + navi_app_to_end_stream_.begin(), navi_app_to_end_stream_.end(), app_id); + if (navi_app_to_end_stream_.end() != iter) { + navi_app_to_end_stream_.erase(iter); } } +void ApplicationManagerImpl::OnStreamingConfigurationFailed( + uint32_t app_id, + std::vector<std::string>& rejected_params, + const std::string& reason) { + SDL_LOG_AUTO_TRACE(); + + std::vector<std::string> converted_params = + ConvertRejectedParamList(rejected_params); + connection_handler().NotifyServiceStartedResult( + app_id, false, converted_params, reason); +} + void ApplicationManagerImpl::StopNaviService( uint32_t app_id, protocol_handler::ServiceType service_type) { using namespace protocol_handler; @@ -2076,17 +2087,18 @@ void ApplicationManagerImpl::OnServiceStartedCallback( SDL_LOG_DEBUG("ServiceType = " << type << ". Session = " << std::hex << session_key); std::vector<std::string> empty; + std::string reason; if (kRpc == type) { SDL_LOG_DEBUG("RPC service is about to be started."); - connection_handler().NotifyServiceStartedResult(session_key, true, empty); + connection_handler().NotifyServiceStartedResult( + session_key, true, empty, reason); return; } ApplicationSharedPtr app = application(session_key); if (!app) { SDL_LOG_WARN("The application with id:" << session_key << " doesn't exists."); - connection_handler().NotifyServiceStartedResult(session_key, false, empty); return; } @@ -2099,12 +2111,15 @@ void ApplicationManagerImpl::OnServiceStartedCallback( return; } else { SDL_LOG_WARN("Refuse not navi/projection application"); + reason = "Service type: " + std::to_string(type) + + " disallowed with current HMI type"; } } else { SDL_LOG_WARN("Refuse unknown service"); } - connection_handler().NotifyServiceStartedResult(session_key, false, empty); + connection_handler().NotifyServiceStartedResult( + session_key, false, empty, reason); } void ApplicationManagerImpl::OnServiceEndedCallback( @@ -2166,6 +2181,12 @@ void ApplicationManagerImpl::OnServiceEndedCallback( is_unexpected_disconnect = false; break; } + case CloseSessionReason::kFinalMessage: { + reason = Result::SUCCESS; + is_resuming = false; + is_unexpected_disconnect = false; + break; + } default: { reason = Result::INVALID_ENUM; is_resuming = true; @@ -2534,9 +2555,7 @@ bool ApplicationManagerImpl::Init( bool ApplicationManagerImpl::Stop() { SDL_LOG_AUTO_TRACE(); - stopping_application_mng_lock_.Acquire(); - is_stopping_ = true; - stopping_application_mng_lock_.Release(); + is_stopping_.store(true); application_list_update_timer_.Stop(); try { if (unregister_reason_ == @@ -2701,8 +2720,7 @@ void ApplicationManagerImpl::PullLanguagesInfo(const SmartObject& app_data, } const HMICapabilities& hmi_cap = hmi_capabilities(); - std::string cur_vr_lang( - MessageHelper::CommonLanguageToString(hmi_cap.active_vr_language())); + std::string cur_vr_lang(EnumToString(hmi_cap.active_vr_language())); const SmartObject& languages = app_data[json::languages]; std::transform( @@ -2862,6 +2880,7 @@ void ApplicationManagerImpl::ProcessQueryApp( CreateApplications(*obj_array, connection_key); SendUpdateAppList(); + sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); AppsWaitRegistrationSet::const_iterator it = apps_to_register_.begin(); for (; it != apps_to_register_.end(); ++it) { const std::string full_icon_path((*it)->app_icon_path()); @@ -2960,9 +2979,7 @@ void ApplicationManagerImpl::SetUnregisterAllApplicationsReason( void ApplicationManagerImpl::HeadUnitReset( mobile_api::AppInterfaceUnregisteredReason::eType reason) { SDL_LOG_AUTO_TRACE(); - stopping_application_mng_lock_.Acquire(); - is_stopping_ = true; - stopping_application_mng_lock_.Release(); + is_stopping_.store(true); switch (reason) { case mobile_api::AppInterfaceUnregisteredReason::MASTER_RESET: { SDL_LOG_TRACE("Performing MASTER_RESET"); @@ -3082,11 +3099,11 @@ void ApplicationManagerImpl::UnregisterAllApplications() { SDL_LOG_DEBUG("Unregister reason " << unregister_reason_); SetHMICooperating(false); - bool is_ignition_off = false; + using namespace mobile_api::AppInterfaceUnregisteredReason; using namespace helpers; - is_ignition_off = + bool is_ignition_off = Compare<eType, EQ, ONE>(unregister_reason_, IGNITION_OFF, INVALID_ENUM); bool is_unexpected_disconnect = Compare<eType, NEQ, ALL>( @@ -3298,7 +3315,8 @@ void ApplicationManagerImpl::UnregisterApplication( plugin_manager_->ForEachPlugin(on_app_unregistered); request_ctrl_.terminateAppRequests(app_id); - if (applications_.empty()) { + const bool is_applications_list_empty = applications().GetData().empty(); + if (is_applications_list_empty) { policy_handler_->StopRetrySequence(); } return; @@ -3346,8 +3364,8 @@ mobile_apis::Result::eType ApplicationManagerImpl::CheckPolicyPermissions( #ifdef ENABLE_LOG const std::string log_msg = "Application: " + app->policy_app_id() + ", RPC: " + function_id + - ", window_id: " + std::to_string(window_id) + ", HMI status: " + - MessageHelper::StringifiedHMILevel(app->hmi_level(window_id)); + ", window_id: " + std::to_string(window_id) + + ", HMI status: " + EnumToString(app->hmi_level(window_id)); #endif // ENABLE_LOG if (result.hmi_level_permitted != policy::kRpcAllowed) { SDL_LOG_WARN("Request is blocked by policies. " << log_msg); @@ -3368,7 +3386,6 @@ mobile_apis::Result::eType ApplicationManagerImpl::CheckPolicyPermissions( } bool ApplicationManagerImpl::is_stopping() const { - sync_primitives::AutoLock lock(stopping_application_mng_lock_); return is_stopping_; } @@ -3566,7 +3583,9 @@ void ApplicationManagerImpl::ForbidStreaming( } void ApplicationManagerImpl::OnAppStreaming( - uint32_t app_id, protocol_handler::ServiceType service_type, bool state) { + uint32_t app_id, + protocol_handler::ServiceType service_type, + const Application::StreamingState new_state) { SDL_LOG_AUTO_TRACE(); ApplicationSharedPtr app = application(app_id); @@ -3577,12 +3596,31 @@ void ApplicationManagerImpl::OnAppStreaming( } DCHECK_OR_RETURN_VOID(media_manager_); - if (state) { - state_ctrl_.OnVideoStreamingStarted(app); - media_manager_->StartStreaming(app_id, service_type); - } else { - media_manager_->StopStreaming(app_id, service_type); - state_ctrl_.OnVideoStreamingStopped(app); + SDL_LOG_DEBUG("New state for service " << static_cast<int32_t>(service_type) + << " is " + << static_cast<int32_t>(new_state)); + switch (new_state) { + case Application::StreamingState::kStopped: { + // Stop activity in media_manager_ when service is stopped + // State controller has been already notified by kSuspended event + // received before + media_manager_->StopStreaming(app_id, service_type); + break; + } + + case Application::StreamingState::kStarted: { + // Apply temporary streaming state and start activity in media_manager_ + state_ctrl_.OnVideoStreamingStarted(app); + media_manager_->StartStreaming(app_id, service_type); + break; + } + + case Application::StreamingState::kSuspended: { + // Don't stop activity in media_manager_ in that case + // Just cancel the temporary streaming state + state_ctrl_.OnVideoStreamingStopped(app); + break; + } } } @@ -3845,9 +3883,7 @@ bool ApplicationManagerImpl::ResetVrHelpTitleItems( } const std::string& vr_help_title = get_settings().vr_help_title(); - smart_objects::SmartObject so_vr_help_title = - smart_objects::SmartObject(smart_objects::SmartType_String); - so_vr_help_title = vr_help_title; + smart_objects::SmartObject so_vr_help_title(vr_help_title); app->reset_vr_help_title(); app->reset_vr_help(); @@ -4104,9 +4140,7 @@ void ApplicationManagerImpl::OnApplicationListUpdateTimer() { const bool is_new_app_registered = registered_during_timer_execution_; registered_during_timer_execution_ = false; - apps_to_register_list_lock_ptr_->Acquire(); - const bool trigger_ptu = apps_size_ != applications_.size(); - apps_to_register_list_lock_ptr_->Release(); + const bool trigger_ptu = apps_size_ != applications().GetData().size(); if (is_new_app_registered) { SendUpdateAppList(); @@ -4286,69 +4320,6 @@ ApplicationManagerImpl::CreateAllAppGlobalPropsIDList( return global_properties; } -mobile_apis::AppHMIType::eType ApplicationManagerImpl::StringToAppHMIType( - std::string str) { - SDL_LOG_AUTO_TRACE(); - if ("DEFAULT" == str) { - return mobile_apis::AppHMIType::DEFAULT; - } else if ("COMMUNICATION" == str) { - return mobile_apis::AppHMIType::COMMUNICATION; - } else if ("MEDIA" == str) { - return mobile_apis::AppHMIType::MEDIA; - } else if ("MESSAGING" == str) { - return mobile_apis::AppHMIType::MESSAGING; - } else if ("NAVIGATION" == str) { - return mobile_apis::AppHMIType::NAVIGATION; - } else if ("PROJECTION" == str) { - return mobile_apis::AppHMIType::PROJECTION; - } else if ("INFORMATION" == str) { - return mobile_apis::AppHMIType::INFORMATION; - } else if ("SOCIAL" == str) { - return mobile_apis::AppHMIType::SOCIAL; - } else if ("BACKGROUND_PROCESS" == str) { - return mobile_apis::AppHMIType::BACKGROUND_PROCESS; - } else if ("TESTING" == str) { - return mobile_apis::AppHMIType::TESTING; - } else if ("SYSTEM" == str) { - return mobile_apis::AppHMIType::SYSTEM; - } else { - return mobile_apis::AppHMIType::INVALID_ENUM; - } -} - -const std::string ApplicationManagerImpl::AppHMITypeToString( - mobile_apis::AppHMIType::eType type) const { - SDL_LOG_AUTO_TRACE(); - switch (type) { - case mobile_apis::AppHMIType::DEFAULT: - return "DEFAULT"; - case mobile_apis::AppHMIType::COMMUNICATION: - return "COMMUNICATION"; - case mobile_apis::AppHMIType::MEDIA: - return "MEDIA"; - case mobile_apis::AppHMIType::MESSAGING: - return "MESSAGING"; - case mobile_apis::AppHMIType::NAVIGATION: - return "NAVIGATION"; - case mobile_apis::AppHMIType::INFORMATION: - return "INFORMATION"; - case mobile_apis::AppHMIType::SOCIAL: - return "SOCIAL"; - case mobile_apis::AppHMIType::BACKGROUND_PROCESS: - return "BACKGROUND_PROCESS"; - case mobile_apis::AppHMIType::TESTING: - return "TESTING"; - case mobile_apis::AppHMIType::SYSTEM: - return "SYSTEM"; - case mobile_apis::AppHMIType::PROJECTION: - return "PROJECTION"; - case mobile_apis::AppHMIType::REMOTE_CONTROL: - return "REMOTE_CONTROL"; - default: - return "INVALID_ENUM"; - } -} - bool ApplicationManagerImpl::CompareAppHMIType( const smart_objects::SmartObject& from_policy, const smart_objects::SmartObject& from_application) { @@ -4381,7 +4352,7 @@ void ApplicationManagerImpl::OnUpdateHMIAppType( std::vector<std::string> hmi_types_from_policy; smart_objects::SmartObject transform_app_hmi_types( smart_objects::SmartType_Array); - bool flag_diffirence_app_hmi_type = false; + bool flag_diffirence_app_hmi_type; DataAccessor<ApplicationSet> accessor(applications()); for (ApplicationSetIt it = accessor.GetData().begin(); it != accessor.GetData().end(); @@ -4390,7 +4361,6 @@ void ApplicationManagerImpl::OnUpdateHMIAppType( if (it_app_hmi_types_from_policy != app_hmi_types.end() && ((it_app_hmi_types_from_policy->second).size())) { - flag_diffirence_app_hmi_type = false; hmi_types_from_policy = (it_app_hmi_types_from_policy->second); if (transform_app_hmi_types.length()) { @@ -4400,7 +4370,8 @@ void ApplicationManagerImpl::OnUpdateHMIAppType( for (uint32_t i = 0; i < hmi_types_from_policy.size(); ++i) { transform_app_hmi_types[i] = - StringToAppHMIType(hmi_types_from_policy[i]); + StringToEnum<mobile_api::AppHMIType::eType>( + hmi_types_from_policy[i]); } ApplicationConstSharedPtr app = *it; @@ -4547,8 +4518,7 @@ void ApplicationManagerImpl::SendDriverDistractionState( driver_distraction_state()) { bool dismissal_enabled = *lock_screen_dismissal; if (dismissal_enabled) { - const auto language = - MessageHelper::MobileLanguageToString(application->ui_language()); + const auto language = EnumToString(application->ui_language()); const auto warning_message = policy_handler_->LockScreenDismissalWarningMessage(language); @@ -4612,7 +4582,6 @@ void ApplicationManagerImpl::SendGetIconUrlNotifications( continue; } - std::string endpoint = app_icon_it->second.endpoint; bool pending_request = app_icon_it->second.pending_request; if (pending_request) { @@ -4943,7 +4912,7 @@ void ApplicationManagerImpl::SetMockMediaManager( #endif // BUILD_TESTS struct MobileAppIdPredicate { std::string policy_app_id_; - MobileAppIdPredicate(const std::string& policy_app_id) + explicit MobileAppIdPredicate(const std::string& policy_app_id) : policy_app_id_(policy_app_id) {} bool operator()(const ApplicationSharedPtr app) const { return app ? policy_app_id_ == app->policy_app_id() : false; @@ -4952,7 +4921,8 @@ struct MobileAppIdPredicate { struct TakeDeviceHandle { public: - TakeDeviceHandle(const ApplicationManager& app_mngr) : app_mngr_(app_mngr) {} + explicit TakeDeviceHandle(const ApplicationManager& app_mngr) + : app_mngr_(app_mngr) {} std::string operator()(ApplicationSharedPtr& app) { DCHECK_OR_RETURN(app, ""); return MessageHelper::GetDeviceMacAddressForHandle(app->device(), diff --git a/src/components/application_manager/src/application_state.cc b/src/components/application_manager/src/application_state.cc index 2fb583ab3e..1ec4abaed7 100644 --- a/src/components/application_manager/src/application_state.cc +++ b/src/components/application_manager/src/application_state.cc @@ -42,7 +42,7 @@ namespace { struct StateIDComparator { application_manager::HmiState::StateID state_id_; - StateIDComparator(application_manager::HmiState::StateID state_id) + explicit StateIDComparator(application_manager::HmiState::StateID state_id) : state_id_(state_id) {} bool operator()(const application_manager::HmiStatePtr cur) const { return cur->state_id() == state_id_; @@ -209,8 +209,8 @@ void ApplicationState::EraseHMIState(HmiStates& hmi_states, } else { HmiStates::iterator next = it; HmiStates::iterator prev = it; - next++; - prev--; + ++next; + --prev; if (hmi_states.end() != next) { HmiStatePtr next_state = *next; diff --git a/src/components/application_manager/src/commands/command_request_impl.cc b/src/components/application_manager/src/commands/command_request_impl.cc index 938b7afc99..08bf25de54 100644 --- a/src/components/application_manager/src/commands/command_request_impl.cc +++ b/src/components/application_manager/src/commands/command_request_impl.cc @@ -846,7 +846,6 @@ void CommandRequestImpl::GetInfo( mobile_apis::Result::eType CommandRequestImpl::PrepareResultCodeForResponse( const ResponseInfo& first, const ResponseInfo& second) { SDL_LOG_AUTO_TRACE(); - mobile_apis::Result::eType result_code = mobile_apis::Result::INVALID_ENUM; if (IsResultCodeUnsupported(first, second) || IsResultCodeUnsupported(second, first)) { return mobile_apis::Result::UNSUPPORTED_RESOURCE; @@ -867,7 +866,7 @@ mobile_apis::Result::eType CommandRequestImpl::PrepareResultCodeForResponse( if (!second.is_unsupported_resource) { second_result = second.result_code; } - result_code = + mobile_apis::Result::eType result_code = MessageHelper::HMIToMobileResult(std::max(first_result, second_result)); return result_code; } 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 3d294f0035..7392731d70 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 @@ -78,7 +78,7 @@ void EventDispatcherImpl::add_observer(const Event::EventID& event_id, } struct IdCheckFunctor { - IdCheckFunctor(const unsigned long id) : target_id(id) {} + explicit IdCheckFunctor(const unsigned long id) : target_id(id) {} bool operator()(const EventObserver* obs) const { return (obs->id() == target_id); diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 924c603792..1390a3ae2c 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -54,410 +54,6 @@ namespace formatters = ns_smart_device_link::ns_json_handler::formatters; SDL_CREATE_LOG_VARIABLE("HMICapabilities") namespace { -std::map<std::string, hmi_apis::Common_VrCapabilities::eType> - vr_enum_capabilities; -std::map<std::string, hmi_apis::Common_SpeechCapabilities::eType> - tts_enum_capabilities; -std::map<std::string, hmi_apis::Common_PrerecordedSpeech::eType> - tts_enum_prerecorded_speech; -std::map<std::string, hmi_apis::Common_ButtonName::eType> button_enum_name; -std::map<std::string, hmi_apis::Common_TextFieldName::eType> - text_fields_enum_name; -std::map<std::string, hmi_apis::Common_MediaClockFormat::eType> - media_clock_enum_name; -std::map<std::string, hmi_apis::Common_ImageType::eType> image_type_enum; -std::map<std::string, hmi_apis::Common_SamplingRate::eType> sampling_rate_enum; -std::map<std::string, hmi_apis::Common_BitsPerSample::eType> - bit_per_sample_enum; -std::map<std::string, hmi_apis::Common_AudioType::eType> audio_type_enum; -std::map<std::string, hmi_apis::Common_HmiZoneCapabilities::eType> - hmi_zone_enum; -std::map<std::string, hmi_apis::Common_ImageFieldName::eType> - image_field_name_enum; -std::map<std::string, hmi_apis::Common_FileType::eType> file_type_enum; -std::map<std::string, hmi_apis::Common_DisplayType::eType> display_type_enum; -std::map<std::string, hmi_apis::Common_CharacterSet::eType> character_set_enum; -std::map<std::string, hmi_apis::Common_VideoStreamingProtocol::eType> - video_streaming_protocol_enum; -std::map<std::string, hmi_apis::Common_VideoStreamingCodec::eType> - video_streaming_codec_enum; - -void InitCapabilities() { - vr_enum_capabilities.insert(std::make_pair( - std::string("TEXT"), hmi_apis::Common_VrCapabilities::VR_TEXT)); - - tts_enum_capabilities.insert(std::make_pair( - std::string("TEXT"), hmi_apis::Common_SpeechCapabilities::SC_TEXT)); - tts_enum_capabilities.insert( - std::make_pair(std::string("SAPI_PHONEMES"), - hmi_apis::Common_SpeechCapabilities::SAPI_PHONEMES)); - tts_enum_capabilities.insert( - std::make_pair(std::string("LHPLUS_PHONEMES"), - hmi_apis::Common_SpeechCapabilities::LHPLUS_PHONEMES)); - tts_enum_capabilities.insert( - std::make_pair(std::string("SAPI_PHONEMES"), - hmi_apis::Common_SpeechCapabilities::SAPI_PHONEMES)); - tts_enum_capabilities.insert( - std::make_pair(std::string("PRE_RECORDED"), - hmi_apis::Common_SpeechCapabilities::PRE_RECORDED)); - tts_enum_capabilities.insert(std::make_pair( - std::string("SILENCE"), hmi_apis::Common_SpeechCapabilities::SILENCE)); - tts_enum_capabilities.insert(std::make_pair( - std::string("FILE"), hmi_apis::Common_SpeechCapabilities::FILE)); - - tts_enum_prerecorded_speech.insert( - std::make_pair(std::string("HELP_JINGLE"), - hmi_apis::Common_PrerecordedSpeech::HELP_JINGLE)); - tts_enum_prerecorded_speech.insert( - std::make_pair(std::string("INITIAL_JINGLE"), - hmi_apis::Common_PrerecordedSpeech::INITIAL_JINGLE)); - tts_enum_prerecorded_speech.insert( - std::make_pair(std::string("LISTEN_JINGLE"), - hmi_apis::Common_PrerecordedSpeech::LISTEN_JINGLE)); - tts_enum_prerecorded_speech.insert( - std::make_pair(std::string("POSITIVE_JINGLE"), - hmi_apis::Common_PrerecordedSpeech::POSITIVE_JINGLE)); - tts_enum_prerecorded_speech.insert( - std::make_pair(std::string("NEGATIVE_JINGLE"), - hmi_apis::Common_PrerecordedSpeech::NEGATIVE_JINGLE)); - - button_enum_name.insert( - std::make_pair(std::string("OK"), hmi_apis::Common_ButtonName::OK)); - button_enum_name.insert(std::make_pair( - std::string("PLAY_PAUSE"), hmi_apis::Common_ButtonName::PLAY_PAUSE)); - button_enum_name.insert(std::make_pair( - std::string("SEEKLEFT"), hmi_apis::Common_ButtonName::SEEKLEFT)); - button_enum_name.insert(std::make_pair( - std::string("SEEKRIGHT"), hmi_apis::Common_ButtonName::SEEKRIGHT)); - button_enum_name.insert(std::make_pair(std::string("TUNEUP"), - hmi_apis::Common_ButtonName::TUNEUP)); - button_enum_name.insert(std::make_pair( - std::string("TUNEDOWN"), hmi_apis::Common_ButtonName::TUNEDOWN)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_0"), hmi_apis::Common_ButtonName::PRESET_0)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_1"), hmi_apis::Common_ButtonName::PRESET_1)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_2"), hmi_apis::Common_ButtonName::PRESET_2)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_3"), hmi_apis::Common_ButtonName::PRESET_3)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_4"), hmi_apis::Common_ButtonName::PRESET_4)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_5"), hmi_apis::Common_ButtonName::PRESET_5)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_6"), hmi_apis::Common_ButtonName::PRESET_6)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_7"), hmi_apis::Common_ButtonName::PRESET_7)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_8"), hmi_apis::Common_ButtonName::PRESET_8)); - button_enum_name.insert(std::make_pair( - std::string("PRESET_9"), hmi_apis::Common_ButtonName::PRESET_9)); - button_enum_name.insert( - std::make_pair(std::string("CUSTOM_BUTTON"), - hmi_apis::Common_ButtonName::CUSTOM_BUTTON)); - button_enum_name.insert(std::make_pair(std::string("SEARCH"), - hmi_apis::Common_ButtonName::SEARCH)); - button_enum_name.insert( - std::make_pair(std::string("NAV_CENTER_LOCATION"), - hmi_apis::Common_ButtonName::NAV_CENTER_LOCATION)); - button_enum_name.insert(std::make_pair( - std::string("NAV_ZOOM_IN"), hmi_apis::Common_ButtonName::NAV_ZOOM_IN)); - button_enum_name.insert(std::make_pair( - std::string("NAV_ZOOM_OUT"), hmi_apis::Common_ButtonName::NAV_ZOOM_OUT)); - button_enum_name.insert(std::make_pair( - std::string("NAV_PAN_UP"), hmi_apis::Common_ButtonName::NAV_PAN_UP)); - button_enum_name.insert( - std::make_pair(std::string("NAV_PAN_UP_RIGHT"), - hmi_apis::Common_ButtonName::NAV_PAN_UP_RIGHT)); - button_enum_name.insert( - std::make_pair(std::string("NAV_PAN_RIGHT"), - hmi_apis::Common_ButtonName::NAV_PAN_RIGHT)); - button_enum_name.insert( - std::make_pair(std::string("NAV_PAN_DOWN_RIGHT"), - hmi_apis::Common_ButtonName::NAV_PAN_DOWN_RIGHT)); - button_enum_name.insert(std::make_pair( - std::string("NAV_PAN_DOWN"), hmi_apis::Common_ButtonName::NAV_PAN_DOWN)); - button_enum_name.insert( - std::make_pair(std::string("NAV_PAN_DOWN_LEFT"), - hmi_apis::Common_ButtonName::NAV_PAN_DOWN_LEFT)); - button_enum_name.insert(std::make_pair( - std::string("NAV_PAN_LEFT"), hmi_apis::Common_ButtonName::NAV_PAN_LEFT)); - button_enum_name.insert( - std::make_pair(std::string("NAV_PAN_UP_LEFT"), - hmi_apis::Common_ButtonName::NAV_PAN_UP_LEFT)); - button_enum_name.insert( - std::make_pair(std::string("NAV_TILT_TOGGLE"), - hmi_apis::Common_ButtonName::NAV_TILT_TOGGLE)); - button_enum_name.insert( - std::make_pair(std::string("NAV_ROTATE_CLOCKWISE"), - hmi_apis::Common_ButtonName::NAV_ROTATE_CLOCKWISE)); - button_enum_name.insert( - std::make_pair(std::string("NAV_ROTATE_COUNTERCLOCKWISE"), - hmi_apis::Common_ButtonName::NAV_ROTATE_COUNTERCLOCKWISE)); - button_enum_name.insert( - std::make_pair(std::string("NAV_HEADING_TOGGLE"), - hmi_apis::Common_ButtonName::NAV_HEADING_TOGGLE)); - - text_fields_enum_name.insert(std::make_pair( - std::string("mainField1"), hmi_apis::Common_TextFieldName::mainField1)); - text_fields_enum_name.insert(std::make_pair( - std::string("mainField2"), hmi_apis::Common_TextFieldName::mainField2)); - text_fields_enum_name.insert(std::make_pair( - std::string("mainField3"), hmi_apis::Common_TextFieldName::mainField3)); - text_fields_enum_name.insert(std::make_pair( - std::string("mainField4"), hmi_apis::Common_TextFieldName::mainField4)); - text_fields_enum_name.insert(std::make_pair( - std::string("statusBar"), hmi_apis::Common_TextFieldName::statusBar)); - text_fields_enum_name.insert(std::make_pair( - std::string("mediaClock"), hmi_apis::Common_TextFieldName::mediaClock)); - text_fields_enum_name.insert(std::make_pair( - std::string("mediaTrack"), hmi_apis::Common_TextFieldName::mediaTrack)); - text_fields_enum_name.insert(std::make_pair( - std::string("alertText1"), hmi_apis::Common_TextFieldName::alertText1)); - text_fields_enum_name.insert(std::make_pair( - std::string("alertText2"), hmi_apis::Common_TextFieldName::alertText2)); - text_fields_enum_name.insert(std::make_pair( - std::string("alertText3"), hmi_apis::Common_TextFieldName::alertText3)); - text_fields_enum_name.insert( - std::make_pair(std::string("scrollableMessageBody"), - hmi_apis::Common_TextFieldName::scrollableMessageBody)); - text_fields_enum_name.insert( - std::make_pair(std::string("initialInteractionText"), - hmi_apis::Common_TextFieldName::initialInteractionText)); - text_fields_enum_name.insert( - std::make_pair(std::string("navigationText1"), - hmi_apis::Common_TextFieldName::navigationText1)); - text_fields_enum_name.insert( - std::make_pair(std::string("navigationText2"), - hmi_apis::Common_TextFieldName::navigationText2)); - text_fields_enum_name.insert( - std::make_pair(std::string("ETA"), hmi_apis::Common_TextFieldName::ETA)); - text_fields_enum_name.insert( - std::make_pair(std::string("totalDistance"), - hmi_apis::Common_TextFieldName::totalDistance)); - text_fields_enum_name.insert(std::make_pair( - std::string("audioPassThruDisplayText1"), - hmi_apis::Common_TextFieldName::audioPassThruDisplayText1)); - text_fields_enum_name.insert(std::make_pair( - std::string("audioPassThruDisplayText2"), - hmi_apis::Common_TextFieldName::audioPassThruDisplayText2)); - text_fields_enum_name.insert( - std::make_pair(std::string("sliderHeader"), - hmi_apis::Common_TextFieldName::sliderHeader)); - text_fields_enum_name.insert( - std::make_pair(std::string("sliderFooter"), - hmi_apis::Common_TextFieldName::sliderFooter)); - text_fields_enum_name.insert( - std::make_pair(std::string("navigationText"), - hmi_apis::Common_TextFieldName::navigationText)); - text_fields_enum_name.insert( - std::make_pair(std::string("notificationText"), - hmi_apis::Common_TextFieldName::notificationText)); - text_fields_enum_name.insert(std::make_pair( - std::string("menuName"), hmi_apis::Common_TextFieldName::menuName)); - text_fields_enum_name.insert( - std::make_pair(std::string("secondaryText"), - hmi_apis::Common_TextFieldName::secondaryText)); - text_fields_enum_name.insert( - std::make_pair(std::string("tertiaryText"), - hmi_apis::Common_TextFieldName::tertiaryText)); - text_fields_enum_name.insert( - std::make_pair(std::string("timeToDestination"), - hmi_apis::Common_TextFieldName::timeToDestination)); - text_fields_enum_name.insert( - std::make_pair(std::string("locationName"), - hmi_apis::Common_TextFieldName::locationName)); - text_fields_enum_name.insert( - std::make_pair(std::string("locationDescription"), - hmi_apis::Common_TextFieldName::locationDescription)); - text_fields_enum_name.insert(std::make_pair( - std::string("turnText"), hmi_apis::Common_TextFieldName::turnText)); - text_fields_enum_name.insert( - std::make_pair(std::string("addressLines"), - hmi_apis::Common_TextFieldName::addressLines)); - text_fields_enum_name.insert(std::make_pair( - std::string("phoneNumber"), hmi_apis::Common_TextFieldName::phoneNumber)); - text_fields_enum_name.insert( - std::make_pair(std::string("subtleAlertText1"), - hmi_apis::Common_TextFieldName::subtleAlertText1)); - text_fields_enum_name.insert( - std::make_pair(std::string("subtleAlertText2"), - hmi_apis::Common_TextFieldName::subtleAlertText2)); - text_fields_enum_name.insert(std::make_pair( - std::string("subtleAlertSoftButtonText"), - hmi_apis::Common_TextFieldName::subtleAlertSoftButtonText)); - text_fields_enum_name.insert(std::make_pair( - std::string("turnText"), hmi_apis::Common_TextFieldName::turnText)); - text_fields_enum_name.insert(std::make_pair( - std::string("menuTitle"), hmi_apis::Common_TextFieldName::menuTitle)); - - media_clock_enum_name.insert(std::make_pair( - std::string("CLOCK1"), hmi_apis::Common_MediaClockFormat::CLOCK1)); - media_clock_enum_name.insert(std::make_pair( - std::string("CLOCK2"), hmi_apis::Common_MediaClockFormat::CLOCK2)); - media_clock_enum_name.insert(std::make_pair( - std::string("CLOCK3"), hmi_apis::Common_MediaClockFormat::CLOCK3)); - media_clock_enum_name.insert( - std::make_pair(std::string("CLOCKTEXT1"), - hmi_apis::Common_MediaClockFormat::CLOCKTEXT1)); - media_clock_enum_name.insert( - std::make_pair(std::string("CLOCKTEXT2"), - hmi_apis::Common_MediaClockFormat::CLOCKTEXT2)); - media_clock_enum_name.insert( - std::make_pair(std::string("CLOCKTEXT3"), - hmi_apis::Common_MediaClockFormat::CLOCKTEXT3)); - media_clock_enum_name.insert( - std::make_pair(std::string("CLOCKTEXT4"), - hmi_apis::Common_MediaClockFormat::CLOCKTEXT4)); - - image_type_enum.insert(std::make_pair(std::string("STATIC"), - hmi_apis::Common_ImageType::STATIC)); - image_type_enum.insert(std::make_pair(std::string("DYNAMIC"), - hmi_apis::Common_ImageType::DYNAMIC)); - - sampling_rate_enum.insert(std::make_pair( - std::string("8KHZ"), hmi_apis::Common_SamplingRate::RATE_8KHZ)); - sampling_rate_enum.insert(std::make_pair( - std::string("16KHZ"), hmi_apis::Common_SamplingRate::RATE_16KHZ)); - sampling_rate_enum.insert(std::make_pair( - std::string("22KHZ"), hmi_apis::Common_SamplingRate::RATE_22KHZ)); - sampling_rate_enum.insert(std::make_pair( - std::string("44KHZ"), hmi_apis::Common_SamplingRate::RATE_44KHZ)); - - bit_per_sample_enum.insert(std::make_pair( - std::string("RATE_8_BIT"), hmi_apis::Common_BitsPerSample::RATE_8_BIT)); - bit_per_sample_enum.insert(std::make_pair( - std::string("RATE_16_BIT"), hmi_apis::Common_BitsPerSample::RATE_16_BIT)); - - audio_type_enum.insert( - std::make_pair(std::string("PCM"), hmi_apis::Common_AudioType::PCM)); - - hmi_zone_enum.insert(std::make_pair( - std::string("FRONT"), hmi_apis::Common_HmiZoneCapabilities::FRONT)); - hmi_zone_enum.insert(std::make_pair( - std::string("BACK"), hmi_apis::Common_HmiZoneCapabilities::BACK)); - - image_field_name_enum.insert( - std::make_pair(std::string("softButtonImage"), - hmi_apis::Common_ImageFieldName::softButtonImage)); - image_field_name_enum.insert( - std::make_pair(std::string("choiceImage"), - hmi_apis::Common_ImageFieldName::choiceImage)); - image_field_name_enum.insert( - std::make_pair(std::string("choiceSecondaryImage"), - hmi_apis::Common_ImageFieldName::choiceSecondaryImage)); - image_field_name_enum.insert(std::make_pair( - std::string("vrHelpItem"), hmi_apis::Common_ImageFieldName::vrHelpItem)); - image_field_name_enum.insert(std::make_pair( - std::string("turnIcon"), hmi_apis::Common_ImageFieldName::turnIcon)); - image_field_name_enum.insert(std::make_pair( - std::string("menuIcon"), hmi_apis::Common_ImageFieldName::menuIcon)); - image_field_name_enum.insert(std::make_pair( - std::string("cmdIcon"), hmi_apis::Common_ImageFieldName::cmdIcon)); - image_field_name_enum.insert(std::make_pair( - std::string("appIcon"), hmi_apis::Common_ImageFieldName::appIcon)); - image_field_name_enum.insert(std::make_pair( - std::string("graphic"), hmi_apis::Common_ImageFieldName::graphic)); - image_field_name_enum.insert( - std::make_pair(std::string("secondaryGraphic"), - hmi_apis::Common_ImageFieldName::secondaryGraphic)); - image_field_name_enum.insert( - std::make_pair(std::string("showConstantTBTIcon"), - hmi_apis::Common_ImageFieldName::showConstantTBTIcon)); - image_field_name_enum.insert(std::make_pair( - std::string("showConstantTBTNextTurnIcon"), - hmi_apis::Common_ImageFieldName::showConstantTBTNextTurnIcon)); - image_field_name_enum.insert( - std::make_pair(std::string("locationImage"), - hmi_apis::Common_ImageFieldName::locationImage)); - image_field_name_enum.insert(std::make_pair( - std::string("alertIcon"), hmi_apis::Common_ImageFieldName::alertIcon)); - image_field_name_enum.insert( - std::make_pair(std::string("subtleAlertIcon"), - hmi_apis::Common_ImageFieldName::subtleAlertIcon)); - - file_type_enum.insert(std::make_pair(std::string("GRAPHIC_BMP"), - hmi_apis::Common_FileType::GRAPHIC_BMP)); - file_type_enum.insert(std::make_pair( - std::string("GRAPHIC_JPEG"), hmi_apis::Common_FileType::GRAPHIC_JPEG)); - file_type_enum.insert(std::make_pair(std::string("GRAPHIC_PNG"), - hmi_apis::Common_FileType::GRAPHIC_PNG)); - file_type_enum.insert(std::make_pair(std::string("AUDIO_WAVE"), - hmi_apis::Common_FileType::AUDIO_WAVE)); - file_type_enum.insert(std::make_pair(std::string("AUDIO_MP3"), - hmi_apis::Common_FileType::AUDIO_MP3)); - file_type_enum.insert(std::make_pair(std::string("AUDIO_AAC"), - hmi_apis::Common_FileType::AUDIO_AAC)); - file_type_enum.insert( - std::make_pair(std::string("BINARY"), hmi_apis::Common_FileType::BINARY)); - file_type_enum.insert( - std::make_pair(std::string("JSON"), hmi_apis::Common_FileType::JSON)); - - display_type_enum.insert( - std::make_pair(std::string("CID"), hmi_apis::Common_DisplayType::CID)); - display_type_enum.insert(std::make_pair(std::string("TYPE2"), - hmi_apis::Common_DisplayType::TYPE2)); - display_type_enum.insert(std::make_pair(std::string("TYPE5"), - hmi_apis::Common_DisplayType::TYPE5)); - display_type_enum.insert( - std::make_pair(std::string("NGN"), hmi_apis::Common_DisplayType::NGN)); - display_type_enum.insert(std::make_pair( - std::string("GEN2_8_DMA"), hmi_apis::Common_DisplayType::GEN2_8_DMA)); - display_type_enum.insert(std::make_pair( - std::string("GEN2_6_DMA"), hmi_apis::Common_DisplayType::GEN2_6_DMA)); - display_type_enum.insert( - std::make_pair(std::string("MFD3"), hmi_apis::Common_DisplayType::MFD3)); - display_type_enum.insert( - std::make_pair(std::string("MFD4"), hmi_apis::Common_DisplayType::MFD4)); - display_type_enum.insert( - std::make_pair(std::string("MFD5"), hmi_apis::Common_DisplayType::MFD5)); - display_type_enum.insert(std::make_pair( - std::string("GEN3_8_INCH"), hmi_apis::Common_DisplayType::GEN3_8_INCH)); - display_type_enum.insert(std::make_pair( - std::string("SDL_GENERIC"), hmi_apis::Common_DisplayType::SDL_GENERIC)); - - character_set_enum.insert(std::make_pair( - std::string("TYPE2SET"), hmi_apis::Common_CharacterSet::TYPE2SET)); - character_set_enum.insert(std::make_pair( - std::string("TYPE5SET"), hmi_apis::Common_CharacterSet::TYPE5SET)); - character_set_enum.insert(std::make_pair( - std::string("CID1SET"), hmi_apis::Common_CharacterSet::CID1SET)); - character_set_enum.insert(std::make_pair( - std::string("CID2SET"), hmi_apis::Common_CharacterSet::CID2SET)); - character_set_enum.insert(std::make_pair( - std::string("ASCII"), hmi_apis::Common_CharacterSet::ASCII)); - character_set_enum.insert(std::make_pair( - std::string("ISO_8859_1"), hmi_apis::Common_CharacterSet::ISO_8859_1)); - character_set_enum.insert(std::make_pair( - std::string("UTF_8"), hmi_apis::Common_CharacterSet::UTF_8)); - - video_streaming_protocol_enum.insert(std::make_pair( - std::string("RAW"), hmi_apis::Common_VideoStreamingProtocol::RAW)); - video_streaming_protocol_enum.insert(std::make_pair( - std::string("RTP"), hmi_apis::Common_VideoStreamingProtocol::RTP)); - video_streaming_protocol_enum.insert(std::make_pair( - std::string("RTSP"), hmi_apis::Common_VideoStreamingProtocol::RTSP)); - video_streaming_protocol_enum.insert(std::make_pair( - std::string("RTMP"), hmi_apis::Common_VideoStreamingProtocol::RTMP)); - video_streaming_protocol_enum.insert(std::make_pair( - std::string("WEBM"), hmi_apis::Common_VideoStreamingProtocol::WEBM)); - - video_streaming_codec_enum.insert(std::make_pair( - std::string("H264"), hmi_apis::Common_VideoStreamingCodec::H264)); - video_streaming_codec_enum.insert(std::make_pair( - std::string("H265"), hmi_apis::Common_VideoStreamingCodec::H265)); - video_streaming_codec_enum.insert(std::make_pair( - std::string("Theora"), hmi_apis::Common_VideoStreamingCodec::Theora)); - video_streaming_codec_enum.insert(std::make_pair( - std::string("VP8"), hmi_apis::Common_VideoStreamingCodec::VP8)); - video_streaming_codec_enum.insert(std::make_pair( - std::string("VP9"), hmi_apis::Common_VideoStreamingCodec::VP9)); -} - -} // namespace - -namespace { /** * @brief Saves smart object content into the JSON node * @param field_name name of the field to save @@ -522,7 +118,6 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr) , seat_location_capability_(NULL) , app_mngr_(app_mngr) , hmi_language_handler_(app_mngr) { - InitCapabilities(); if (false == app_mngr_.get_settings().launch_hmi()) { is_vr_cooperating_ = true; is_tts_cooperating_ = true; @@ -536,6 +131,7 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr) HMICapabilitiesImpl::~HMICapabilitiesImpl() {} bool HMICapabilitiesImpl::VerifyImageType(const int32_t image_type) const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); auto capabilities = display_capabilities(); if (!capabilities) { return false; @@ -631,6 +227,7 @@ void HMICapabilitiesImpl::set_ui_supported_languages( const smart_objects::SmartObject& supported_languages) { auto new_value = std::make_shared<smart_objects::SmartObject>(supported_languages); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); ui_supported_languages_.swap(new_value); } @@ -638,6 +235,7 @@ void HMICapabilitiesImpl::set_tts_supported_languages( const smart_objects::SmartObject& supported_languages) { auto new_value = std::make_shared<smart_objects::SmartObject>(supported_languages); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); tts_supported_languages_.swap(new_value); } @@ -645,6 +243,7 @@ void HMICapabilitiesImpl::set_vr_supported_languages( const smart_objects::SmartObject& supported_languages) { auto new_value = std::make_shared<smart_objects::SmartObject>(supported_languages); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); vr_supported_languages_.swap(new_value); } @@ -655,12 +254,14 @@ void HMICapabilitiesImpl::set_display_capabilities( display_capabilities)) { auto new_value = std::make_shared<smart_objects::SmartObject>(display_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); display_capabilities_.swap(new_value); } } void HMICapabilitiesImpl::set_system_display_capabilities( const smart_objects::SmartObject& display_capabilities) { + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); system_display_capabilities_.reset( new smart_objects::SmartObject(display_capabilities)); } @@ -669,6 +270,7 @@ void HMICapabilitiesImpl::set_hmi_zone_capabilities( const smart_objects::SmartObject& hmi_zone_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(hmi_zone_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); hmi_zone_capabilities_.swap(new_value); } @@ -676,6 +278,7 @@ void HMICapabilitiesImpl::set_soft_button_capabilities( const smart_objects::SmartObject& soft_button_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(soft_button_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); soft_buttons_capabilities_.swap(new_value); } @@ -683,6 +286,7 @@ void HMICapabilitiesImpl::set_button_capabilities( const smart_objects::SmartObject& button_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(button_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); button_capabilities_.swap(new_value); } @@ -690,6 +294,7 @@ void HMICapabilitiesImpl::set_vr_capabilities( const smart_objects::SmartObject& vr_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(vr_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); vr_capabilities_.swap(new_value); } @@ -697,6 +302,7 @@ void HMICapabilitiesImpl::set_speech_capabilities( const smart_objects::SmartObject& speech_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(speech_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); speech_capabilities_.swap(new_value); } @@ -704,6 +310,7 @@ void HMICapabilitiesImpl::set_audio_pass_thru_capabilities( const smart_objects::SmartObject& audio_pass_thru_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>( audio_pass_thru_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); audio_pass_thru_capabilities_.swap(new_value); } @@ -711,6 +318,7 @@ void HMICapabilitiesImpl::set_pcm_stream_capabilities( const smart_objects::SmartObject& pcm_stream_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(pcm_stream_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); pcm_stream_capabilities_.swap(new_value); } @@ -718,12 +326,14 @@ void HMICapabilitiesImpl::set_preset_bank_capabilities( const smart_objects::SmartObject& preset_bank_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(preset_bank_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); preset_bank_capabilities_.swap(new_value); } void HMICapabilitiesImpl::set_vehicle_type( const smart_objects::SmartObject& vehicle_type) { auto new_value = std::make_shared<smart_objects::SmartObject>(vehicle_type); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); vehicle_type_.swap(new_value); } @@ -731,6 +341,7 @@ void HMICapabilitiesImpl::set_prerecorded_speech( const smart_objects::SmartObject& prerecorded_speech) { auto new_value = std::make_shared<smart_objects::SmartObject>(prerecorded_speech); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); prerecorded_speech_.swap(new_value); } @@ -758,6 +369,7 @@ void HMICapabilitiesImpl::set_navigation_capability( const smart_objects::SmartObject& navigation_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(navigation_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); navigation_capability_.swap(new_value); } @@ -765,6 +377,7 @@ void HMICapabilitiesImpl::set_phone_capability( const smart_objects::SmartObject& phone_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(phone_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); phone_capability_.swap(new_value); } @@ -772,12 +385,14 @@ void HMICapabilitiesImpl::set_video_streaming_capability( const smart_objects::SmartObject& video_streaming_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(video_streaming_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); video_streaming_capability_.swap(new_value); } void HMICapabilitiesImpl::set_rc_capability( const smart_objects::SmartObject& rc_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(rc_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); rc_capability_.swap(new_value); } @@ -785,6 +400,7 @@ void HMICapabilitiesImpl::set_driver_distraction_capability( const smart_objects::SmartObject& driver_distraction_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>( driver_distraction_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); driver_distraction_capability_.swap(new_value); } @@ -792,6 +408,7 @@ void HMICapabilitiesImpl::set_seat_location_capability( const smart_objects::SmartObject& seat_location_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(seat_location_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); seat_location_capability_.swap(new_value); } @@ -835,79 +452,95 @@ bool HMICapabilitiesImpl::is_rc_cooperating() const { const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::ui_supported_languages() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return ui_supported_languages_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::vr_supported_languages() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return vr_supported_languages_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::tts_supported_languages() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return tts_supported_languages_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::display_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return display_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::system_display_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return system_display_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::hmi_zone_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return hmi_zone_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::soft_button_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return soft_buttons_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::button_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return button_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::speech_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return speech_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::vr_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return vr_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::audio_pass_thru_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return audio_pass_thru_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::pcm_stream_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return pcm_stream_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::preset_bank_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return preset_bank_capabilities_; } bool HMICapabilitiesImpl::attenuated_supported() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return attenuated_supported_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::vehicle_type() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return vehicle_type_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::prerecorded_speech() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return prerecorded_speech_; } @@ -933,31 +566,37 @@ bool HMICapabilitiesImpl::driver_distraction_supported() const { const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::navigation_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return navigation_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::phone_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return phone_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::video_streaming_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return video_streaming_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::rc_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return rc_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::driver_distraction_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return driver_distraction_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::seat_location_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return seat_location_capability_; } @@ -1015,7 +654,7 @@ struct JsonCapabilitiesGetter { * @param json_cache_node reference to cached JSON capabilities node */ JsonCapabilitiesGetter(Json::Value& json_default_node, - Json::Value& json_cache_node) + const Json::Value& json_cache_node) : json_default_node_(json_default_node) , json_cache_node_(json_cache_node) {} @@ -1150,7 +789,6 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { JsonCapabilitiesGetter json_root_getter(root_json, root_json_override); // UI - if (json_root_getter.IsInterfaceJsonMemberExists(hmi_interface::ui)) { auto json_ui_getter = GetInterfaceGetter(hmi_interface::ui, json_root_getter); @@ -1162,7 +800,8 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { if (!ui_language_node.isNull()) { const std::string lang = ui_language_node.asString(); - set_active_ui_language(MessageHelper::CommonLanguageFromString(lang)); + set_active_ui_language( + StringToEnum<hmi_apis::Common_Language::eType>(lang)); } auto ui_languages_node = json_ui_getter.GetJsonMember( @@ -1187,14 +826,12 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { ui_display_capabilities_node, display_capabilities_so); if (display_capabilities_so.keyExists(hmi_response::display_type)) { - std::map<std::string, - hmi_apis::Common_DisplayType::eType>::const_iterator it = - display_type_enum.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_DisplayType::eType>( (display_capabilities_so[hmi_response::display_type]) .asString()); - display_capabilities_so.erase(hmi_response::display_type); - if (display_type_enum.end() != it) { - display_capabilities_so[hmi_response::display_type] = it->second; + if (hmi_apis::Common_DisplayType::INVALID_ENUM != enum_value) { + display_capabilities_so[hmi_response::display_type] = enum_value; } } @@ -1205,34 +842,34 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { for (uint32_t i = 0; i < kLen; ++i) { if ((display_capabilities_so[hmi_response::text_fields][i]) .keyExists(strings::name)) { - std::map<std::string, - hmi_apis::Common_TextFieldName::eType>::const_iterator - it_text_field_name = text_fields_enum_name.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_TextFieldName::eType>( display_capabilities_so[hmi_response::text_fields][i] [strings::name] .asString()); + display_capabilities_so[hmi_response::text_fields][i].erase( strings::name); - if (text_fields_enum_name.end() != it_text_field_name) { + + if (hmi_apis::Common_TextFieldName::INVALID_ENUM != enum_value) { display_capabilities_so[hmi_response::text_fields][i] - [strings::name] = - it_text_field_name->second; + [strings::name] = enum_value; } } if ((display_capabilities_so[hmi_response::text_fields][i]) .keyExists(strings::character_set)) { - std::map<std::string, - hmi_apis::Common_CharacterSet::eType>::const_iterator - it_characte_set = character_set_enum.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_CharacterSet::eType>( display_capabilities_so[hmi_response::text_fields][i] [strings::character_set] .asString()); + display_capabilities_so[hmi_response::text_fields][i].erase( strings::character_set); - if (character_set_enum.end() != it_characte_set) { + + if (hmi_apis::Common_CharacterSet::INVALID_ENUM != enum_value) { display_capabilities_so[hmi_response::text_fields][i] - [strings::character_set] = - it_characte_set->second; + [strings::character_set] = enum_value; } } } @@ -1243,13 +880,12 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { display_capabilities_so[hmi_response::image_fields]; for (uint32_t i = 0; i < array_image_fields.length(); ++i) { if (array_image_fields[i].keyExists(strings::name)) { - std::map<std::string, - hmi_apis::Common_ImageFieldName::eType>::const_iterator - it = image_field_name_enum.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_ImageFieldName::eType>( (array_image_fields[i][strings::name]).asString()); array_image_fields[i].erase(strings::name); - if (image_field_name_enum.end() != it) { - array_image_fields[i][strings::name] = it->second; + if (hmi_apis::Common_ImageFieldName::INVALID_ENUM != enum_value) { + array_image_fields[i][strings::name] = enum_value; } } if (array_image_fields[i].keyExists( @@ -1261,12 +897,11 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { for (uint32_t k = 0, j = 0; k < image_type_supported_array.length(); ++k) { - std::map<std::string, - hmi_apis::Common_FileType::eType>::const_iterator it = - file_type_enum.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_FileType::eType>( (image_type_supported_array[k]).asString()); - if (file_type_enum.end() != it) { - image_type_supported_enum[j++] = it->second; + if (hmi_apis::Common_FileType::INVALID_ENUM != enum_value) { + image_type_supported_enum[j++] = enum_value; } } array_image_fields[i].erase(strings::image_type_supported); @@ -1283,12 +918,11 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { smart_objects::SmartType_Array); for (uint32_t i = 0, j = 0; i < media_clock_formats_array.length(); ++i) { - std::map<std::string, - hmi_apis::Common_MediaClockFormat::eType>::const_iterator - it = media_clock_enum_name.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_MediaClockFormat::eType>( (media_clock_formats_array[i]).asString()); - if (media_clock_enum_name.end() != it) { - media_clock_formats_enum[j++] = it->second; + if (hmi_apis::Common_MediaClockFormat::INVALID_ENUM != enum_value) { + media_clock_formats_enum[j++] = enum_value; } } display_capabilities_so.erase(hmi_response::media_clock_formats); @@ -1304,11 +938,11 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { smart_objects::SmartType_Array); for (uint32_t i = 0, j = 0; i < image_capabilities_array.length(); ++i) { - std::map<std::string, - hmi_apis::Common_ImageType::eType>::const_iterator it = - image_type_enum.find((image_capabilities_array[i]).asString()); - if (image_type_enum.end() != it) { - image_capabilities_enum[j++] = it->second; + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_ImageType::eType>( + (image_capabilities_array[i]).asString()); + if (hmi_apis::Common_ImageType::INVALID_ENUM != enum_value) { + image_capabilities_enum[j++] = enum_value; } } display_capabilities_so.erase(hmi_response::image_capabilities); @@ -1351,18 +985,20 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { pcm_capabilities_so); set_pcm_stream_capabilities(pcm_capabilities_so); } - auto ui_hmi_zone_capabilities_node = json_ui_getter.GetJsonMember(hmi_response::hmi_zone_capabilities, hmi_apis::FunctionID::UI_GetCapabilities, requests_required_for_capabilities_); if (!ui_hmi_zone_capabilities_node.isNull()) { - smart_objects::SmartObject hmi_zone_capabilities_so = - smart_objects::SmartObject(smart_objects::SmartType_Array); - hmi_zone_capabilities_so = - hmi_zone_enum.find(ui_hmi_zone_capabilities_node.asString()) - ->second; - set_hmi_zone_capabilities(hmi_zone_capabilities_so); + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_HmiZoneCapabilities::eType>( + ui_hmi_zone_capabilities_node.asString()); + if (hmi_apis::Common_HmiZoneCapabilities::INVALID_ENUM != enum_value) { + smart_objects::SmartObject hmi_zone_capabilities_so( + smart_objects::SmartType_Array); + hmi_zone_capabilities_so = enum_value; + set_hmi_zone_capabilities(hmi_zone_capabilities_so); + } } auto ui_soft_button_capabilities_node = @@ -1425,26 +1061,23 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { continue; } - std::map<std::string, - hmi_apis::Common_VideoStreamingProtocol::eType>:: - const_iterator it_protocol = - video_streaming_protocol_enum.find( - supported_format_array[i][strings::protocol] - .asString()); - - std::map<std::string, - hmi_apis::Common_VideoStreamingCodec::eType>:: - const_iterator it_codec = video_streaming_codec_enum.find( - supported_format_array[i][strings::codec].asString()); + auto enum_value_protocol = ConvertStringToEnum< + hmi_apis::Common_VideoStreamingProtocol::eType>( + supported_format_array[i][strings::protocol].asString()); + auto enum_value_codec = ConvertStringToEnum< + hmi_apis::Common_VideoStreamingCodec::eType>( + supported_format_array[i][strings::codec].asString()); // format is valid only if both protocol and codec are converted // to enum values successfully - if (it_protocol != video_streaming_protocol_enum.end() && - it_codec != video_streaming_codec_enum.end()) { + if (hmi_apis::Common_VideoStreamingProtocol::INVALID_ENUM != + enum_value_protocol && + hmi_apis::Common_VideoStreamingCodec::INVALID_ENUM != + enum_value_codec) { smart_objects::SmartObject format_so = smart_objects::SmartObject(smart_objects::SmartType_Map); - format_so[strings::protocol] = it_protocol->second; - format_so[strings::codec] = it_codec->second; + format_so[strings::protocol] = enum_value_protocol; + format_so[strings::codec] = enum_value_codec; converted_array[j++] = format_so; } } @@ -1456,6 +1089,7 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { set_video_streaming_supported(true); } } + if (JsonIsMemberSafe(ui_system_capabilities_node, strings::driver_distraction_capability)) { Json::Value dd_capability = ui_system_capabilities_node.get( @@ -1497,7 +1131,7 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { auto it = lights.asArray()->begin(); for (; it != lights.asArray()->end(); ++it) { smart_objects::SmartObject& light_name_so = (*it)[strings::name]; - auto light_name = MessageHelper::CommonLightNameFromString( + auto light_name = StringToEnum<hmi_apis::Common_LightName::eType>( light_name_so.asString()); light_name_so = light_name; } @@ -1540,7 +1174,8 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { requests_required_for_capabilities_); if (!vr_language_node.isNull()) { const std::string lang = vr_language_node.asString(); - set_active_vr_language(MessageHelper::CommonLanguageFromString(lang)); + set_active_vr_language( + StringToEnum<hmi_apis::Common_Language::eType>(lang)); } auto vr_languages_node = json_vr_getter.GetJsonMember( @@ -1581,7 +1216,8 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { requests_required_for_capabilities_); if (!tts_language_node.isNull()) { const std::string lang = tts_language_node.asString(); - set_active_tts_language(MessageHelper::CommonLanguageFromString(lang)); + set_active_tts_language( + StringToEnum<hmi_apis::Common_Language::eType>(lang)); } auto tts_languages_node = json_tts_getter.GetJsonMember( @@ -1640,13 +1276,11 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { for (uint32_t i = 0; i < buttons_capabilities_so.length(); ++i) { if ((buttons_capabilities_so[i]).keyExists(strings::name)) { - std::map<std::string, - hmi_apis::Common_ButtonName::eType>::const_iterator it = - button_enum_name.find( + auto enum_value = + ConvertStringToEnum<hmi_apis::Common_ButtonName::eType>( (buttons_capabilities_so[i][strings::name]).asString()); - buttons_capabilities_so[i].erase(strings::name); - if (button_enum_name.end() != it) { - buttons_capabilities_so[i][strings::name] = it->second; + if (hmi_apis::Common_ButtonName::INVALID_ENUM != enum_value) { + buttons_capabilities_so[i][strings::name] = enum_value; } } } @@ -1690,7 +1324,7 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { return false; } return true; -} +} // namespace application_manager hmi_apis::Common_Language::eType HMICapabilitiesImpl::GetActiveLanguageForInterface( @@ -1779,8 +1413,8 @@ bool HMICapabilitiesImpl::AllFieldsSaved( GetActiveLanguageForInterface(interface_name); const auto json_language = interface_node[hmi_response::language]; - if (active_language != - MessageHelper::CommonLanguageFromString(json_language.asString())) { + if (active_language != StringToEnum<hmi_apis::Common_Language::eType>( + json_language.asString())) { SDL_LOG_DEBUG("Active " << interface_name << " language is not the same as the persisted " "one. Field should be overwritten"); @@ -1919,8 +1553,7 @@ void HMICapabilitiesImpl::PrepareUiJsonValueForSaving( } else if (section_to_update == hmi_response::language) { - out_node[hmi_response::language] = - MessageHelper::CommonLanguageToString(active_ui_language()); + out_node[hmi_response::language] = EnumToString(active_ui_language()); } else if (section_to_update == hmi_response::languages) { @@ -1943,8 +1576,7 @@ void HMICapabilitiesImpl::PrepareVrJsonValueForSaving( for (const auto& section_to_update : sections_to_update) { if (section_to_update == hmi_response::language) { - out_node[hmi_response::language] = - MessageHelper::CommonLanguageToString(active_vr_language()); + out_node[hmi_response::language] = EnumToString(active_vr_language()); } if (section_to_update == hmi_response::languages) { @@ -1967,8 +1599,7 @@ void HMICapabilitiesImpl::PrepareTtsJsonValueForSaving( for (const auto& section_to_update : sections_to_update) { if (section_to_update == hmi_response::language) { - out_node[hmi_response::language] = - MessageHelper::CommonLanguageToString(active_tts_language()); + out_node[hmi_response::language] = EnumToString(active_tts_language()); } if (section_to_update == hmi_response::languages) { @@ -2233,8 +1864,8 @@ void HMICapabilitiesImpl::convert_json_languages_to_obj( const Json::Value& json_languages, smart_objects::SmartObject& languages) const { for (uint32_t i = 0, j = 0; i < json_languages.size(); ++i) { - languages[j++] = - MessageHelper::CommonLanguageFromString(json_languages[i].asString()); + languages[j++] = StringToEnum<hmi_apis::Common_Language::eType>( + json_languages[i].asString()); } } @@ -2243,19 +1874,18 @@ void HMICapabilitiesImpl::convert_audio_capability_to_obj( smart_objects::SmartObject& output_so) const { if (JsonIsMemberSafe(capability, "samplingRate")) { output_so[strings::sampling_rate] = - sampling_rate_enum.find(capability.get("samplingRate", "").asString()) - ->second; + ConvertStringToEnum<hmi_apis::Common_SamplingRate::eType>( + capability.get("samplingRate", "").asString()); } if (JsonIsMemberSafe(capability, "bitsPerSample")) { output_so[strings::bits_per_sample] = - bit_per_sample_enum - .find(capability.get("bitsPerSample", "").asString()) - ->second; + ConvertStringToEnum<hmi_apis::Common_BitsPerSample::eType>( + capability.get("bitsPerSample", "").asString()); } if (JsonIsMemberSafe(capability, "audioType")) { output_so[strings::audio_type] = - audio_type_enum.find(capability.get("audioType", "").asString()) - ->second; + ConvertStringToEnum<hmi_apis::Common_AudioType::eType>( + capability.get("audioType", "").asString()); } } diff --git a/src/components/application_manager/src/hmi_state.cc b/src/components/application_manager/src/hmi_state.cc index 3dadd8c193..3487116baf 100644 --- a/src/components/application_manager/src/hmi_state.cc +++ b/src/components/application_manager/src/hmi_state.cc @@ -242,6 +242,10 @@ PhoneCallHmiState::PhoneCallHmiState(std::shared_ptr<Application> app, : HmiState(app, app_mngr, STATE_ID_PHONE_CALL) {} mobile_apis::HMILevel::eType PhoneCallHmiState::hmi_level() const { + using namespace mobile_apis; + if (HMILevel::INVALID_ENUM == parent_hmi_level()) { + return parent_hmi_level(); + } return std::max(parent_hmi_level(), max_hmi_level()); } @@ -272,6 +276,10 @@ DeactivateHMI::DeactivateHMI(std::shared_ptr<Application> app, : HmiState(app, app_mngr, STATE_ID_DEACTIVATE_HMI) {} mobile_apis::HMILevel::eType DeactivateHMI::hmi_level() const { + using namespace mobile_apis; + if (HMILevel::INVALID_ENUM == parent_hmi_level()) { + return parent_hmi_level(); + } return std::max(parent_hmi_level(), max_hmi_level()); } @@ -296,6 +304,10 @@ AudioSource::AudioSource(std::shared_ptr<Application> app, mobile_apis::HMILevel::eType AudioSource::hmi_level() const { using namespace mobile_apis; + if (HMILevel::INVALID_ENUM == parent_hmi_level()) { + return parent_hmi_level(); + } + if (WindowType::WIDGET == window_type() || keep_context_) { return std::max(parent_hmi_level(), max_hmi_level()); } @@ -368,6 +380,10 @@ mobile_apis::HMILevel::eType EmbeddedNavi::hmi_level() const { using namespace mobile_apis; using namespace helpers; + if (HMILevel::INVALID_ENUM == parent_hmi_level()) { + return parent_hmi_level(); + } + if (WindowType::WIDGET == window_type()) { return std::max(parent_hmi_level(), max_hmi_level()); } @@ -426,6 +442,8 @@ const StateID2StrMap kStateID2StrMap = HmiState::StateID::STATE_ID_EMBEDDED_NAVI, "EMBEDDED_NAVI"); } // anonymous namespace +// cppcheck-suppress unusedFunction //Used in the next +// overload of operator<< std::ostream& operator<<(std::ostream& os, const HmiState::StateID src) { try { os << kStateID2StrMap.left.at(src); diff --git a/src/components/application_manager/src/message_helper/message_helper.cc b/src/components/application_manager/src/message_helper/message_helper.cc index c5cc11bbe5..ba1c726415 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -107,7 +107,7 @@ bool ValidateSoftButtons(smart_objects::SmartObject& soft_buttons) { struct GroupsAppender : std::unary_function<void, const PermissionsList::value_type&> { - GroupsAppender(smart_objects::SmartObject& groups) + explicit GroupsAppender(smart_objects::SmartObject& groups) : groups_(groups), index_(0) {} void operator()(const PermissionsList::value_type& item) { @@ -135,7 +135,7 @@ struct GroupsAppender struct ExternalConsentStatusAppender : std::unary_function<void, const policy::ExternalConsentStatus::value_type&> { - ExternalConsentStatusAppender(smart_objects::SmartObject& status) + explicit ExternalConsentStatusAppender(smart_objects::SmartObject& status) : status_(status), index_(0) {} void operator()(const policy::ExternalConsentStatus::value_type& item) { @@ -301,28 +301,6 @@ const uint32_t MessageHelper::GetPriorityCode(const std::string& priority) { return static_cast<uint32_t>(hmi_apis::Common_AppPriority::INVALID_ENUM); } -hmi_apis::Common_Language::eType MessageHelper::CommonLanguageFromString( - const std::string& language) { - using namespace ns_smart_device_link::ns_smart_objects; - hmi_apis::Common_Language::eType value; - if (EnumConversionHelper<hmi_apis::Common_Language::eType>::StringToEnum( - language, &value)) { - return value; - } - return hmi_apis::Common_Language::INVALID_ENUM; -} - -hmi_apis::Common_LightName::eType MessageHelper::CommonLightNameFromString( - const std::string& lightName) { - using namespace ns_smart_device_link::ns_smart_objects; - hmi_apis::Common_LightName::eType value; - if (EnumConversionHelper<hmi_apis::Common_LightName::eType>::StringToEnum( - lightName, &value)) { - return value; - } - return hmi_apis::Common_LightName::INVALID_ENUM; -} - std::string MessageHelper::GetDeviceMacAddressForHandle( const transport_manager::DeviceHandle device_handle, const ApplicationManager& app_mngr) { @@ -333,26 +311,6 @@ std::string MessageHelper::GetDeviceMacAddressForHandle( return device_mac_address; } -std::string MessageHelper::CommonLanguageToString( - hmi_apis::Common_Language::eType language) { - using namespace ns_smart_device_link::ns_smart_objects; - const char* str = 0; - if (EnumConversionHelper<hmi_apis::Common_Language::eType>::EnumToCString( - language, &str)) { - return str ? str : ""; - } - return std::string(); -} - -std::string MessageHelper::MobileLanguageToString( - mobile_apis::Language::eType language) { - using namespace ns_smart_device_link::ns_smart_objects; - const char* str = 0; - EnumConversionHelper<mobile_apis::Language::eType>::EnumToCString(language, - &str); - return str ? str : std::string(); -} - smart_objects::SmartObjectSPtr MessageHelper::CreateMessageForHMI( const hmi_apis::messageType::eType message_type, const uint32_t correlation_id) { @@ -710,23 +668,23 @@ void MessageHelper::SendDeleteSubmenuRequest(smart_objects::SmartObject* cmd, if ((*cmd)[strings::menu_id].asInt() == (*it->second)[strings::menu_params][hmi_request::parent_id].asInt()) { - SmartObject msg_params = SmartObject(smart_objects::SmartType_Map); - msg_params[strings::cmd_id] = (*it->second)[strings::cmd_id].asInt(); - msg_params[strings::app_id] = application->app_id(); - msg_params[strings::grammar_id] = application->get_grammar_id(); - msg_params[strings::type] = hmi_apis::Common_VRCommandType::Command; + SmartObject params = SmartObject(smart_objects::SmartType_Map); + params[strings::cmd_id] = (*it->second)[strings::cmd_id].asInt(); + params[strings::app_id] = application->app_id(); + params[strings::grammar_id] = application->get_grammar_id(); + params[strings::type] = hmi_apis::Common_VRCommandType::Command; - SmartObjectSPtr message = CreateMessageForHMI( + SmartObjectSPtr hmi_message = CreateMessageForHMI( hmi_apis::messageType::request, app_mngr.GetNextHMICorrelationID()); - DCHECK(message); + DCHECK(hmi_message); - SmartObject& object = *message; - object[strings::params][strings::function_id] = + SmartObject& smart_object = *hmi_message; + smart_object[strings::params][strings::function_id] = hmi_apis::FunctionID::VR_DeleteCommand; - object[strings::msg_params] = msg_params; + smart_object[strings::msg_params] = params; - app_mngr.GetRPCService().ManageHMICommand(message); + app_mngr.GetRPCService().ManageHMICommand(hmi_message); } } } @@ -767,9 +725,7 @@ void MessageHelper::SendResetPropertiesRequest(ApplicationSharedPtr application, using namespace smart_objects; { - SmartObject msg_params = SmartObject(smart_objects::SmartType_Map); - - msg_params = *MessageHelper::CreateAppVrHelp(application); + SmartObject msg_params = *MessageHelper::CreateAppVrHelp(application); msg_params[hmi_request::menu_title] = ""; smart_objects::SmartObject keyboard_properties = @@ -848,66 +804,22 @@ const VehicleData& MessageHelper::vehicle_data() { return vehicle_data_; } -std::string MessageHelper::HMIResultToString( - hmi_apis::Common_Result::eType hmi_result) { - using namespace ns_smart_device_link::ns_smart_objects; - const char* str = 0; - if (EnumConversionHelper<hmi_apis::Common_Result::eType>::EnumToCString( - hmi_result, &str)) { - return str; - } - return std::string(); -} - -hmi_apis::Common_Result::eType MessageHelper::HMIResultFromString( - const std::string& hmi_result) { - using namespace ns_smart_device_link::ns_smart_objects; - hmi_apis::Common_Result::eType value; - if (EnumConversionHelper<hmi_apis::Common_Result::eType>::StringToEnum( - hmi_result, &value)) { - return value; - } - return hmi_apis::Common_Result::INVALID_ENUM; -} - -std::string MessageHelper::MobileResultToString( - mobile_apis::Result::eType mobile_result) { - using namespace ns_smart_device_link::ns_smart_objects; - const char* str = 0; - if (EnumConversionHelper<mobile_apis::Result::eType>::EnumToCString( - mobile_result, &str)) { - return str; - } - return std::string(); -} - -mobile_apis::Result::eType MessageHelper::MobileResultFromString( - const std::string& mobile_result) { - using namespace ns_smart_device_link::ns_smart_objects; - mobile_apis::Result::eType value; - if (EnumConversionHelper<mobile_apis::Result::eType>::StringToEnum( - mobile_result, &value)) { - return value; - } - return mobile_apis::Result::INVALID_ENUM; -} - mobile_apis::Result::eType MessageHelper::HMIToMobileResult( const hmi_apis::Common_Result::eType hmi_result) { - const std::string result = HMIResultToString(hmi_result); + const std::string result = EnumToString(hmi_result); if (result.empty()) { return mobile_api::Result::INVALID_ENUM; } - return MobileResultFromString(result); + return StringToEnum<mobile_apis::Result::eType>(result); } hmi_apis::Common_Result::eType MessageHelper::MobileToHMIResult( const mobile_apis::Result::eType mobile_result) { - const std::string result = MobileResultToString(mobile_result); + const std::string result = EnumToString(mobile_result); if (result.empty()) { return hmi_apis::Common_Result::INVALID_ENUM; } - return HMIResultFromString(result); + return StringToEnum<hmi_apis::Common_Result::eType>(result); } smart_objects::SmartObjectSPtr MessageHelper::CreateHMIStatusNotification( @@ -1001,28 +913,6 @@ void MessageHelper::SendActivateAppToHMI( application_manager.GetRPCService().ManageHMICommand(message); } -mobile_apis::HMILevel::eType MessageHelper::StringToHMILevel( - const std::string& hmi_level) { - using namespace ns_smart_device_link::ns_smart_objects; - mobile_apis::HMILevel::eType value; - if (EnumConversionHelper<mobile_apis::HMILevel::eType>::StringToEnum( - hmi_level, &value)) { - return value; - } - return mobile_apis::HMILevel::INVALID_ENUM; -} - -std::string MessageHelper::StringifiedHMILevel( - const mobile_apis::HMILevel::eType hmi_level) { - using namespace ns_smart_device_link::ns_smart_objects; - const char* str = 0; - if (EnumConversionHelper<mobile_apis::HMILevel::eType>::EnumToCString( - hmi_level, &str)) { - return str; - } - return std::string(); -} - std::string MessageHelper::StringifiedFunctionID( mobile_apis::FunctionID::eType function_id) { SDL_LOG_AUTO_TRACE(); @@ -1060,7 +950,7 @@ void MessageHelper::CreateGetVehicleDataRequest( smart_objects::SmartObject(smart_objects::SmartType_Map); for (std::vector<std::string>::const_iterator it = params.begin(); it != params.end(); - it++) { + ++it) { (*request)[strings::msg_params][*it] = true; } app_mngr.GetRPCService().ManageHMICommand(request); @@ -1337,8 +1227,6 @@ MessageHelper::CreateGlobalPropertiesRequestsToHMI( ApplicationConstSharedPtr app, ApplicationManager& app_mngr) { SDL_LOG_AUTO_TRACE(); - uint32_t correlation_id = app_mngr.GetNextHMICorrelationID(); - smart_objects::SmartObjectList requests; if (app.use_count() == 0) { SDL_LOG_ERROR("Invalid application"); @@ -1398,7 +1286,7 @@ MessageHelper::CreateGlobalPropertiesRequestsToHMI( // TTS global properties if (can_send_vr && (app->help_prompt() || app->timeout_prompt())) { - correlation_id = app_mngr.GetNextHMICorrelationID(); + uint32_t correlation_id = app_mngr.GetNextHMICorrelationID(); smart_objects::SmartObjectSPtr tts_global_properties = CreateMessageForHMI(hmi_apis::messageType::request, correlation_id); if (!tts_global_properties) { @@ -1657,8 +1545,6 @@ MessageHelper::CreateAddVRCommandRequestFromChoiceToHMI( msg_params[strings::cmd_id] = (*(it->second))[strings::choice_set][j][strings::choice_id]; msg_params[strings::vr_commands] = - smart_objects::SmartObject(smart_objects::SmartType_Array); - msg_params[strings::vr_commands] = (*(it->second))[strings::choice_set][j][strings::vr_commands]; msg_params[strings::type] = hmi_apis::Common_VRCommandType::Choice; msg_params[strings::grammar_id] = choice_grammar_id; @@ -2798,9 +2684,9 @@ void MessageHelper::SendSystemRequestNotification( content[strings::params][strings::connection_key] = connection_key; PrintSmartObject(content); - DCHECK(app_mngr.GetRPCService().ManageMobileCommand( + app_mngr.GetRPCService().ManageMobileCommand( std::make_shared<smart_objects::SmartObject>(content), - commands::Command::SOURCE_SDL)); + commands::Command::SOURCE_SDL); } void MessageHelper::SendLaunchApp(const uint32_t connection_key, @@ -3460,10 +3346,7 @@ mobile_apis::Result::eType MessageHelper::ProcessSoftButtons( } break; } - default: { - continue; - break; - } + default: { continue; } } soft_buttons[j++] = request_soft_buttons[i]; diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 8ec21660a8..b61a75d7de 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -30,12 +30,14 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "application_manager/policies/policy_handler.h" + #include <dlfcn.h> #include <unistd.h> #include <algorithm> #include <functional> #include <utility> #include <vector> + #include "application_manager/application_manager.h" #include "application_manager/message_helper.h" #include "application_manager/policies/delegates/app_permission_delegate.h" @@ -137,21 +139,24 @@ struct HMILevelPredicate mobile_api::HMILevel::eType level_; }; +constexpr char kLibraryNotLoadedMessage[] = + "The shared library of policy is not loaded"; + } // namespace -#define POLICY_LIB_CHECK_OR_RETURN(return_value) \ +#define POLICY_LIB_CHECK_OR_RETURN(policy_manager, return_value) \ { \ sync_primitives::AutoReadLock lock(policy_manager_lock_); \ - if (!policy_manager_) { \ + if (!policy_manager) { \ SDL_LOG_DEBUG("The shared library of policy is not loaded"); \ return return_value; \ } \ } -#define POLICY_LIB_CHECK_VOID() \ +#define POLICY_LIB_CHECK_VOID(policy_manager) \ { \ sync_primitives::AutoReadLock lock(policy_manager_lock_); \ - if (!policy_manager_) { \ + if (!policy_manager) { \ SDL_LOG_DEBUG("The shared library of policy is not loaded"); \ return; \ } \ @@ -308,7 +313,7 @@ PolicyHandler::~PolicyHandler() {} PolicyEncryptionFlagGetterInterfaceSPtr PolicyHandler::PolicyEncryptionFlagGetter() const { - return policy_manager_; + return LoadPolicyManager(); } bool PolicyHandler::PolicyEnabled() const { @@ -317,55 +322,71 @@ bool PolicyHandler::PolicyEnabled() const { bool PolicyHandler::LoadPolicyLibrary() { SDL_LOG_AUTO_TRACE(); - sync_primitives::AutoWriteLock lock(policy_manager_lock_); - if (!PolicyEnabled()) { - SDL_LOG_WARN( - "System is configured to work without policy " - "functionality."); - policy_manager_.reset(); - return false; - } - if (CreateManager()) { - policy_manager_->set_listener(this); - event_observer_ = std::shared_ptr<PolicyEventObserver>( - new PolicyEventObserver(this, application_manager_.event_dispatcher())); - } + auto create_policy_manager_instance = [this]() { + if (!PolicyEnabled()) { + SDL_LOG_WARN( + "System is configured to work without policy " + "functionality."); + return std::shared_ptr<PolicyManager>(); + } - return (policy_manager_.use_count() != 0); -} + ExchangePolicyManager(nullptr); + sync_primitives::AutoWriteLock lock(policy_manager_lock_); + void* const dl_policy_handle = dlopen(kLibrary.c_str(), RTLD_LAZY); -bool PolicyHandler::CreateManager() { - void* policy_handle = dlopen(kLibrary.c_str(), RTLD_LAZY); - const char* error = dlerror(); - if (!policy_handle) { - SDL_LOG_ERROR((error == NULL - ? "Unknown error in dlopen while loading policy table" - : error)); - return false; - } + if (!dl_policy_handle) { + SDL_LOG_ERROR("An error occurs while calling dlopen"); + return std::shared_ptr<PolicyManager>(); + } - typedef PolicyManager* (*CreateManager)(logger::Logger*); - typedef void (*DeleteManager)(PolicyManager*); - CreateManager create_manager = - reinterpret_cast<CreateManager>(dlsym(policy_handle, "CreateManager")); - DeleteManager delete_manager = - reinterpret_cast<DeleteManager>(dlsym(policy_handle, "DeleteManager")); - auto policy_destroyer = [delete_manager, - policy_handle](PolicyManager* policy_manager) { - SDL_LOG_DEBUG("Delete Policy Manager"); - delete_manager(policy_manager); - dlclose(policy_handle); - }; - char* error_string = dlerror(); - if (NULL == error_string) { - policy_manager_ = std::shared_ptr<PolicyManager>( + typedef PolicyManager* (*CreateManager)(logger::Logger*); + typedef void (*DeleteManager)(PolicyManager*); + + CreateManager create_manager = reinterpret_cast<CreateManager>( + dlsym(dl_policy_handle, "CreateManager")); + char* error_string = dlerror(); + if (NULL != error_string) { + SDL_LOG_WARN(error_string); + dlclose(dl_policy_handle); + return std::shared_ptr<PolicyManager>(); + } + + DeleteManager delete_manager = reinterpret_cast<DeleteManager>( + dlsym(dl_policy_handle, "DeleteManager")); + + error_string = dlerror(); + if (NULL != error_string) { + SDL_LOG_WARN(error_string); + dlclose(dl_policy_handle); + return std::shared_ptr<PolicyManager>(); + } + + auto policy_destroyer = [delete_manager, + dl_policy_handle](PolicyManager* policy_manager) { + SDL_LOG_DEBUG("Delete Policy Manager"); + delete_manager(policy_manager); + dlclose(dl_policy_handle); + }; + + auto policy_manager = std::shared_ptr<PolicyManager>( create_manager(&logger::Logger::instance()), policy_destroyer); - } else { - SDL_LOG_WARN(error_string); - dlclose(policy_handle); + + policy_manager->set_listener(this); + + return policy_manager; + }; + + auto policy_manager = create_policy_manager_instance(); + + if (!policy_manager) { + return false; } - return (policy_manager_.use_count() != 0); + + ExchangePolicyManager(policy_manager); + event_observer_ = std::make_shared<PolicyEventObserver>( + this, application_manager_.event_dispatcher()); + return true; } const PolicySettings& PolicyHandler::get_settings() const { @@ -374,11 +395,13 @@ const PolicySettings& PolicyHandler::get_settings() const { bool PolicyHandler::InitPolicyTable() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false) + std::string preloaded_file = get_settings().preloaded_pt_file(); if (file_system::FileExists(preloaded_file)) { const bool pt_inited = - policy_manager_->InitPT(preloaded_file, &get_settings()); + policy_manager->InitPT(preloaded_file, &get_settings()); OnPTInited(); return pt_inited; } @@ -398,20 +421,22 @@ void PolicyHandler::OnPTInited() { void PolicyHandler::StopRetrySequence() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); #ifndef EXTERNAL_PROPRIETARY_MODE // Clear cached PTU app last_ptu_app_id_ = 0; #endif // EXTERNAL_PROPRIETARY_MODE - policy_manager_->StopRetrySequence(); + policy_manager->StopRetrySequence(); } bool PolicyHandler::ResetPolicyTable() { SDL_LOG_TRACE("Reset policy table."); - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false) std::string preloaded_file = get_settings().preloaded_pt_file(); if (file_system::FileExists(preloaded_file)) { - return policy_manager_->ResetPT(preloaded_file); + return policy_manager->ResetPT(preloaded_file); } SDL_LOG_WARN("The file which contains preloaded PT is not exist"); return false; @@ -419,8 +444,9 @@ bool PolicyHandler::ResetPolicyTable() { bool PolicyHandler::ClearUserConsent() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->ResetUserConsent(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false) + return policy_manager->ResetUserConsent(); } #ifndef EXTERNAL_PROPRIETARY_MODE @@ -454,7 +480,6 @@ void PolicyHandler::CacheRetryInfo(const uint32_t app_id, uint32_t PolicyHandler::GetAppIdForSending() const { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(0); // fix ApplicationSet access crash const ApplicationSet accessor = application_manager_.applications().GetData(); @@ -494,28 +519,30 @@ uint32_t PolicyHandler::GetAppIdForSending() const { void PolicyHandler::PushAppIdToPTUQueue(const uint32_t app_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); sync_primitives::AutoLock lock(app_id_queue_lock_); const auto result = applications_ptu_queue_.insert(app_id); if (result.second) { - policy_manager_->UpdatePTUReadyAppsCount(applications_ptu_queue_.size()); + policy_manager->UpdatePTUReadyAppsCount(applications_ptu_queue_.size()); } } void PolicyHandler::PopAppIdFromPTUQueue() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); sync_primitives::AutoLock lock(app_id_queue_lock_); if (applications_ptu_queue_.size() > 0) { applications_ptu_queue_.erase(applications_ptu_queue_.begin()); - policy_manager_->UpdatePTUReadyAppsCount(applications_ptu_queue_.size()); + policy_manager->UpdatePTUReadyAppsCount(applications_ptu_queue_.size()); } } #ifdef EXTERNAL_PROPRIETARY_MODE PTURetryHandler& PolicyHandler::ptu_retry_handler() const { SDL_LOG_AUTO_TRACE(); - return *policy_manager_; + return *atomic_policy_manager_; } void PolicyHandler::OnAppPermissionConsent( @@ -538,7 +565,8 @@ void PolicyHandler::OnAppPermissionConsent( void PolicyHandler::OnDeviceConsentChanged(const std::string& device_id, const bool is_allowed) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); connection_handler::DeviceHandle device_handle; if (!application_manager_.connection_handler().GetDeviceID(device_id, &device_handle)) { @@ -563,15 +591,15 @@ void PolicyHandler::OnDeviceConsentChanged(const std::string& device_id, // with negative data consent, there no necessity to change smth and // send // notification for such app in case of device consent is not allowed - if (policy_manager_->IsPredataPolicy(policy_app_id) && !is_allowed) { + if (policy_manager->IsPredataPolicy(policy_app_id) && !is_allowed) { continue; } - policy_manager_->ReactOnUserDevConsentForApp( + policy_manager->ReactOnUserDevConsentForApp( device_handle, policy_app_id, is_allowed); - policy_manager_->SendNotificationOnPermissionsUpdated(device_id, - policy_app_id); + policy_manager->SendNotificationOnPermissionsUpdated(device_id, + policy_app_id); } } } @@ -604,8 +632,9 @@ void PolicyHandler::SendOnAppPropertiesChangeNotification( void PolicyHandler::OnPTExchangeNeeded() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->ForcePTExchange(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->ForcePTExchange(); } void PolicyHandler::GetAvailableApps(std::queue<std::string>& apps) { @@ -630,22 +659,26 @@ StatusNotifier PolicyHandler::AddApplication( const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) { - POLICY_LIB_CHECK_OR_RETURN(std::make_shared<utils::CallNothing>()); - return policy_manager_->AddApplication(device_id, application_id, hmi_types); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, + std::make_shared<utils::CallNothing>()); + return policy_manager->AddApplication(device_id, application_id, hmi_types); } void PolicyHandler::AddDevice(const std::string& device_id, const std::string& connection_type) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->AddDevice(device_id, connection_type); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->AddDevice(device_id, connection_type); } void PolicyHandler::SetDeviceInfo(const std::string& device_id, const DeviceInfo& device_info) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->SetDeviceInfo(device_id, device_info); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SetDeviceInfo(device_id, device_info); } #ifdef EXTERNAL_PROPRIETARY_MODE @@ -661,7 +694,8 @@ void PolicyHandler::OnAppPermissionConsentInternal( void PolicyHandler::OnAppPermissionConsentInternal( const uint32_t connection_key, PermissionConsent& out_permissions) { #endif - POLICY_LIB_CHECK_VOID(); + const std::shared_ptr<PolicyManager> policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); if (connection_key) { ApplicationSharedPtr app = application_manager_.application(connection_key); @@ -677,9 +711,9 @@ void PolicyHandler::OnAppPermissionConsentInternal( if (!out_permissions.policy_app_id.empty()) { #ifdef EXTERNAL_PROPRIETARY_MODE - policy_manager_->SetUserConsentForApp(out_permissions, mode); + policy_manager->SetUserConsentForApp(out_permissions, mode); #else - policy_manager_->SetUserConsentForApp(out_permissions); + policy_manager->SetUserConsentForApp(out_permissions); #endif } } else if (!app_to_device_link_.empty()) { @@ -716,9 +750,9 @@ void PolicyHandler::OnAppPermissionConsentInternal( out_permissions.policy_app_id = app->policy_app_id(); out_permissions.device_id = app->mac_address(); #ifdef EXTERNAL_PROPRIETARY_MODE - policy_manager_->SetUserConsentForApp(out_permissions, mode); + policy_manager->SetUserConsentForApp(out_permissions, mode); #else - policy_manager_->SetUserConsentForApp(out_permissions); + policy_manager->SetUserConsentForApp(out_permissions); #endif } } else { @@ -727,14 +761,15 @@ void PolicyHandler::OnAppPermissionConsentInternal( "setting common permissions."); } #ifdef EXTERNAL_PROPRIETARY_MODE - if (!policy_manager_->SetExternalConsentStatus(external_consent_status)) { + if (!policy_manager->SetExternalConsentStatus(external_consent_status)) { SDL_LOG_WARN("External User Consent Settings status has not been set!"); } #endif } void policy::PolicyHandler::SetDaysAfterEpoch() { - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); date_time::TimeDuration current_time = date_time::getCurrentTime(); const int kSecondsInDay = 60 * 60 * 24; int days_after_epoch = date_time::getSecs(current_time) / kSecondsInDay; @@ -743,8 +778,9 @@ void policy::PolicyHandler::SetDaysAfterEpoch() { #ifdef ENABLE_SECURITY std::string PolicyHandler::RetrieveCertificate() const { - POLICY_LIB_CHECK_OR_RETURN(std::string("")); - return policy_manager_->RetrieveCertificate(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string()); + return policy_manager->RetrieveCertificate(); } #endif // ENABLE_SECURITY @@ -753,18 +789,18 @@ void PolicyHandler::OnGetUserFriendlyMessage( const std::string& language, uint32_t correlation_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); #ifdef EXTERNAL_PROPRIETARY_MODE - const std::string active_hmi_language = - application_manager::MessageHelper::CommonLanguageToString( - application_manager_.hmi_capabilities().active_ui_language()); + const std::string active_hmi_language = application_manager::EnumToString( + application_manager_.hmi_capabilities().active_ui_language()); const std::vector<UserFriendlyMessage> result = - policy_manager_->GetUserFriendlyMessages( + policy_manager->GetUserFriendlyMessages( message_codes, language, active_hmi_language); #else const std::vector<UserFriendlyMessage> result = - policy_manager_->GetUserFriendlyMessages(message_codes, language); + policy_manager->GetUserFriendlyMessages(message_codes, language); #endif // EXTERNAL_PROPRIETARY_MODE // Send response to HMI with gathered data MessageHelper::SendGetUserFriendlyMessageResponse( @@ -775,12 +811,16 @@ void PolicyHandler::OnSystemRequestReceived() const { #ifdef EXTERNAL_PROPRIETARY_MODE ptu_retry_handler().OnSystemRequestReceived(); #endif - policy_manager_->ResetTimeout(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->ResetTimeout(); } void PolicyHandler::TriggerPTUOnStartupIfRequired() { #ifdef PROPRIETARY_MODE - policy_manager_->TriggerPTUOnStartupIfRequired(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->TriggerPTUOnStartupIfRequired(); #endif } @@ -794,10 +834,23 @@ void PolicyHandler::GetRegisteredLinks( std::for_each(it_app, it_app_end, linker); } +std::shared_ptr<PolicyManager> PolicyHandler::LoadPolicyManager() const { + sync_primitives::AutoReadLock lock{policy_manager_lock_}; + return atomic_policy_manager_; +} + +void PolicyHandler::ExchangePolicyManager( + std::shared_ptr<PolicyManager> policy_manager) { + sync_primitives::AutoWriteLock lock{policy_manager_lock_}; + atomic_policy_manager_.swap(policy_manager); +} + std::vector<policy::FunctionalGroupPermission> PolicyHandler::CollectRegisteredAppsPermissions() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(std::vector<policy::FunctionalGroupPermission>()); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, + std::vector<policy::FunctionalGroupPermission>()); // If no specific app was passed, get permissions for all currently registered // applications sync_primitives::AutoLock lock(app_to_device_link_lock_); @@ -809,7 +862,7 @@ PolicyHandler::CollectRegisteredAppsPermissions() { std::map<std::string, std::string>::const_iterator it = app_to_device_link_.begin(); for (; it != app_to_device_link_.end(); ++it) { - policy_manager_->GetUserConsentForApp( + policy_manager->GetUserConsentForApp( it->first, it->second, group_permissions); consolidator.Consolidate(group_permissions); } @@ -819,7 +872,8 @@ PolicyHandler::CollectRegisteredAppsPermissions() { std::vector<FunctionalGroupPermission> PolicyHandler::CollectAppPermissions( const uint32_t connection_key) { std::vector<FunctionalGroupPermission> group_permissions; - POLICY_LIB_CHECK_OR_RETURN(group_permissions); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, group_permissions); // Single app only ApplicationSharedPtr app = application_manager_.application(connection_key); @@ -842,9 +896,9 @@ std::vector<FunctionalGroupPermission> PolicyHandler::CollectAppPermissions( return group_permissions; } - policy_manager_->GetUserConsentForApp(device_params.device_mac_address, - app->policy_app_id(), - group_permissions); + policy_manager->GetUserConsentForApp(device_params.device_mac_address, + app->policy_app_id(), + group_permissions); return group_permissions; } @@ -852,7 +906,8 @@ std::vector<FunctionalGroupPermission> PolicyHandler::CollectAppPermissions( void PolicyHandler::OnGetListOfPermissions(const uint32_t connection_key, const uint32_t correlation_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); application_manager::ApplicationSharedPtr app = application_manager_.application(connection_key); @@ -872,7 +927,7 @@ void PolicyHandler::OnGetListOfPermissions(const uint32_t connection_key, MessageHelper::SendGetListOfPermissionsResponse( permissions, #ifdef EXTERNAL_PROPRIETARY_MODE - policy_manager_->GetExternalConsentStatus(), + policy_manager->GetExternalConsentStatus(), #endif // EXTERNAL_PROPRIETARY_MODE correlation_id, application_manager_); @@ -897,7 +952,8 @@ void PolicyHandler::LinkAppsToDevice() { bool PolicyHandler::IsAppSuitableForPolicyUpdate( const Applications::value_type value) const { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); if (!value->IsRegistered()) { SDL_LOG_DEBUG("Application " << value->app_id() @@ -914,7 +970,7 @@ bool PolicyHandler::IsAppSuitableForPolicyUpdate( application_manager_.connection_handler().get_session_observer()); const bool is_device_allowed = - (kDeviceAllowed == policy_manager_->GetUserConsentForDevice( + (kDeviceAllowed == policy_manager->GetUserConsentForDevice( device_params.device_mac_address)); SDL_LOG_DEBUG("Is device " << device_params.device_mac_address << " allowed " @@ -943,8 +999,9 @@ uint32_t PolicyHandler::ChooseRandomAppForPolicyUpdate( void PolicyHandler::OnDeviceSwitching(const std::string& device_id_from, const std::string& device_id_to) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->OnDeviceSwitching(device_id_from, device_id_to); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->OnDeviceSwitching(device_id_from, device_id_to); } void PolicyHandler::OnLockScreenDismissalStateChanged() { @@ -958,17 +1015,19 @@ void PolicyHandler::OnLockScreenDismissalStateChanged() { void PolicyHandler::OnGetStatusUpdate(const uint32_t correlation_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); MessageHelper::SendGetStatusUpdateResponse( - policy_manager_->GetPolicyTableStatus(), + policy_manager->GetPolicyTableStatus(), correlation_id, application_manager_); } void PolicyHandler::OnUpdateStatusChanged(const std::string& status) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->SaveUpdateStatusRequired(policy::kUpToDate != status); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SaveUpdateStatusRequired(policy::kUpToDate != status); MessageHelper::SendOnStatusUpdate(status, application_manager_); } @@ -996,26 +1055,32 @@ std::string PolicyHandler::OnCurrentDeviceIdUpdateRequired( void PolicyHandler::OnSystemInfoChanged(const std::string& language) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->SetSystemLanguage(language); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SetSystemLanguage(language); } void PolicyHandler::SetPreloadedPtFlag(const bool is_preloaded) { SDL_LOG_AUTO_TRACE(); - policy_manager_->SetPreloadedPtFlag(is_preloaded); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SetPreloadedPtFlag(is_preloaded); } void PolicyHandler::OnGetSystemInfo(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->SetSystemInfo(ccpu_version, wers_country_code, language); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SetSystemInfo(ccpu_version, wers_country_code, language); } std::string PolicyHandler::GetCCPUVersionFromPT() const { SDL_LOG_AUTO_TRACE(); - return policy_manager_->GetCCPUVersionFromPT(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string()); + return policy_manager->GetCCPUVersionFromPT(); } void PolicyHandler::OnVIIsReady() { @@ -1032,7 +1097,8 @@ void PolicyHandler::OnVIIsReady() { void PolicyHandler::OnVehicleDataUpdated( const smart_objects::SmartObject& message) { - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); #ifdef EXTERNAL_PROPRIETARY_MODE if (!message.keyExists(strings::msg_params)) { SDL_LOG_ERROR("Message does not contains mandatory section " @@ -1040,7 +1106,7 @@ void PolicyHandler::OnVehicleDataUpdated( return; } if (message[strings::msg_params].keyExists(strings::vin)) { - policy_manager_->SetVINValue( + policy_manager->SetVINValue( message[strings::msg_params][strings::vin].asString()); } #else @@ -1053,7 +1119,8 @@ void PolicyHandler::OnPendingPermissionChange( SDL_LOG_AUTO_TRACE(); SDL_LOG_DEBUG("PolicyHandler::OnPendingPermissionChange for " << policy_app_id); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); ApplicationSharedPtr app = application_manager_.application(device_id, policy_app_id); if (app.use_count() == 0) { @@ -1062,7 +1129,7 @@ void PolicyHandler::OnPendingPermissionChange( } AppPermissions permissions = - policy_manager_->GetAppPermissionsChanges(device_id, policy_app_id); + policy_manager->GetAppPermissionsChanges(device_id, policy_app_id); const uint32_t app_id = app->app_id(); @@ -1076,7 +1143,7 @@ void PolicyHandler::OnPendingPermissionChange( mobile_apis::AudioStreamingState::NOT_AUDIBLE, mobile_apis::VideoStreamingState::NOT_STREAMABLE, true); - policy_manager_->RemovePendingPermissionChanges(policy_app_id); + policy_manager->RemovePendingPermissionChanges(policy_app_id); return; } @@ -1125,7 +1192,7 @@ void PolicyHandler::OnPendingPermissionChange( app->app_id(), permissions, application_manager_); } - policy_manager_->RemovePendingPermissionChanges(policy_app_id); + policy_manager->RemovePendingPermissionChanges(policy_app_id); } bool PolicyHandler::SendMessageToSDK(const BinaryMessage& pt_string, @@ -1138,7 +1205,7 @@ bool PolicyHandler::SendMessageToSDK(const BinaryMessage& pt_string, const std::string& url, const uint32_t app_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); + POLICY_LIB_CHECK_OR_RETURN(atomic_policy_manager_, false); ApplicationSharedPtr app = application_manager_.application(app_id); @@ -1172,9 +1239,10 @@ bool PolicyHandler::SendMessageToSDK(const BinaryMessage& pt_string, bool PolicyHandler::ReceiveMessageFromSDK(const std::string& file, const BinaryMessage& pt_string) { - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); - const auto load_pt_result = policy_manager_->LoadPT(file, pt_string); + const auto load_pt_result = policy_manager->LoadPT(file, pt_string); SDL_LOG_INFO("Load policy table result code: " << load_pt_result); @@ -1184,9 +1252,9 @@ bool PolicyHandler::ReceiveMessageFromSDK(const std::string& file, if (is_ptu_successful) { SDL_LOG_INFO("PTU was successful."); - policy_manager_->CleanupUnpairedDevices(); + policy_manager->CleanupUnpairedDevices(); SetDaysAfterEpoch(); - policy_manager_->OnPTUFinished(load_pt_result); + policy_manager->OnPTUFinished(load_pt_result); #ifndef EXTERNAL_PROPRIETARY_MODE // Clean up retry information last_ptu_app_id_ = 0; @@ -1201,7 +1269,7 @@ bool PolicyHandler::ReceiveMessageFromSDK(const std::string& file, correlation_id, vehicle_data_args, application_manager_); } else { SDL_LOG_WARN("Exchange wasn't successful"); - policy_manager_->OnPTUFinished(load_pt_result); + policy_manager->OnPTUFinished(load_pt_result); } return is_ptu_successful; @@ -1209,28 +1277,24 @@ bool PolicyHandler::ReceiveMessageFromSDK(const std::string& file, bool PolicyHandler::UnloadPolicyLibrary() { SDL_LOG_AUTO_TRACE(); - SDL_LOG_DEBUG("policy_manager_ = " << policy_manager_); - bool ret = true; AsyncRunner::Stop(); - sync_primitives::AutoWriteLock lock(policy_manager_lock_); - if (policy_manager_) { - policy_manager_.reset(); - } - SDL_LOG_TRACE("exit"); - return ret; + ExchangePolicyManager(nullptr); + return !atomic_policy_manager_; } #ifdef EXTERNAL_PROPRIETARY_MODE struct SDLAlowedNotification { - SDLAlowedNotification(const connection_handler::DeviceHandle& device_id, + SDLAlowedNotification(sync_primitives::RWLock& policy_manager_lock, + const connection_handler::DeviceHandle& device_id, PolicyManager* policy_manager, StateController& state_controller) - : device_id_(device_id) + : policy_manager_lock_(policy_manager_lock) + , device_id_(device_id) , policy_manager_(policy_manager) , state_controller_(state_controller) {} void operator()(const ApplicationSharedPtr& app) { - DCHECK_OR_RETURN_VOID(policy_manager_); + POLICY_LIB_CHECK_VOID(policy_manager_); if (app->device() == device_id_) { std::string hmi_level; mobile_apis::HMILevel::eType default_mobile_hmi; @@ -1256,6 +1320,7 @@ struct SDLAlowedNotification { } private: + sync_primitives::RWLock& policy_manager_lock_; connection_handler::DeviceHandle device_id_; PolicyManager* policy_manager_; StateController& state_controller_; @@ -1265,7 +1330,8 @@ struct SDLAlowedNotification { void PolicyHandler::OnAllowSDLFunctionalityNotification( bool is_allowed, const std::string& device_mac) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); using namespace mobile_apis; const bool device_specific = !device_mac.empty(); // Common devices consents change @@ -1285,7 +1351,7 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification( SDL_LOG_WARN("Device with id " << device_id << " wasn't found."); continue; } - policy_manager_->SetUserConsentForDevice(device_id, is_allowed); + policy_manager->SetUserConsentForDevice(device_id, is_allowed); connection_handler::DeviceHandle device_handle = 0; if (!connection_handler.GetDeviceID(device_id, &device_handle)) { SDL_LOG_WARN("Device handle with mac " << device_id @@ -1310,8 +1376,9 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification( std::for_each( applications.begin(), applications.end(), - SDLAlowedNotification(device_handle, - policy_manager_.get(), + SDLAlowedNotification(policy_manager_lock_, + device_handle, + policy_manager.get(), application_manager_.state_controller())); } #endif // EXTERNAL_PROPRIETARY_MODE @@ -1321,7 +1388,7 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification( // Case, when specific device was changed connection_handler::DeviceHandle device_handle = 0u; if (device_specific) { - policy_manager_->SetUserConsentForDevice(device_mac, is_allowed); + policy_manager->SetUserConsentForDevice(device_mac, is_allowed); if (!connection_handler.GetDeviceID(device_mac, &device_handle)) { SDL_LOG_WARN("Device hadle with mac " << device_mac << " wasn't found."); } @@ -1378,8 +1445,9 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification( void PolicyHandler::OnIgnitionCycleOver() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->IncrementIgnitionCycles(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->IncrementIgnitionCycles(); } void PolicyHandler::OnActivateApp(uint32_t connection_key, @@ -1394,15 +1462,15 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key, AppPermissions permissions(policy_app_id); - sync_primitives::AutoReadLock lock(policy_manager_lock_); - if (!policy_manager_) { + const auto policy_manager = LoadPolicyManager(); + if (!policy_manager) { SDL_LOG_DEBUG("The shared library of policy is not loaded"); if (!PolicyEnabled()) { permissions.isSDLAllowed = true; } } else { - permissions = policy_manager_->GetAppPermissionsChanges(app->mac_address(), - policy_app_id); + permissions = policy_manager->GetAppPermissionsChanges(app->mac_address(), + policy_app_id); #ifdef EXTERNAL_PROPRIETARY_MODE UsageStatistics& usage = app->usage_report(); @@ -1412,7 +1480,7 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key, application_manager_.connection_handler().get_session_observer()); permissions.deviceInfo = device_params; - DeviceConsent consent = policy_manager_->GetUserConsentForDevice( + DeviceConsent consent = policy_manager->GetUserConsentForDevice( permissions.deviceInfo.device_mac_address); permissions.isSDLAllowed = kDeviceAllowed == consent; @@ -1441,13 +1509,12 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key, #else // EXTERNAL_PROPRIETARY_MODE permissions.isSDLAllowed = true; #endif // EXTERNAL_PROPRIETARY_MODE - policy_manager_->RemovePendingPermissionChanges(policy_app_id); + policy_manager->RemovePendingPermissionChanges(policy_app_id); } // If application is revoked it should not be activated // In this case we need to activate application if (false == permissions.appRevoked && true == permissions.isSDLAllowed) { SDL_LOG_INFO("Application will be activated"); - sync_primitives::AutoReadUnlock unlock(policy_manager_lock_); if (application_manager_.ActivateApplication(app)) { last_activated_app_id_ = 0; } @@ -1461,14 +1528,16 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key, void PolicyHandler::KmsChanged(int kilometers) { SDL_LOG_DEBUG("PolicyHandler::KmsChanged " << kilometers << " kilometers"); - POLICY_LIB_CHECK_VOID(); - policy_manager_->KmsChanged(kilometers); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->KmsChanged(kilometers); } void PolicyHandler::PTExchangeAtUserRequest(uint32_t correlation_id) { SDL_LOG_TRACE("PT exchange at user request"); - POLICY_LIB_CHECK_VOID(); - std::string update_status = policy_manager_->ForcePTExchangeAtUserRequest(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + std::string update_status = policy_manager->ForcePTExchangeAtUserRequest(); MessageHelper::SendUpdateSDLResponse( update_status, correlation_id, application_manager_); } @@ -1492,8 +1561,7 @@ void PolicyHandler::OnPermissionsUpdated(const std::string& device_id, // level to default mobile_apis::HMILevel::eType current_hmi_level = app->hmi_level(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); - mobile_apis::HMILevel::eType hmi_level = - MessageHelper::StringToHMILevel(default_hmi); + auto hmi_level = StringToEnum<mobile_apis::HMILevel::eType>(default_hmi); if (mobile_apis::HMILevel::INVALID_ENUM == hmi_level) { SDL_LOG_WARN("Couldn't convert default hmi level " << default_hmi @@ -1536,7 +1604,8 @@ void PolicyHandler::OnPermissionsUpdated(const std::string& device_id, const std::string& policy_app_id, const Permissions& permissions) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); ApplicationSharedPtr app = application_manager_.application(device_id, policy_app_id); @@ -1547,7 +1616,7 @@ void PolicyHandler::OnPermissionsUpdated(const std::string& device_id, } const auto require_encryption = - policy_manager_->GetAppEncryptionRequired(policy_app_id); + policy_manager->GetAppEncryptionRequired(policy_app_id); MessageHelper::SendOnPermissionsChangeNotification( app->app_id(), permissions, application_manager_, require_encryption); @@ -1601,7 +1670,8 @@ void PolicyHandler::OnSnapshotCreated( void PolicyHandler::OnSnapshotCreated(const BinaryMessage& pt_string, const PTUIterationType iteration_type) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); #ifdef PROPRIETARY_MODE if (PTUIterationType::RetryIteration == iteration_type) { uint32_t app_id_for_sending = 0; @@ -1621,7 +1691,7 @@ void PolicyHandler::OnSnapshotCreated(const BinaryMessage& pt_string, MessageHelper::SendPolicyUpdate( policy_snapshot_full_path, TimeoutExchangeSec(), - policy_manager_->RetrySequenceDelaysSeconds(), + policy_manager->RetrySequenceDelaysSeconds(), application_manager_); } #else // PROPRIETARY_MODE @@ -1638,7 +1708,8 @@ void PolicyHandler::OnSnapshotCreated(const BinaryMessage& pt_string, std::string PolicyHandler::GetNextUpdateUrl( const PTUIterationType iteration_type, uint32_t& app_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(std::string()); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string()); app_id = ChoosePTUApplication(iteration_type); if (0 == app_id) { @@ -1652,7 +1723,7 @@ std::string PolicyHandler::GetNextUpdateUrl( } EndpointUrls endpoint_urls; - policy_manager_->GetUpdateUrls("0x07", endpoint_urls); + policy_manager->GetUpdateUrls("0x07", endpoint_urls); if (endpoint_urls.empty()) { SDL_LOG_ERROR("Service URLs are empty!"); @@ -1670,7 +1741,7 @@ std::string PolicyHandler::GetNextUpdateUrl( return application_manager_.application(app_id); }; - AppIdURL app_url = policy_manager_->GetNextUpdateUrl(endpoint_urls); + AppIdURL app_url = policy_manager->GetNextUpdateUrl(endpoint_urls); ApplicationSharedPtr app = get_ptu_app(app_url, app_id); if (!app) { SDL_LOG_ERROR("No available applications for PTU!"); @@ -1678,7 +1749,7 @@ std::string PolicyHandler::GetNextUpdateUrl( } EndpointData& data = endpoint_urls[app_url.first]; while (!IsUrlAppIdValid(app->policy_app_id(), data)) { - app_url = policy_manager_->GetNextUpdateUrl(endpoint_urls); + app_url = policy_manager->GetNextUpdateUrl(endpoint_urls); app = get_ptu_app(app_url, app_id); if (!app) { SDL_LOG_ERROR("No available applications for PTU!"); @@ -1693,8 +1764,9 @@ std::string PolicyHandler::GetNextUpdateUrl( bool PolicyHandler::GetPriority(const std::string& policy_app_id, std::string* priority) const { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->GetPriority(policy_app_id, priority); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->GetPriority(policy_app_id, priority); } void PolicyHandler::CheckPermissions( @@ -1703,9 +1775,10 @@ void PolicyHandler::CheckPermissions( const PTString& rpc, const RPCParams& rpc_params, CheckPermissionResult& result) { - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); const std::string hmi_level = - MessageHelper::StringifiedHMILevel(app->hmi_level(window_id)); + application_manager::EnumToString(app->hmi_level(window_id)); if (hmi_level.empty()) { SDL_LOG_WARN("HMI level for " << app->policy_app_id() << " is invalid, rpc " << rpc << " is not allowed."); @@ -1717,61 +1790,69 @@ void PolicyHandler::CheckPermissions( SDL_LOG_INFO("Checking permissions for " << app->policy_app_id() << " in " << hmi_level << " on device " << device_id << " rpc " << rpc); - policy_manager_->CheckPermissions( + policy_manager->CheckPermissions( device_id, app->policy_app_id(), hmi_level, rpc, rpc_params, result); } uint32_t PolicyHandler::GetNotificationsNumber(const std::string& priority, const bool is_subtle) const { - POLICY_LIB_CHECK_OR_RETURN(0); - return policy_manager_->GetNotificationsNumber(priority, is_subtle); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, 0); + return policy_manager->GetNotificationsNumber(priority, is_subtle); } DeviceConsent PolicyHandler::GetUserConsentForDevice( const std::string& device_id) const { - POLICY_LIB_CHECK_OR_RETURN(kDeviceDisallowed); - return policy_manager_->GetUserConsentForDevice(device_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, kDeviceDisallowed); + return policy_manager->GetUserConsentForDevice(device_id); } Json::Value PolicyHandler::GetPolicyTableData() const { - POLICY_LIB_CHECK_OR_RETURN(Json::Value()); - return policy_manager_->GetPolicyTableData(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, Json::Value()); + return policy_manager->GetPolicyTableData(); } bool PolicyHandler::GetDefaultHmi(const std::string& device_id, const std::string& policy_app_id, std::string* default_hmi) const { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->GetDefaultHmi(device_id, policy_app_id, default_hmi); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->GetDefaultHmi(device_id, policy_app_id, default_hmi); } bool PolicyHandler::GetInitialAppData(const std::string& application_id, StringArray* nicknames, StringArray* app_hmi_types) { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->GetInitialAppData( + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->GetInitialAppData( application_id, nicknames, app_hmi_types); } void PolicyHandler::GetUpdateUrls(const std::string& service_type, EndpointUrls& out_end_points) const { - POLICY_LIB_CHECK_VOID(); - policy_manager_->GetUpdateUrls(service_type, out_end_points); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->GetUpdateUrls(service_type, out_end_points); } void PolicyHandler::GetUpdateUrls(const uint32_t service_type, EndpointUrls& out_end_points) const { - POLICY_LIB_CHECK_VOID(); - policy_manager_->GetUpdateUrls(service_type, out_end_points); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->GetUpdateUrls(service_type, out_end_points); } std::string PolicyHandler::GetLockScreenIconUrl( const std::string& policy_app_id) const { const std::string default_url; - POLICY_LIB_CHECK_OR_RETURN(default_url); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, default_url); EndpointUrls endpoints; - policy_manager_->GetUpdateUrls("lock_screen_icon_url", endpoints); + policy_manager->GetUpdateUrls("lock_screen_icon_url", endpoints); auto it_specific = std::find_if(endpoints.begin(), @@ -1800,14 +1881,16 @@ std::string PolicyHandler::GetLockScreenIconUrl( } std::string PolicyHandler::GetIconUrl(const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(std::string("")); - return policy_manager_->GetIconUrl(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string()); + return policy_manager->GetIconUrl(policy_app_id); } uint32_t PolicyHandler::NextRetryTimeout() { - POLICY_LIB_CHECK_OR_RETURN(0); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, 0); SDL_LOG_AUTO_TRACE(); - return policy_manager_->NextRetryTimeout(); + return policy_manager->NextRetryTimeout(); } uint32_t PolicyHandler::TimeoutExchangeSec() const { @@ -1815,37 +1898,42 @@ uint32_t PolicyHandler::TimeoutExchangeSec() const { } uint32_t PolicyHandler::TimeoutExchangeMSec() const { - POLICY_LIB_CHECK_OR_RETURN(0); - return policy_manager_->TimeoutExchangeMSec(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, 0); + return policy_manager->TimeoutExchangeMSec(); } void PolicyHandler::OnExceededTimeout() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); std::for_each(listeners_.begin(), listeners_.end(), std::mem_fn(&PolicyHandlerObserver::OnPTUTimeoutExceeded)); - policy_manager_->OnExceededTimeout(); + policy_manager->OnExceededTimeout(); } const boost::optional<bool> PolicyHandler::LockScreenDismissalEnabledState() const { - POLICY_LIB_CHECK_OR_RETURN(boost::optional<bool>()); - return policy_manager_->LockScreenDismissalEnabledState(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, boost::optional<bool>()); + return policy_manager->LockScreenDismissalEnabledState(); } const boost::optional<std::string> PolicyHandler::LockScreenDismissalWarningMessage( const std::string& language) const { - POLICY_LIB_CHECK_OR_RETURN(boost::optional<std::string>()); - return policy_manager_->LockScreenDismissalWarningMessage(language); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, boost::optional<std::string>()); + return policy_manager->LockScreenDismissalWarningMessage(language); } void PolicyHandler::PTUpdatedAt(Counters counter, int value) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->PTUpdatedAt(counter, value); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->PTUpdatedAt(counter, value); } void PolicyHandler::add_listener(PolicyHandlerObserver* listener) { @@ -1870,7 +1958,7 @@ PolicyHandler::GetStatisticManager() const { } void PolicyHandler::AddStatisticsInfo(int type) { - POLICY_LIB_CHECK_VOID(); + POLICY_LIB_CHECK_VOID(atomic_policy_manager_); switch (static_cast<hmi_apis::Common_StatisticsType::eType>(type)) { case hmi_apis::Common_StatisticsType::iAPP_BUFFER_FULL: { usage_statistics::GlobalCounter count_of_iap_buffer_full( @@ -1883,7 +1971,7 @@ void PolicyHandler::AddStatisticsInfo(int type) { } void PolicyHandler::OnSystemError(int code) { - POLICY_LIB_CHECK_VOID(); + POLICY_LIB_CHECK_VOID(atomic_policy_manager_); switch (static_cast<hmi_apis::Common_SystemError::eType>(code)) { case hmi_apis::Common_SystemError::SYNC_REBOOTED: { usage_statistics::GlobalCounter count_of_sync_reboots( @@ -1962,7 +2050,8 @@ void PolicyHandler::OnEmptyCertificateArrived() const { void PolicyHandler::OnCertificateDecrypted(bool is_succeeded) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); const std::string file_name = file_system::GetAbsolutePath(get_settings().app_storage_folder()) + +"/" + @@ -1988,7 +2077,7 @@ void PolicyHandler::OnCertificateDecrypted(bool is_succeeded) { SDL_LOG_DEBUG("Loaded decrypted certificate data: \"" << certificate_data << '"'); - policy_manager_->SetDecryptedCertificate(certificate_data); + policy_manager->SetDecryptedCertificate(certificate_data); sync_primitives::AutoLock lock(listeners_lock_); std::for_each( @@ -2051,9 +2140,10 @@ bool PolicyHandler::CanUpdate() { void PolicyHandler::RemoveDevice(const std::string& device_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); - policy_manager_->MarkUnpairedDevice(device_id); + policy_manager->MarkUnpairedDevice(device_id); #ifdef EXTERNAL_PROPRIETARY_MODE connection_handler::DeviceHandle device_uid; if (application_manager_.connection_handler().GetDeviceID(device_id, @@ -2069,25 +2159,29 @@ void PolicyHandler::RemoveDevice(const std::string& device_id) { bool PolicyHandler::IsApplicationRevoked(const std::string& app_id) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); - return policy_manager_->IsApplicationRevoked(app_id); + return policy_manager->IsApplicationRevoked(app_id); } void PolicyHandler::OnUpdateRequestSentToMobile() { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); - policy_manager_->OnUpdateStarted(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->OnUpdateStarted(); } bool PolicyHandler::CheckKeepContext(const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->CanAppKeepContext(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->CanAppKeepContext(policy_app_id); } bool PolicyHandler::CheckStealFocus(const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->CanAppStealFocus(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->CanAppStealFocus(policy_app_id); } bool PolicyHandler::CheckSystemAction( @@ -2110,8 +2204,9 @@ bool PolicyHandler::CheckSystemAction( } std::vector<std::string> PolicyHandler::GetApplicationPolicyIDs() const { - POLICY_LIB_CHECK_OR_RETURN(std::vector<std::string>()); - const auto all_policy_ids = policy_manager_->GetApplicationPolicyIDs(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::vector<std::string>()); + const auto all_policy_ids = policy_manager->GetApplicationPolicyIDs(); std::vector<std::string> policy_app_ids; std::copy_if( @@ -2128,26 +2223,30 @@ std::vector<std::string> PolicyHandler::GetApplicationPolicyIDs() const { void PolicyHandler::GetEnabledCloudApps( std::vector<std::string>& enabled_apps) const { - POLICY_LIB_CHECK_VOID(); - policy_manager_->GetEnabledCloudApps(enabled_apps); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->GetEnabledCloudApps(enabled_apps); } bool PolicyHandler::GetAppProperties(const std::string& policy_app_id, AppProperties& out_app_properties) const { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->GetAppProperties(policy_app_id, out_app_properties); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->GetAppProperties(policy_app_id, out_app_properties); } std::vector<std::string> PolicyHandler::GetEnabledLocalApps() const { - POLICY_LIB_CHECK_OR_RETURN(std::vector<std::string>()); - return policy_manager_->GetEnabledLocalApps(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::vector<std::string>()); + return policy_manager->GetEnabledLocalApps(); } const bool PolicyHandler::CheckCloudAppEnabled( const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); AppProperties out_app_properties; - policy_manager_->GetAppProperties(policy_app_id, out_app_properties); + policy_manager->GetAppProperties(policy_app_id, out_app_properties); return out_app_properties.enabled; } @@ -2155,14 +2254,15 @@ PolicyHandler::AppPropertiesState PolicyHandler::GetAppPropertiesStatus( const smart_objects::SmartObject& properties, const std::string& app_id) const { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(AppPropertiesState::NO_CHANGES); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, AppPropertiesState::NO_CHANGES); AppProperties app_properties; - policy_manager_->GetAppProperties(app_id, app_properties); + policy_manager->GetAppProperties(app_id, app_properties); policy::StringArray nicknames; policy::StringArray app_hmi_types; - policy_manager_->GetInitialAppData(app_id, &nicknames, &app_hmi_types); + policy_manager->GetInitialAppData(app_id, &nicknames, &app_hmi_types); if (properties.keyExists(strings::enabled) && app_properties.enabled != properties[strings::enabled].asBool()) { @@ -2242,34 +2342,36 @@ PolicyHandler::AppPropertiesState PolicyHandler::GetAppPropertiesStatus( } bool PolicyHandler::IsNewApplication(const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->IsNewApplication(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->IsNewApplication(policy_app_id); } void PolicyHandler::OnSetAppProperties( const smart_objects::SmartObject& properties) { - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); const auto policy_app_id(properties[strings::policy_app_id].asString()); - policy_manager_->InitCloudApp(policy_app_id); + policy_manager->InitCloudApp(policy_app_id); bool auth_token_update = false; if (properties.keyExists(strings::enabled)) { const bool enabled = properties[strings::enabled].asBool(); - policy_manager_->SetCloudAppEnabled(policy_app_id, enabled); + policy_manager->SetCloudAppEnabled(policy_app_id, enabled); } if (properties.keyExists(strings::auth_token)) { const std::string auth_token = properties[strings::auth_token].asString(); - policy_manager_->SetAppAuthToken(policy_app_id, auth_token); + policy_manager->SetAppAuthToken(policy_app_id, auth_token); auth_token_update = true; } if (properties.keyExists(strings::transport_type)) { - policy_manager_->SetAppCloudTransportType( + policy_manager->SetAppCloudTransportType( policy_app_id, properties[strings::transport_type].asString()); } if (properties.keyExists(strings::endpoint)) { - policy_manager_->SetAppEndpoint(policy_app_id, - properties[strings::endpoint].asString()); + policy_manager->SetAppEndpoint(policy_app_id, + properties[strings::endpoint].asString()); } if (properties.keyExists(strings::nicknames)) { StringArray nicknames; @@ -2278,7 +2380,7 @@ void PolicyHandler::OnSetAppProperties( for (size_t i = 0; i < nicknames_array.length(); ++i) { nicknames.push_back(nicknames_array[i].asString()); } - policy_manager_->SetAppNicknames(policy_app_id, nicknames); + policy_manager->SetAppNicknames(policy_app_id, nicknames); } if (properties.keyExists(strings::hybrid_app_preference)) { std::string hybrid_app_preference; @@ -2288,26 +2390,28 @@ void PolicyHandler::OnSetAppProperties( smart_objects::EnumConversionHelper< mobile_apis::HybridAppPreference::eType>:: EnumToString(value, &hybrid_app_preference); - policy_manager_->SetHybridAppPreference(policy_app_id, - hybrid_app_preference); + policy_manager->SetHybridAppPreference(policy_app_id, + hybrid_app_preference); } if (auth_token_update) { AppProperties app_properties; - if (policy_manager_->GetAppProperties(policy_app_id, app_properties)) { + if (policy_manager->GetAppProperties(policy_app_id, app_properties)) { OnAuthTokenUpdated(policy_app_id, app_properties.auth_token); } } } void PolicyHandler::OnLocalAppAdded() { - POLICY_LIB_CHECK_VOID(); - policy_manager_->OnLocalAppAdded(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->OnLocalAppAdded(); } void PolicyHandler::OnSetCloudAppProperties( const smart_objects::SmartObject& message) { - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); if (!message.keyExists(strings::msg_params)) { SDL_LOG_ERROR("Message does not contain mandatory section " << strings::msg_params); @@ -2328,21 +2432,21 @@ void PolicyHandler::OnSetCloudAppProperties( } std::string policy_app_id(properties[strings::app_id].asString()); - policy_manager_->InitCloudApp(policy_app_id); + policy_manager->InitCloudApp(policy_app_id); bool auth_token_update = false; if (properties.keyExists(strings::auth_token)) { std::string auth_token = properties[strings::auth_token].asString(); - policy_manager_->SetAppAuthToken(policy_app_id, auth_token); + policy_manager->SetAppAuthToken(policy_app_id, auth_token); auth_token_update = true; } if (properties.keyExists(strings::cloud_transport_type)) { - policy_manager_->SetAppCloudTransportType( + policy_manager->SetAppCloudTransportType( policy_app_id, properties[strings::cloud_transport_type].asString()); } if (properties.keyExists(strings::endpoint)) { - policy_manager_->SetAppEndpoint(policy_app_id, - properties[strings::endpoint].asString()); + policy_manager->SetAppEndpoint(policy_app_id, + properties[strings::endpoint].asString()); } if (properties.keyExists(strings::nicknames)) { StringArray nicknames; @@ -2351,7 +2455,7 @@ void PolicyHandler::OnSetCloudAppProperties( for (size_t i = 0; i < nicknames_array.length(); ++i) { nicknames.push_back(nicknames_array[i].asString()); } - policy_manager_->SetAppNicknames(policy_app_id, nicknames); + policy_manager->SetAppNicknames(policy_app_id, nicknames); } if (properties.keyExists(strings::hybrid_app_preference)) { std::string hybrid_app_preference; @@ -2361,12 +2465,12 @@ void PolicyHandler::OnSetCloudAppProperties( smart_objects::EnumConversionHelper< mobile_apis::HybridAppPreference::eType>:: EnumToString(value, &hybrid_app_preference); - policy_manager_->SetHybridAppPreference(policy_app_id, - hybrid_app_preference); + policy_manager->SetHybridAppPreference(policy_app_id, + hybrid_app_preference); } if (properties.keyExists(strings::enabled)) { bool enabled = properties[strings::enabled].asBool(); - policy_manager_->SetCloudAppEnabled(policy_app_id, enabled); + policy_manager->SetCloudAppEnabled(policy_app_id, enabled); if (!auth_token_update) { auth_token_update = enabled; } @@ -2376,7 +2480,7 @@ void PolicyHandler::OnSetCloudAppProperties( if (auth_token_update) { AppProperties app_properties; - policy_manager_->GetAppProperties(policy_app_id, app_properties); + policy_manager->GetAppProperties(policy_app_id, app_properties); OnAuthTokenUpdated(policy_app_id, app_properties.auth_token); } } @@ -2384,9 +2488,10 @@ void PolicyHandler::OnSetCloudAppProperties( void PolicyHandler::GetAppServiceParameters( const std::string& policy_app_id, policy_table::AppServiceParameters* app_service_parameters) const { - POLICY_LIB_CHECK_VOID(); - policy_manager_->GetAppServiceParameters(policy_app_id, - app_service_parameters); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->GetAppServiceParameters(policy_app_id, + app_service_parameters); } bool PolicyHandler::CheckAppServiceParameters( @@ -2394,8 +2499,6 @@ bool PolicyHandler::CheckAppServiceParameters( const std::string& requested_service_name, const std::string& requested_service_type, smart_objects::SmartArray* requested_handled_rpcs) const { - std::string service_name = std::string(); - std::string service_type = std::string(); std::vector<int32_t> handled_rpcs = {}; policy_table::AppServiceParameters app_service_parameters = @@ -2448,20 +2551,23 @@ bool PolicyHandler::CheckAppServiceParameters( bool PolicyHandler::UnknownRPCPassthroughAllowed( const std::string& policy_app_id) const { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->UnknownRPCPassthroughAllowed(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->UnknownRPCPassthroughAllowed(policy_app_id); } uint32_t PolicyHandler::HeartBeatTimeout(const std::string& app_id) const { - POLICY_LIB_CHECK_OR_RETURN(0); - return policy_manager_->HeartBeatTimeout(app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, 0); + return policy_manager->HeartBeatTimeout(app_id); } const std::string PolicyHandler::RemoteAppsUrl() const { const std::string default_url; - POLICY_LIB_CHECK_OR_RETURN(default_url); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, default_url); EndpointUrls endpoints; - policy_manager_->GetUpdateUrls("queryAppsUrl", endpoints); + policy_manager->GetUpdateUrls("queryAppsUrl", endpoints); if (endpoints.empty() || endpoints[0].url.empty()) { return default_url; } @@ -2470,13 +2576,15 @@ const std::string PolicyHandler::RemoteAppsUrl() const { } void PolicyHandler::OnAppsSearchStarted() { - POLICY_LIB_CHECK_VOID(); - policy_manager_->OnAppsSearchStarted(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->OnAppsSearchStarted(); } void PolicyHandler::OnAppsSearchCompleted(const bool trigger_ptu) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->OnAppsSearchCompleted(trigger_ptu); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->OnAppsSearchCompleted(trigger_ptu); } void PolicyHandler::OnAddedNewApplicationToAppList( @@ -2491,27 +2599,32 @@ void PolicyHandler::OnAddedNewApplicationToAppList( void PolicyHandler::OnAppRegisteredOnMobile(const std::string& device_id, const std::string& application_id) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->OnAppRegisteredOnMobile(device_id, application_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->OnAppRegisteredOnMobile(device_id, application_id); } RequestType::State PolicyHandler::GetAppRequestTypeState( const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(RequestType::State::UNAVAILABLE); - return policy_manager_->GetAppRequestTypesState(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, RequestType::State::UNAVAILABLE); + return policy_manager->GetAppRequestTypesState(policy_app_id); } RequestSubType::State PolicyHandler::GetAppRequestSubTypeState( const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(RequestSubType::State::UNAVAILABLE); - return policy_manager_->GetAppRequestSubTypesState(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, + RequestSubType::State::UNAVAILABLE); + return policy_manager->GetAppRequestSubTypesState(policy_app_id); } bool PolicyHandler::IsRequestTypeAllowed( const transport_manager::DeviceHandle& device_id, const std::string& policy_app_id, mobile_apis::RequestType::eType type) const { - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); using namespace mobile_apis; const std::string stringified_type = RequestTypeToString(type); @@ -2521,7 +2634,7 @@ bool PolicyHandler::IsRequestTypeAllowed( } const RequestType::State request_type_state = - policy_manager_->GetAppRequestTypesState(policy_app_id); + policy_manager->GetAppRequestTypesState(policy_app_id); switch (request_type_state) { case RequestType::State::EMPTY: { @@ -2538,9 +2651,9 @@ bool PolicyHandler::IsRequestTypeAllowed( // If any of request types is available for current application - get them const auto request_types = #ifdef EXTERNAL_PROPRIETARY_MODE - policy_manager_->GetAppRequestTypes(device_id, policy_app_id); + policy_manager->GetAppRequestTypes(device_id, policy_app_id); #else - policy_manager_->GetAppRequestTypes(policy_app_id); + policy_manager->GetAppRequestTypes(policy_app_id); #endif return helpers::in_range(request_types, stringified_type); } @@ -2552,7 +2665,8 @@ bool PolicyHandler::IsRequestTypeAllowed( bool PolicyHandler::IsRequestSubTypeAllowed( const std::string& policy_app_id, const std::string& request_subtype) const { - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); using namespace mobile_apis; if (request_subtype.empty()) { @@ -2561,7 +2675,7 @@ bool PolicyHandler::IsRequestSubTypeAllowed( } const RequestSubType::State request_subtype_state = - policy_manager_->GetAppRequestSubTypesState(policy_app_id); + policy_manager->GetAppRequestSubTypesState(policy_app_id); switch (request_subtype_state) { case RequestSubType::State::EMPTY: { // If empty array of request subtypes is assigned to app - any is allowed @@ -2577,7 +2691,7 @@ bool PolicyHandler::IsRequestSubTypeAllowed( // If any of request subtypes is available for current application // get them all const auto request_subtypes = - policy_manager_->GetAppRequestSubTypes(policy_app_id); + policy_manager->GetAppRequestSubTypes(policy_app_id); return helpers::in_range(request_subtypes, request_subtype); } default: @@ -2588,62 +2702,73 @@ bool PolicyHandler::IsRequestSubTypeAllowed( const std::vector<std::string> PolicyHandler::GetAppRequestTypes( const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(std::vector<std::string>()); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::vector<std::string>()); #ifdef EXTERNAL_PROPRIETARY_MODE - return policy_manager_->GetAppRequestTypes(device_handle, policy_app_id); + return policy_manager->GetAppRequestTypes(device_handle, policy_app_id); #else - return policy_manager_->GetAppRequestTypes(policy_app_id); + return policy_manager->GetAppRequestTypes(policy_app_id); #endif } const std::vector<std::string> PolicyHandler::GetAppRequestSubTypes( const std::string& policy_app_id) const { - POLICY_LIB_CHECK_OR_RETURN(std::vector<std::string>()); - return policy_manager_->GetAppRequestSubTypes(policy_app_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::vector<std::string>()); + return policy_manager->GetAppRequestSubTypes(policy_app_id); } const std::vector<policy_table::VehicleDataItem> policy::PolicyHandler::GetVehicleDataItems() const { - POLICY_LIB_CHECK_OR_RETURN(std::vector<policy_table::VehicleDataItem>()); - return policy_manager_->GetVehicleDataItems(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, + std::vector<policy_table::VehicleDataItem>()); + return policy_manager->GetVehicleDataItems(); } std::vector<rpc::policy_table_interface_base::VehicleDataItem> policy::PolicyHandler::GetRemovedVehicleDataItems() const { - POLICY_LIB_CHECK_OR_RETURN(std::vector<policy_table::VehicleDataItem>()); - return policy_manager_->GetRemovedVehicleDataItems(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, + std::vector<policy_table::VehicleDataItem>()); + return policy_manager->GetRemovedVehicleDataItems(); } #ifdef EXTERNAL_PROPRIETARY_MODE const MetaInfo PolicyHandler::GetMetaInfo() const { - POLICY_LIB_CHECK_OR_RETURN(MetaInfo()); - return policy_manager_->GetMetaInfo(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, MetaInfo()); + return policy_manager->GetMetaInfo(); } #endif // EXTERNAL_PROPRIETARY_MODE void PolicyHandler::Increment(usage_statistics::GlobalCounterId type) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->Increment(type); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->Increment(type); } void PolicyHandler::Increment(const std::string& app_id, usage_statistics::AppCounterId type) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->Increment(app_id, type); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->Increment(app_id, type); } void PolicyHandler::Set(const std::string& app_id, usage_statistics::AppInfoId type, const std::string& value) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->Set(app_id, type, value); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->Set(app_id, type, value); } void PolicyHandler::Add(const std::string& app_id, usage_statistics::AppStopwatchId type, int32_t timespan_seconds) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->Add(app_id, type, timespan_seconds); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->Add(app_id, type, timespan_seconds); } bool PolicyHandler::IsUrlAppIdValid(const std::string app_id, @@ -2679,7 +2804,7 @@ std::vector<std::string> PolicyHandler::GetDevicesIds( void PolicyHandler::UpdateHMILevel(ApplicationSharedPtr app, mobile_apis::HMILevel::eType level) { SDL_LOG_AUTO_TRACE(); - DCHECK_OR_RETURN_VOID(app); + POLICY_LIB_CHECK_VOID(app); if (app->hmi_level(mobile_apis::PredefinedWindows::DEFAULT_WINDOW) == mobile_apis::HMILevel::HMI_NONE) { // If default is FULL, send request to HMI. Notification to mobile will be @@ -2702,14 +2827,16 @@ void PolicyHandler::UpdateHMILevel(ApplicationSharedPtr app, bool PolicyHandler::CheckModule(const PTString& app_id, const PTString& module) { - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->CheckModule(app_id, module); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->CheckModule(app_id, module); } void PolicyHandler::OnRemoteAppPermissionsChanged( const std::string& device_id, const std::string& application_id) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->SendAppPermissionsChanged(device_id, application_id); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SendAppPermissionsChanged(device_id, application_id); } void PolicyHandler::OnUpdateHMIStatus(const std::string& device_id, @@ -2723,8 +2850,7 @@ void PolicyHandler::OnUpdateHMIStatus(const std::string& device_id, << policy_app_id); return; } - mobile_apis::HMILevel::eType level = - MessageHelper::StringToHMILevel(hmi_level); + auto level = StringToEnum<mobile_apis::HMILevel::eType>(hmi_level); if (mobile_apis::HMILevel::INVALID_ENUM == level) { SDL_LOG_WARN("Couldn't convert default hmi level " << hmi_level << " to enum."); @@ -2744,8 +2870,9 @@ void PolicyHandler::OnUpdateHMIStatus(const std::string& device_id, bool PolicyHandler::GetModuleTypes(const std::string& policy_app_id, std::vector<std::string>* modules) const { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); - return policy_manager_->GetModuleTypes(policy_app_id, modules); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + return policy_manager->GetModuleTypes(policy_app_id, modules); } void PolicyHandler::SetDefaultHmiTypes( @@ -2753,7 +2880,8 @@ void PolicyHandler::SetDefaultHmiTypes( const std::string& application_id, const smart_objects::SmartObject* app_types) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_VOID(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); std::vector<int> hmi_types; if (app_types && app_types->asArray()) { smart_objects::SmartArray* hmi_list = app_types->asArray(); @@ -2762,16 +2890,17 @@ void PolicyHandler::SetDefaultHmiTypes( std::back_inserter(hmi_types), SmartObjectToInt()); } - policy_manager_->SetDefaultHmiTypes(device_handle, application_id, hmi_types); + policy_manager->SetDefaultHmiTypes(device_handle, application_id, hmi_types); } bool PolicyHandler::CheckHMIType(const std::string& application_id, mobile_apis::AppHMIType::eType hmi, const smart_objects::SmartObject* app_types) { SDL_LOG_AUTO_TRACE(); - POLICY_LIB_CHECK_OR_RETURN(false); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); std::vector<int> policy_hmi_types; - bool ret = policy_manager_->GetHMITypes(application_id, &policy_hmi_types); + bool ret = policy_manager->GetHMITypes(application_id, &policy_hmi_types); std::vector<int> additional_hmi_types; if (app_types && app_types->asArray()) { @@ -2797,8 +2926,7 @@ void PolicyHandler::OnUpdateHMILevel(const std::string& device_id, << policy_app_id); return; } - mobile_apis::HMILevel::eType level = - MessageHelper::StringToHMILevel(hmi_level); + auto level = StringToEnum<mobile_apis::HMILevel::eType>(hmi_level); if (mobile_apis::HMILevel::INVALID_ENUM == level) { SDL_LOG_WARN("Couldn't convert default hmi level " << hmi_level << " to enum."); diff --git a/src/components/application_manager/src/postponed_activation_controller.cc b/src/components/application_manager/src/postponed_activation_controller.cc new file mode 100644 index 0000000000..59ee3d05e2 --- /dev/null +++ b/src/components/application_manager/src/postponed_activation_controller.cc @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020, 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/postponed_activation_controller.h" + +namespace application_manager { + +SDL_CREATE_LOG_VARIABLE("StateControllerImpl") + +PostponedActivationController::PostponedActivationController() + : activate_app_list_lock_ptr_(std::make_shared<sync_primitives::Lock>()) {} + +void PostponedActivationController::AddAppToActivate(uint32_t app_id, + uint32_t corr_id) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(activate_app_list_lock_ptr_); + app_to_activate_.insert(std::pair<uint32_t, uint32_t>(app_id, corr_id)); +} + +uint32_t PostponedActivationController::GetPendingActivationCorrId( + uint32_t app_id) const { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(activate_app_list_lock_ptr_); + auto it = app_to_activate_.find(app_id); + if (app_to_activate_.end() == it) { + return 0; + } + return it->second; +} + +void PostponedActivationController::RemoveAppToActivate(uint32_t app_id) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(activate_app_list_lock_ptr_); + app_to_activate_.erase(app_id); +} + +} // namespace application_manager diff --git a/src/components/application_manager/src/request_controller.cc b/src/components/application_manager/src/request_controller.cc index d2db9fced2..a34457ff66 100644 --- a/src/components/application_manager/src/request_controller.cc +++ b/src/components/application_manager/src/request_controller.cc @@ -81,7 +81,7 @@ void RequestController::InitializeThreadpool() { pool_state_ = TPoolState::STARTED; char name[50]; for (uint32_t i = 0; i < pool_size_; i++) { - snprintf(name, sizeof(name) / sizeof(name[0]), "AM Pool %d", i); + snprintf(name, sizeof(name) / sizeof(name[0]), "AM Pool %u", i); pool_.push_back(threads::CreateThread(name, new Worker(this))); pool_[i]->Start(); SDL_LOG_DEBUG("Request thread initialized: " << name); diff --git a/src/components/application_manager/src/request_info.cc b/src/components/application_manager/src/request_info.cc index 1149c9aaf9..e1fffdf6fe 100644 --- a/src/components/application_manager/src/request_info.cc +++ b/src/components/application_manager/src/request_info.cc @@ -219,7 +219,7 @@ bool RequestInfoSet::Erase(const RequestInfoPtr request_info) { DCHECK(request_info == found); time_sorted_pending_requests_.erase(it); CheckSetSizes(); - return 1 == erased_count; + return true; } CheckSetSizes(); return false; diff --git a/src/components/application_manager/src/request_tracker.cc b/src/components/application_manager/src/request_tracker.cc index 5f92a107b5..2ad504aadf 100644 --- a/src/components/application_manager/src/request_tracker.cc +++ b/src/components/application_manager/src/request_tracker.cc @@ -49,8 +49,7 @@ TrackResult RequestTracker::Track(const ApplicationID& app_id, SDL_LOG_AUTO_TRACE(); bool track_result = false; - SDL_LOG_DEBUG("Tracking request for level: " - << MessageHelper::StringifiedHMILevel(level)); + SDL_LOG_DEBUG("Tracking request for level: " << EnumToString(level)); if (mobile_apis::HMILevel::HMI_NONE == level) { track_result = Track(app_id, diff --git a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc index 8295ddd1f9..6a045fda03 100644 --- a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc +++ b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc @@ -60,7 +60,8 @@ static mobile_api::HMILevel::eType PickHigherHmiLevel( mobile_api::HMILevel::eType val1, mobile_api::HMILevel::eType val2); static mobile_api::HMILevel::eType PickLowerHmiLevel( mobile_api::HMILevel::eType val1, mobile_api::HMILevel::eType val2); -static mobile_api::HMILevel::eType ConvertHmiLevelString(const std::string str); +static mobile_api::HMILevel::eType ConvertHmiLevelString( + const std::string& str); SDL_CREATE_LOG_VARIABLE("Resumption") @@ -160,10 +161,10 @@ void ResumeCtrlImpl::SaveApplication(ApplicationSharedPtr application) { resumption_storage_->SaveApplication(application); } -bool ResumeCtrlImpl::RestoreAppHMIState(ApplicationSharedPtr application) { +void ResumeCtrlImpl::RestoreAppHMIState(ApplicationSharedPtr application) { using namespace mobile_apis; SDL_LOG_AUTO_TRACE(); - DCHECK_OR_RETURN(application, false); + DCHECK(application); SDL_LOG_DEBUG("app_id : " << application->app_id() << "; policy_app_id : " << application->policy_app_id()); const std::string& device_mac = application->mac_address(); @@ -171,7 +172,6 @@ bool ResumeCtrlImpl::RestoreAppHMIState(ApplicationSharedPtr application) { bool result = resumption_storage_->GetSavedApplication( application->policy_app_id(), device_mac, saved_app); if (result) { - DCHECK_OR_RETURN(application, false); if (saved_app.keyExists(strings::hmi_level)) { HMILevel::eType saved_hmi_level; if (HMILevel::eType::INVALID_ENUM != @@ -208,16 +208,14 @@ bool ResumeCtrlImpl::RestoreAppHMIState(ApplicationSharedPtr application) { SetAppHMIState(application, saved_hmi_level, true); if (app_exists_in_full_or_limited) { SDL_LOG_DEBUG("App exists in full or limited. Do not resume"); - return false; + return; } } else { - result = false; SDL_LOG_ERROR("saved app data corrupted"); } } else { SDL_LOG_ERROR("Application not saved"); } - return result; } void ResumeCtrlImpl::ProcessSystemCapabilityUpdated( @@ -263,9 +261,8 @@ void ResumeCtrlImpl::ApplicationResumptiOnTimer() { SDL_LOG_ERROR("Invalid app_id = " << *it); continue; } - if (!StartAppHmiStateResumption(app)) { - app->set_is_resuming(false); - } + StartAppHmiStateResumption(app); + app->set_is_resuming(false); } is_resumption_active_ = false; waiting_for_timer_.clear(); @@ -493,18 +490,18 @@ void ResumeCtrlImpl::RetryResumption(const uint32_t app_id) { AddToResumptionTimerQueue(app_id); } -bool ResumeCtrlImpl::StartAppHmiStateResumption( +void ResumeCtrlImpl::StartAppHmiStateResumption( ApplicationSharedPtr application) { using namespace date_time; SDL_LOG_AUTO_TRACE(); - DCHECK_OR_RETURN(application, false); + DCHECK(application); smart_objects::SmartObject saved_app; const std::string& device_mac = application->mac_address(); const bool get_saved_app_result = resumption_storage_->GetSavedApplication( application->policy_app_id(), device_mac, saved_app); if (!get_saved_app_result) { SDL_LOG_ERROR("Application was not saved"); - return false; + return; } const bool is_hmi_level_applicable_to_resume = @@ -512,7 +509,7 @@ bool ResumeCtrlImpl::StartAppHmiStateResumption( if (!is_hmi_level_applicable_to_resume) { SDL_LOG_DEBUG("No applicable HMI level found for resuming"); - return false; + return; } const bool is_resume_allowed_by_low_voltage = CheckLowVoltageRestrictions(saved_app); @@ -530,19 +527,17 @@ bool ResumeCtrlImpl::StartAppHmiStateResumption( if (restore_hmi_level_allowed) { SDL_LOG_INFO("Resume application " << application->policy_app_id()); - const bool hmi_state_restore_result = RestoreAppHMIState(application); + RestoreAppHMIState(application); if (mobile_apis::HMILevel::eType::INVALID_ENUM != application->deferred_resumption_hmi_level()) { // the application has not been fully resumed - return false; + return; } RemoveApplicationFromSaved(application); - return hmi_state_restore_result; } else { SDL_LOG_INFO("Do not need to resume application " << application->policy_app_id()); } - return true; } void ResumeCtrlImpl::ResetLaunchTime() { @@ -1037,7 +1032,7 @@ static mobile_api::HMILevel::eType PickLowerHmiLevel( } static mobile_api::HMILevel::eType ConvertHmiLevelString( - const std::string str) { + const std::string& str) { using namespace mobile_apis; if ("BACKGROUND" == str) { @@ -1046,8 +1041,6 @@ static mobile_api::HMILevel::eType ConvertHmiLevelString( return HMILevel::HMI_FULL; } else if ("LIMITED" == str) { return HMILevel::HMI_LIMITED; - } else if ("NONE" == str) { - return HMILevel::HMI_NONE; } else { return HMILevel::HMI_NONE; } diff --git a/src/components/application_manager/src/resumption/resumption_data.cc b/src/components/application_manager/src/resumption/resumption_data.cc index 558724ecdc..95dd331b88 100644 --- a/src/components/application_manager/src/resumption/resumption_data.cc +++ b/src/components/application_manager/src/resumption/resumption_data.cc @@ -186,7 +186,7 @@ smart_objects::SmartObject ResumptionData::GetApplicationFiles( int i = 0; for (AppFilesMap::const_iterator file_it = app_files.begin(); file_it != app_files.end(); - file_it++) { + ++file_it) { const AppFile& file = file_it->second; if (file.is_persistent) { smart_objects::SmartObject file_data = diff --git a/src/components/application_manager/src/resumption/resumption_data_db.cc b/src/components/application_manager/src/resumption/resumption_data_db.cc index 88f28a41a3..f00b100913 100644 --- a/src/components/application_manager/src/resumption/resumption_data_db.cc +++ b/src/components/application_manager/src/resumption/resumption_data_db.cc @@ -1756,7 +1756,6 @@ bool ResumptionDataDB::ExecInsertChoice( field "idimage" from table "choice" = 4 field "idsecondaryImage" from table "choice" = 5*/ int64_t image_primary_key = 0; - int64_t choice_primary_key = 0; size_t length_choice_array = choice_array.length(); for (size_t i = 0; i < length_choice_array; ++i) { insert_choice.Bind(0, (choice_array[i][strings::choice_id]).asInt()); @@ -1789,7 +1788,7 @@ bool ResumptionDataDB::ExecInsertChoice( SDL_LOG_WARN("Problem with execution insert_choice query"); return false; } - choice_primary_key = insert_choice.LastInsertId(); + int64_t choice_primary_key = insert_choice.LastInsertId(); if ((!ExecInsertVrCommands(choice_primary_key, choice_array[i][strings::vr_commands], @@ -2082,7 +2081,6 @@ bool ResumptionDataDB::InsertCommandsData( } utils::dbms::SQLQuery query_insert_command(db()); int64_t image_primary_key = 0; - int64_t command_primary_key = 0; if (!query_insert_command.Prepare(kInsertToCommand)) { SDL_LOG_WARN("Problem with verification queries for insertion commands"); @@ -2121,7 +2119,7 @@ bool ResumptionDataDB::InsertCommandsData( SDL_LOG_WARN("Incorrect insertion of command data to DB"); return false; } - command_primary_key = query_insert_command.LastInsertId(); + int64_t command_primary_key = query_insert_command.LastInsertId(); if (commands[i].keyExists(strings::vr_commands)) { if (!ExecInsertVrCommands(command_primary_key, commands[i][strings::vr_commands], diff --git a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc index a490429197..792e7f97ea 100644 --- a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc +++ b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc @@ -49,14 +49,6 @@ namespace commands = app_mngr::commands; namespace message_params = rc_rpc_plugin::message_params; SDL_CREATE_LOG_VARIABLE("Resumption") -std::map<hmi_apis::Common_ModuleType::eType, std::string> - module_types_str_mapping{ - {hmi_apis::Common_ModuleType::eType::CLIMATE, {"CLIMATE"}}, - {hmi_apis::Common_ModuleType::eType::RADIO, {"RADIO"}}, - {hmi_apis::Common_ModuleType::eType::SEAT, {"SEAT"}}, - {hmi_apis::Common_ModuleType::eType::AUDIO, {"AUDIO"}}, - {hmi_apis::Common_ModuleType::eType::LIGHT, {"LIGHT"}}, - {hmi_apis::Common_ModuleType::eType::HMI_SETTINGS, {"HMI_SETTINGS"}}}; bool ResumptionRequestID::operator<(const ResumptionRequestID& other) const { return correlation_id < other.correlation_id || @@ -79,12 +71,6 @@ void ResumptionDataProcessorImpl::Restore( ResumeCtrl::ResumptionCallBack callback) { SDL_LOG_AUTO_TRACE(); - if (!HasDataToRestore(saved_app)) { - SDL_LOG_DEBUG("No data to restore, resumption is successful"); - callback(mobile_apis::Result::SUCCESS, "Data resumption succesful"); - return; - } - AddFiles(application, saved_app); AddSubmenus(application, saved_app); AddCommands(application, saved_app); @@ -93,99 +79,15 @@ void ResumptionDataProcessorImpl::Restore( AddSubscriptions(application, saved_app); AddWindows(application, saved_app); - resumption_status_lock_.AcquireForReading(); const auto app_id = application->app_id(); - bool is_requests_list_empty = true; - if (resumption_status_.find(app_id) != resumption_status_.end()) { - is_requests_list_empty = - resumption_status_[app_id].list_of_sent_requests.empty(); - } - resumption_status_lock_.Release(); - - if (!is_requests_list_empty) { + if (!IsResumptionFinished(app_id)) { sync_primitives::AutoWriteLock lock(register_callbacks_lock_); register_callbacks_[app_id] = callback; } else { - SDL_LOG_DEBUG("No requests to HMI for " << app_id - << " , resumption is successful"); - callback(mobile_apis::Result::SUCCESS, "Data resumption successful"); + FinalizeResumption(callback, app_id); } } -bool ResumptionDataProcessorImpl::HasDataToRestore( - const smart_objects::SmartObject& saved_app) const { - SDL_LOG_AUTO_TRACE(); - - auto has_data_to_restore = [&saved_app]() -> bool { - return !saved_app[strings::application_files].empty() || - !saved_app[strings::application_submenus].empty() || - !saved_app[strings::application_commands].empty() || - !saved_app[strings::application_choice_sets].empty() || - !saved_app[strings::windows_info].empty(); - }; - - auto has_gp_to_restore = [&saved_app]() -> bool { - const smart_objects::SmartObject& global_properties = - saved_app[strings::application_global_properties]; - - return !global_properties[strings::help_prompt].empty() || - !global_properties[strings::keyboard_properties].empty() || - !global_properties[strings::menu_icon].empty() || - !global_properties[strings::menu_title].empty() || - !global_properties[strings::timeout_prompt].empty() || - !global_properties[strings::vr_help].empty() || - !global_properties[strings::vr_help_title].empty(); - }; - - auto has_subscriptions_to_restore = [&saved_app]() -> bool { - const smart_objects::SmartObject& subscriptions = - saved_app[strings::application_subscriptions]; - - const bool has_ivi_subscriptions = - !subscriptions[strings::application_vehicle_info].empty(); - - const bool has_button_subscriptions = - !subscriptions[strings::application_buttons].empty() && - !(subscriptions[strings::application_buttons].length() == 1 && - static_cast<hmi_apis::Common_ButtonName::eType>( - subscriptions[strings::application_buttons][0].asInt()) == - hmi_apis::Common_ButtonName::CUSTOM_BUTTON); - - const bool has_waypoints_subscriptions = - subscriptions[strings::subscribed_for_way_points].asBool(); - - const bool has_appservice_subscriptions = - subscriptions.keyExists(app_mngr::hmi_interface::app_service) && - !subscriptions[app_mngr::hmi_interface::app_service].empty(); - - const bool has_system_capability_subscriptions = - subscriptions.keyExists(strings::system_capability) && - !subscriptions[strings::system_capability].empty(); - - return has_ivi_subscriptions || has_button_subscriptions || - has_waypoints_subscriptions || has_appservice_subscriptions || - has_system_capability_subscriptions; - }; - - if (has_data_to_restore()) { - SDL_LOG_DEBUG("Application has data to restore"); - return true; - } - - if (has_gp_to_restore()) { - SDL_LOG_DEBUG("Application has global properties to restore"); - return true; - } - - if (has_subscriptions_to_restore()) { - SDL_LOG_DEBUG("Application has subscriptions to restore"); - return true; - } - - SDL_LOG_DEBUG("Application does not have any data to restore"); - return false; -} - utils::Optional<uint32_t> ResumptionDataProcessorImpl::GetAppIdWaitingForResponse( const hmi_apis::FunctionID::eType function_id, const int32_t corr_id) { @@ -268,7 +170,7 @@ void ResumptionDataProcessorImpl::ProcessResumptionStatus( } } -bool ResumptionDataProcessorImpl::IsResumptionFinished( +void ResumptionDataProcessorImpl::EraseProcessedRequest( const uint32_t app_id, const ResumptionRequest& found_request) { SDL_LOG_AUTO_TRACE(); @@ -285,8 +187,19 @@ bool ResumptionDataProcessorImpl::IsResumptionFinished( found_request.request_id.function_id; }); list_of_sent_requests.erase(request_iter); +} + +bool ResumptionDataProcessorImpl::IsResumptionFinished( + const uint32_t app_id) const { + SDL_LOG_AUTO_TRACE(); - return list_of_sent_requests.empty(); + sync_primitives::AutoReadLock lock(resumption_status_lock_); + bool is_requests_list_empty = true; + const auto app_status = resumption_status_.find(app_id); + if (app_status != resumption_status_.end()) { + is_requests_list_empty = app_status->second.list_of_sent_requests.empty(); + } + return is_requests_list_empty; } utils::Optional<ResumeCtrl::ResumptionCallBack> @@ -307,7 +220,7 @@ bool ResumptionDataProcessorImpl::IsResumptionSuccessful( sync_primitives::AutoReadLock lock(resumption_status_lock_); auto it = resumption_status_.find(app_id); if (resumption_status_.end() == it) { - return false; + return true; } const ApplicationResumptionStatus& status = it->second; @@ -317,17 +230,27 @@ bool ResumptionDataProcessorImpl::IsResumptionSuccessful( } void ResumptionDataProcessorImpl::EraseAppResumptionData( - const uint32_t app_id, - const hmi_apis::FunctionID::eType function_id, - const int32_t corr_id) { + const uint32_t app_id) { SDL_LOG_AUTO_TRACE(); + std::vector<ResumptionRequest> all_requests; + resumption_status_lock_.AcquireForWriting(); + all_requests.insert(all_requests.end(), + resumption_status_[app_id].successful_requests.begin(), + resumption_status_[app_id].successful_requests.end()); + all_requests.insert(all_requests.end(), + resumption_status_[app_id].error_requests.begin(), + resumption_status_[app_id].error_requests.end()); + resumption_status_.erase(app_id); resumption_status_lock_.Release(); request_app_ids_lock_.AcquireForWriting(); - request_app_ids_.erase({function_id, corr_id}); + for (auto request : all_requests) { + request_app_ids_.erase( + {request.request_id.function_id, request.request_id.correlation_id}); + } request_app_ids_lock_.Release(); register_callbacks_lock_.AcquireForWriting(); @@ -362,8 +285,9 @@ void ResumptionDataProcessorImpl::ProcessResponseFromHMI( auto request = *found_request; ProcessResumptionStatus(app_id, response, request); + EraseProcessedRequest(app_id, request); - if (!IsResumptionFinished(app_id, request)) { + if (!IsResumptionFinished(app_id)) { SDL_LOG_DEBUG("Resumption app " << app_id << " not finished. Some requests are still waited"); return; @@ -375,7 +299,11 @@ void ResumptionDataProcessorImpl::ProcessResponseFromHMI( return; } auto callback = *found_callback; + FinalizeResumption(callback, app_id); +} +void ResumptionDataProcessorImpl::FinalizeResumption( + const ResumeCtrl::ResumptionCallBack& callback, const uint32_t app_id) { if (IsResumptionSuccessful(app_id)) { SDL_LOG_DEBUG("Resumption for app " << app_id << " successful"); callback(mobile_apis::Result::SUCCESS, "Data resumption successful"); @@ -386,8 +314,7 @@ void ResumptionDataProcessorImpl::ProcessResponseFromHMI( RevertRestoredData(application_manager_.application(app_id)); application_manager_.state_controller().DropPostponedWindows(app_id); } - - EraseAppResumptionData(app_id, function_id, corr_id); + EraseAppResumptionData(app_id); } void ResumptionDataProcessorImpl::HandleOnTimeOut( @@ -1117,7 +1044,7 @@ void ResumptionDataProcessorImpl::CheckModuleDataSubscription( response_module_data_so[message_params::kModuleType].asUInt()); const auto responsed_module_type_str = - module_types_str_mapping[responsed_module_type_int]; + application_manager::EnumToString(responsed_module_type_int); const auto response_module_id = response_module_data_so[message_params::kModuleId].asString(); diff --git a/src/components/application_manager/src/rpc_handler_impl.cc b/src/components/application_manager/src/rpc_handler_impl.cc index b8dad59830..4137ab93bb 100644 --- a/src/components/application_manager/src/rpc_handler_impl.cc +++ b/src/components/application_manager/src/rpc_handler_impl.cc @@ -283,6 +283,26 @@ void RPCHandlerImpl::OnMessageReceived( void RPCHandlerImpl::OnErrorSending( hmi_message_handler::MessageSharedPointer message) { + SDL_LOG_AUTO_TRACE(); + smart_objects::SmartObjectSPtr smart_object = + std::make_shared<smart_objects::SmartObject>(); + std::string warning_info; + bool allow_unknown_parameters = true; + if (ConvertMessageToSO( + *message, *smart_object, warning_info, allow_unknown_parameters)) { + (*smart_object)[strings::params][strings::message_type] = + application_manager::MessageType::kResponse; + (*smart_object).erase(strings::msg_params); + (*smart_object)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::GENERIC_ERROR; + (*smart_object)[strings::params][strings::error_msg] = + std::string("Error sending message, mb component not registered"); + + if (!app_manager_.GetRPCService().ManageHMICommand( + smart_object, commands::Command::SOURCE_HMI, warning_info)) { + SDL_LOG_ERROR("Received command didn't run successfully"); + } + } return; } diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc index 248db00729..34a0bed7af 100644 --- a/src/components/application_manager/src/rpc_service_impl.cc +++ b/src/components/application_manager/src/rpc_service_impl.cc @@ -467,8 +467,8 @@ void RPCServiceImpl::Handle(const impl::MessageToMobile message) { SDL_LOG_INFO("Message for mobile given away"); if (close_session) { - app_manager_.connection_handler().CloseSession(message->connection_key(), - connection_handler::kCommon); + app_manager_.connection_handler().CloseSession( + message->connection_key(), connection_handler::kFinalMessage); } } diff --git a/src/components/application_manager/src/state_controller_impl.cc b/src/components/application_manager/src/state_controller_impl.cc index 2eb813e69f..89dac83165 100644 --- a/src/components/application_manager/src/state_controller_impl.cc +++ b/src/components/application_manager/src/state_controller_impl.cc @@ -56,7 +56,9 @@ bool IsStateChanged(const HmiState& old_state, const HmiState& new_state) { } // unnamed namespace StateControllerImpl::StateControllerImpl(ApplicationManager& app_mngr) - : EventObserver(app_mngr.event_dispatcher()), app_mngr_(app_mngr) { + : EventObserver(app_mngr.event_dispatcher()) + , app_mngr_(app_mngr) + , postponed_activation_controller_() { subscribe_on_event(hmi_apis::FunctionID::BasicCommunication_OnAppActivated); subscribe_on_event(hmi_apis::FunctionID::BasicCommunication_OnAppDeactivated); subscribe_on_event(hmi_apis::FunctionID::TTS_Started); @@ -394,7 +396,7 @@ void StateControllerImpl::HmiLevelConflictResolver::operator()( result_video_state = mobile_apis::VideoStreamingState::STREAMABLE; } - mobile_apis::HMILevel::eType result_hmi_level = state_to_resolve->hmi_level(); + mobile_apis::HMILevel::eType result_hmi_level; using namespace helpers; if (mobile_apis::VideoStreamingState::STREAMABLE == result_video_state || @@ -408,7 +410,11 @@ void StateControllerImpl::HmiLevelConflictResolver::operator()( ? mobile_apis::HMILevel::HMI_LIMITED : to_resolve_hmi_level; } else { - result_hmi_level = mobile_apis::HMILevel::HMI_BACKGROUND; + result_hmi_level = + mobile_apis::HMILevel::HMI_FULL == to_resolve_hmi_level && + mobile_apis::HMILevel::HMI_FULL != applied_hmi_level + ? to_resolve_hmi_level + : mobile_apis::HMILevel::HMI_BACKGROUND; } if (std::make_tuple(to_resolve_hmi_level, @@ -803,11 +809,11 @@ void StateControllerImpl::on_event(const event_engine::Event& event) { case FunctionID::BasicCommunication_OnEventChanged: { bool is_active = message[strings::msg_params][hmi_notification::is_active].asBool(); - const uint32_t id = + const uint32_t event_id = message[strings::msg_params][hmi_notification::event_name].asUInt(); // TODO(AOleynik): Add verification/conversion check here const Common_EventTypes::eType state_id = - static_cast<Common_EventTypes::eType>(id); + static_cast<Common_EventTypes::eType>(event_id); if (is_active) { if (Common_EventTypes::AUDIO_SOURCE == state_id) { ApplyTempState<HmiState::STATE_ID_AUDIO_SOURCE>(); @@ -913,6 +919,12 @@ void StateControllerImpl::OnStateChanged(ApplicationSharedPtr app, SDL_LOG_DEBUG("Window #" << window_id << " old state: " << *old_state); SDL_LOG_DEBUG("Window #" << window_id << " new state: " << *new_state); + if ((new_state->hmi_level() == mobile_apis::HMILevel::INVALID_ENUM) && + (old_state->hmi_level() == mobile_apis::HMILevel::INVALID_ENUM)) { + SDL_LOG_DEBUG("HMI level is invalid data."); + return; + } + if (!IsStateChanged(*old_state, *new_state)) { SDL_LOG_DEBUG("State has NOT been changed."); return; @@ -949,6 +961,19 @@ void StateControllerImpl::OnStateChanged(ApplicationSharedPtr app, app_mngr_.OnHMIStateChanged(app->app_id(), old_state, new_state); app->usage_report().RecordHmiStateChanged(new_state->hmi_level()); + + if (mobile_apis::HMILevel::INVALID_ENUM == old_state->hmi_level()) { + const auto app_default_hmi_level = app_mngr_.GetDefaultHmiLevel(app); + if (app_default_hmi_level == new_state->hmi_level()) { + const uint32_t app_id = app->app_id(); + const uint32_t corr_id = + postponed_activation_controller_.GetPendingActivationCorrId(app_id); + if (corr_id > 0) { + app_mngr_.GetPolicyHandler().OnActivateApp(app_id, corr_id); + postponed_activation_controller_.RemoveAppToActivate(app_id); + } + } + } } bool StateControllerImpl::IsTempStateActive(HmiState::StateID id) const { @@ -1001,11 +1026,6 @@ void StateControllerImpl::OnApplicationRegistered( const mobile_apis::HMILevel::eType default_level) { SDL_LOG_AUTO_TRACE(); - if (app->is_cloud_app()) { - // Return here, there should already be an onHMIStatus=FULL being processed - // for when the cloud app was initially activated by the hmi - return; - } // After app registration HMI level should be set for DEFAULT_WINDOW only OnAppWindowAdded(app, mobile_apis::PredefinedWindows::DEFAULT_WINDOW, @@ -1405,4 +1425,9 @@ mobile_apis::VideoStreamingState::eType StateControllerImpl::CalcVideoState( return state; } +PostponedActivationController& +StateControllerImpl::GetPostponedActivationController() { + return postponed_activation_controller_; +} + } // namespace application_manager diff --git a/src/components/application_manager/test/application_impl_test.cc b/src/components/application_manager/test/application_impl_test.cc index 717df8f482..d468c9790b 100644 --- a/src/components/application_manager/test/application_impl_test.cc +++ b/src/components/application_manager/test/application_impl_test.cc @@ -837,7 +837,6 @@ TEST_F(ApplicationImplTest, StartStreaming_StreamingApproved) { TEST_F(ApplicationImplTest, SuspendNaviStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kMobileNav; - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); app_impl->SuspendStreaming(type); @@ -845,7 +844,6 @@ TEST_F(ApplicationImplTest, SuspendNaviStreaming) { TEST_F(ApplicationImplTest, SuspendAudioStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio; - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); app_impl->SuspendStreaming(type); @@ -854,12 +852,16 @@ TEST_F(ApplicationImplTest, SuspendAudioStreaming) { // TODO {AKozoriz} : Fix tests with streaming (APPLINK-19289) TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio; - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); + EXPECT_CALL( + mock_application_manager_, + OnAppStreaming(app_id, type, Application::StreamingState::kSuspended)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, false, _)); app_impl->SuspendStreaming(type); - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true)); + EXPECT_CALL( + mock_application_manager_, + OnAppStreaming(app_id, type, Application::StreamingState::kStarted)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, true, _)); app_impl->WakeUpStreaming(type); @@ -868,12 +870,16 @@ TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) { TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpNaviStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kMobileNav; - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); + EXPECT_CALL( + mock_application_manager_, + OnAppStreaming(app_id, type, Application::StreamingState::kSuspended)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, false, _)); app_impl->SuspendStreaming(type); - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true)); + EXPECT_CALL( + mock_application_manager_, + OnAppStreaming(app_id, type, Application::StreamingState::kStarted)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, true, _)); app_impl->WakeUpStreaming(type); @@ -885,7 +891,9 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) { protocol_handler::ServiceType::kMobileNav; app_impl->set_video_streaming_approved(true); - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); + EXPECT_CALL( + mock_application_manager_, + OnAppStreaming(app_id, type, Application::StreamingState::kStopped)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), @@ -897,7 +905,9 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) { // Stop audio streaming app_impl->set_audio_streaming_approved(true); type = protocol_handler::ServiceType::kAudio; - EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); + EXPECT_CALL( + mock_application_manager_, + OnAppStreaming(app_id, type, Application::StreamingState::kStopped)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc index 493d4a18fc..cf8aadb080 100644 --- a/src/components/application_manager/test/application_manager_impl_test.cc +++ b/src/components/application_manager/test/application_manager_impl_test.cc @@ -94,9 +94,14 @@ using test::components::policy_test::MockPolicyHandlerInterface; using namespace application_manager; -// custom action to call a member function with 4 arguments -ACTION_P6(InvokeMemberFuncWithArg4, ptr, memberFunc, a, b, c, d) { - (ptr->*memberFunc)(a, b, c, d); +// custom action to call a member function with 2 arguments +ACTION_P4(InvokeMemberFuncWithArg2, ptr, memberFunc, a, b) { + (ptr->*memberFunc)(a, b); +} + +// custom action to call a member function with 3 arguments +ACTION_P5(InvokeMemberFuncWithArg3, ptr, memberFunc, a, b, c) { + (ptr->*memberFunc)(a, b, c); } namespace { @@ -541,7 +546,7 @@ TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_RpcService) { bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); app_manager_impl_->OnServiceStartedCallback( @@ -552,28 +557,6 @@ TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_RpcService) { EXPECT_TRUE(rejected_params.empty()); } -TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_UnknownApp) { - AddMockApplication(); - - const connection_handler::DeviceHandle device_handle = 0; - const protocol_handler::ServiceType service_type = - protocol_handler::ServiceType::kInvalidServiceType; - const int32_t session_key = 123; - EXPECT_CALL(*mock_app_ptr_, app_id()).WillRepeatedly(Return(456)); - - bool result = false; - std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) - .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); - - app_manager_impl_->OnServiceStartedCallback( - device_handle, session_key, service_type, NULL); - - // check: return value is false and list is empty - EXPECT_FALSE(result); - EXPECT_TRUE(rejected_params.empty()); -} - TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_UnknownService) { AddMockApplication(); @@ -585,7 +568,7 @@ TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_UnknownService) { bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); app_manager_impl_->OnServiceStartedCallback( @@ -616,7 +599,7 @@ TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_VideoServiceStart) { bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); // check: SetVideoConfig() should not be called, StartStreaming() is called @@ -647,7 +630,7 @@ TEST_F(ApplicationManagerImplTest, bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); // check: SetVideoConfig() and StartStreaming() should not be called @@ -684,7 +667,7 @@ TEST_F(ApplicationManagerImplTest, bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); // check: SetVideoConfig() and StartStreaming() should not be called @@ -720,7 +703,7 @@ TEST_F(ApplicationManagerImplTest, bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); BsonObject input_params; @@ -746,18 +729,15 @@ TEST_F(ApplicationManagerImplTest, converted_params[strings::height] = 640; converted_params[strings::width] = 480; - std::vector<std::string> empty; - // check: SetVideoConfig() and StartStreaming() are called EXPECT_CALL(*mock_app_ptr_, SetVideoConfig(service_type, converted_params)) - .WillOnce(DoAll(InvokeMemberFuncWithArg4( - app_manager_impl_.get(), - &ApplicationManagerImpl::OnStreamingConfigured, - session_key, - service_type, - true, - ByRef(empty)), - Return(true))); + .WillOnce( + DoAll(InvokeMemberFuncWithArg2( + app_manager_impl_.get(), + &ApplicationManagerImpl::OnStreamingConfigurationSuccessful, + session_key, + service_type), + Return(true))); EXPECT_CALL(*mock_app_ptr_, StartStreaming(service_type)).WillOnce(Return()); app_manager_impl_->OnServiceStartedCallback( @@ -809,7 +789,7 @@ TEST_F(ApplicationManagerImplTest, bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); BsonObject input_params; @@ -838,17 +818,18 @@ TEST_F(ApplicationManagerImplTest, std::vector<std::string> rejected_list; rejected_list.push_back(std::string("protocol")); rejected_list.push_back(std::string("codec")); + std::string reason; // simulate HMI returning negative response EXPECT_CALL(*mock_app_ptr_, SetVideoConfig(service_type, converted_params)) - .WillOnce(DoAll(InvokeMemberFuncWithArg4( - app_manager_impl_.get(), - &ApplicationManagerImpl::OnStreamingConfigured, - session_key, - service_type, - false, - ByRef(rejected_list)), - Return(true))); + .WillOnce( + DoAll(InvokeMemberFuncWithArg3( + app_manager_impl_.get(), + &ApplicationManagerImpl::OnStreamingConfigurationFailed, + session_key, + ByRef(rejected_list), + ByRef(reason)), + Return(true))); // check: StartStreaming() should not be called EXPECT_CALL(*mock_app_ptr_, StartStreaming(service_type)).Times(0); @@ -888,7 +869,7 @@ TEST_F(ApplicationManagerImplTest, bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); BsonObject input_params; @@ -928,7 +909,7 @@ TEST_F(ApplicationManagerImplTest, OnServiceStartedCallback_AudioServiceStart) { bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); // check: SetVideoConfig() should not be called, StartStreaming() is called @@ -963,7 +944,7 @@ TEST_F(ApplicationManagerImplTest, bool result = false; std::vector<std::string> rejected_params; - EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _)) + EXPECT_CALL(mock_connection_handler_, NotifyServiceStartedResult(_, _, _, _)) .WillOnce(DoAll(SaveArg<1>(&result), SaveArg<2>(&rejected_params))); BsonObject input_params; @@ -1576,7 +1557,7 @@ TEST_F(ApplicationManagerImplTest, // - .ini file specifies TCP_WIFI for EMPTY_APP entry. // -> The app does not have required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - NULL, + nullptr, primary_device_handle, primary_transport_device_string, secondary_device_handle, diff --git a/src/components/application_manager/test/hmi_capabilities_old_apt.json b/src/components/application_manager/test/hmi_capabilities_old_apt.json index 5a5af37e2f..56ae151caa 100644 --- a/src/components/application_manager/test/hmi_capabilities_old_apt.json +++ b/src/components/application_manager/test/hmi_capabilities_old_apt.json @@ -2,7 +2,7 @@ "UI": { "audioPassThruCapabilities": { "samplingRate": "22KHZ", - "bitsPerSample": "RATE_16_BIT", + "bitsPerSample": "16_BIT", "audioType": "PCM" } } diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 73e86fc7a7..4e2e948335 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -80,45 +80,6 @@ using ::testing::ReturnRef; using namespace application_manager; -typedef std::map<std::string, hmi_apis::Common_Language::eType> - LanguageCStringToEnumMap; - -typedef std::map<std::string, hmi_apis::Common_LightName::eType> - LightNameCStringToEnumMap; - -static LanguageCStringToEnumMap languages_map; -static LightNameCStringToEnumMap light_names_map; - -const std::vector<std::string> language_string_values{ - {"EN-US"}, {"ES-MX"}, {"FR-CA"}, {"DE-DE"}, {"ES-ES"}, {"EN-GB"}, {"RU-RU"}, - {"TR-TR"}, {"PL-PL"}, {"FR-FR"}, {"IT-IT"}, {"SV-SE"}, {"PT-PT"}, {"NL-NL"}, - {"EN-AU"}, {"ZH-CN"}, {"ZH-TW"}, {"JA-JP"}, {"AR-SA"}, {"KO-KR"}, {"PT-BR"}, - {"CS-CZ"}, {"DA-DK"}, {"NO-NO"}, {"NL-BE"}, {"EL-GR"}, {"HU-HU"}, {"FI-FI"}, - {"SK-SK"}, {"EN-IN"}, {"TH-TH"}, {"EN-SA"}, {"HE-IL"}, {"RO-RO"}, {"UK-UA"}, - {"ID-ID"}, {"VI-VN"}, {"MS-MY"}, {"HI-IN"}}; - -const std::vector<hmi_apis::Common_Language::eType> language_enum_values{ - hmi_apis::Common_Language::EN_US, hmi_apis::Common_Language::ES_MX, - hmi_apis::Common_Language::FR_CA, hmi_apis::Common_Language::DE_DE, - hmi_apis::Common_Language::ES_ES, hmi_apis::Common_Language::EN_GB, - hmi_apis::Common_Language::RU_RU, hmi_apis::Common_Language::TR_TR, - hmi_apis::Common_Language::PL_PL, hmi_apis::Common_Language::FR_FR, - hmi_apis::Common_Language::IT_IT, hmi_apis::Common_Language::SV_SE, - hmi_apis::Common_Language::PT_PT, hmi_apis::Common_Language::NL_NL, - hmi_apis::Common_Language::EN_AU, hmi_apis::Common_Language::ZH_CN, - hmi_apis::Common_Language::ZH_TW, hmi_apis::Common_Language::JA_JP, - hmi_apis::Common_Language::AR_SA, hmi_apis::Common_Language::KO_KR, - hmi_apis::Common_Language::PT_BR, hmi_apis::Common_Language::CS_CZ, - hmi_apis::Common_Language::DA_DK, hmi_apis::Common_Language::NO_NO, - hmi_apis::Common_Language::NL_BE, hmi_apis::Common_Language::EL_GR, - hmi_apis::Common_Language::HU_HU, hmi_apis::Common_Language::FI_FI, - hmi_apis::Common_Language::SK_SK, hmi_apis::Common_Language::EN_IN, - hmi_apis::Common_Language::TH_TH, hmi_apis::Common_Language::EN_SA, - hmi_apis::Common_Language::HE_IL, hmi_apis::Common_Language::RO_RO, - hmi_apis::Common_Language::UK_UA, hmi_apis::Common_Language::ID_ID, - hmi_apis::Common_Language::VI_VN, hmi_apis::Common_Language::MS_MY, - hmi_apis::Common_Language::HI_IN}; - const std::vector<hmi_apis::Common_LightName::eType> light_name_enum_values{ hmi_apis::Common_LightName::eType::FRONT_LEFT_HIGH_BEAM, hmi_apis::Common_LightName::eType::FRONT_RIGHT_HIGH_BEAM, @@ -169,109 +130,6 @@ const std::vector<hmi_apis::Common_LightName::eType> light_name_enum_values{ hmi_apis::Common_LightName::eType::EXTERIOR_RIGHT_LIGHTS, hmi_apis::Common_LightName::eType::EXTERIOR_ALL_LIGHTS}; -const std::vector<std::string> light_name_string_values{ - {"FRONT_LEFT_HIGH_BEAM"}, - {"FRONT_RIGHT_HIGH_BEAM"}, - {"FRONT_LEFT_LOW_BEAM"}, - {"FRONT_RIGHT_LOW_BEAM"}, - {"FRONT_LEFT_PARKING_LIGHT"}, - {"FRONT_RIGHT_PARKING_LIGHT"}, - {"FRONT_LEFT_FOG_LIGHT"}, - {"FRONT_RIGHT_FOG_LIGHT"}, - {"FRONT_LEFT_DAYTIME_RUNNING_LIGHT"}, - {"FRONT_RIGHT_DAYTIME_RUNNING_LIGHT"}, - {"FRONT_LEFT_TURN_LIGHT"}, - {"FRONT_RIGHT_TURN_LIGHT"}, - {"REAR_LEFT_FOG_LIGHT"}, - {"REAR_RIGHT_FOG_LIGHT"}, - {"REAR_LEFT_TAIL_LIGHT"}, - {"REAR_RIGHT_TAIL_LIGHT"}, - {"REAR_LEFT_BRAKE_LIGHT"}, - {"REAR_RIGHT_BRAKE_LIGHT"}, - {"REAR_LEFT_TURN_LIGHT"}, - {"REAR_RIGHT_TURN_LIGHT"}, - {"REAR_REGISTRATION_PLATE_LIGHT"}, - {"HIGH_BEAMS"}, - {"LOW_BEAMS"}, - {"FOG_LIGHTS"}, - {"RUNNING_LIGHTS"}, - {"PARKING_LIGHTS"}, - {"BRAKE_LIGHTS"}, - {"REAR_REVERSING_LIGHTS"}, - {"SIDE_MARKER_LIGHTS"}, - {"LEFT_TURN_LIGHTS"}, - {"RIGHT_TURN_LIGHTS"}, - {"HAZARD_LIGHTS"}, - {"REAR_CARGO_LIGHTS"}, - {"REAR_TRUCK_BED_LIGHTS"}, - {"REAR_TRAILER_LIGHTS"}, - {"LEFT_SPOT_LIGHTS"}, - {"RIGHT_SPOT_LIGHTS"}, - {"LEFT_PUDDLE_LIGHTS"}, - {"RIGHT_PUDDLE_LIGHTS"}, - {"AMBIENT_LIGHTS"}, - {"OVERHEAD_LIGHTS"}, - {"READING_LIGHTS"}, - {"TRUNK_LIGHTS"}, - {"EXTERIOR_FRONT_LIGHTS"}, - {"EXTERIOR_REAR_LIGHTS"}, - {"EXTERIOR_LEFT_LIGHTS"}, - {"EXTERIOR_RIGHT_LIGHTS"}, - {"EXTERIOR_ALL_LIGHTS"}}; - -void InitLightNameStringToEnumMap( - LightNameCStringToEnumMap& out_light_names_map) { - for (size_t i = 0; i < light_name_string_values.size(); ++i) { - out_light_names_map[light_name_string_values[i]] = - light_name_enum_values[i]; - } -} - -bool LightNameStringToEnum(const std::string& light_name_str, - hmi_apis::Common_LightName::eType& out_value) { - auto it = light_names_map.find(light_name_str); - if (it == light_names_map.end()) { - return false; - } - out_value = it->second; - return true; -} - -void InitLanguageStringToEnumMap(LanguageCStringToEnumMap& out_languages_map) { - for (size_t i = 0; i < language_string_values.size(); ++i) { - out_languages_map[language_string_values[i]] = language_enum_values[i]; - } -} - -bool LanguageStringToEnum(const std::string& language_str, - hmi_apis::Common_Language::eType& out_value) { - LanguageCStringToEnumMap::const_iterator it = - languages_map.find(language_str); - if (it == languages_map.end()) { - return false; - } - out_value = it->second; - return true; -} - -hmi_apis::Common_Language::eType TestCommonLanguageFromString( - const std::string& language) { - hmi_apis::Common_Language::eType value; - if (LanguageStringToEnum(language, value)) { - return value; - } - return hmi_apis::Common_Language::INVALID_ENUM; -} - -hmi_apis::Common_LightName::eType TestCommonLightNameFromString( - const std::string& light_name_str) { - hmi_apis::Common_LightName::eType value; - if (LightNameStringToEnum(light_name_str, value)) { - return value; - } - return hmi_apis::Common_LightName::INVALID_ENUM; -} - bool IsLightNameExists(const hmi_apis::Common_LightName::eType& light_name) { auto it = std::find( light_name_enum_values.begin(), light_name_enum_values.end(), light_name); @@ -283,14 +141,7 @@ class HMICapabilitiesTest : public ::testing::Test { HMICapabilitiesTest() : last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( std::make_shared<resumption::LastStateImpl>(kAppStorageFolder, - kAppInfoStorage))) { - if (languages_map.empty()) { - InitLanguageStringToEnumMap(languages_map); - } - if (light_names_map.empty()) { - InitLightNameStringToEnumMap(light_names_map); - } - } + kAppInfoStorage))) {} void SetUp() OVERRIDE { ON_CALL(mock_app_mngr_, event_dispatcher()) @@ -325,13 +176,6 @@ class HMICapabilitiesTest : public ::testing::Test { void SetUpLanguageAndLightCapabilitiesExpectation() { ON_CALL(mock_app_mngr_, IsSOStructValid(_, _)).WillByDefault(Return(true)); - - EXPECT_CALL(*(MockMessageHelper::message_helper_mock()), - CommonLanguageFromString(_)) - .WillRepeatedly(Invoke(TestCommonLanguageFromString)); - EXPECT_CALL(*(MockMessageHelper::message_helper_mock()), - CommonLightNameFromString(_)) - .WillRepeatedly(Invoke(TestCommonLightNameFromString)); } std::shared_ptr<HMICapabilitiesImpl> hmi_capabilities_; @@ -1011,10 +855,6 @@ TEST_F(HMICapabilitiesTest, ON_CALL(mock_application_manager_settings_, hmi_capabilities_file_name()) .WillByDefault(ReturnRef(hmi_capabilities_file)); - EXPECT_CALL(*(MockMessageHelper::message_helper_mock()), - CommonLanguageFromString(_)) - .WillRepeatedly(Invoke(TestCommonLanguageFromString)); - hmi_capabilities_->Init(last_state_wrapper_); // with old audio pass thru format, the object is an array containing a single @@ -1201,10 +1041,7 @@ TEST_F( HMICapabilitiesTest, SaveCachedCapabilitiesToFile_LanguageIsNotTheSameAsPersisted_SaveNewLanguageToCache) { SetUpLanguageAndLightCapabilitiesExpectation(); - const std::string new_language = "RU_RU"; - ON_CALL(*(MockMessageHelper::message_helper_mock()), - CommonLanguageToString(_)) - .WillByDefault(Return(new_language)); + const std::string new_language = "RU-RU"; hmi_capabilities_->Init(last_state_wrapper_); hmi_capabilities_->set_active_tts_language(hmi_apis::Common_Language::RU_RU); diff --git a/src/components/application_manager/test/include/application_manager/mock_application.h b/src/components/application_manager/test/include/application_manager/mock_application.h index 3c1ddca125..454b43b99f 100644 --- a/src/components/application_manager/test/include/application_manager/mock_application.h +++ b/src/components/application_manager/test/include/application_manager/mock_application.h @@ -88,9 +88,8 @@ class MockApplication : public ::application_manager::Application { void(protocol_handler::ServiceType service_type)); MOCK_METHOD1(SuspendStreaming, void(protocol_handler::ServiceType service_type)); - MOCK_METHOD2(WakeUpStreaming, - void(protocol_handler::ServiceType service_type, - uint32_t timer_len)); + MOCK_METHOD1(WakeUpStreaming, + void(protocol_handler::ServiceType service_type)); MOCK_CONST_METHOD0(is_voice_communication_supported, bool()); MOCK_METHOD1(set_voice_communication_supported, void(bool is_voice_communication_supported)); diff --git a/src/components/application_manager/test/include/application_manager/mock_message_helper.h b/src/components/application_manager/test/include/application_manager/mock_message_helper.h index 3b4df0af1b..d7919a374b 100644 --- a/src/components/application_manager/test/include/application_manager/mock_message_helper.h +++ b/src/components/application_manager/test/include/application_manager/mock_message_helper.h @@ -57,22 +57,12 @@ class MockMessageHelper { smart_objects::SmartObjectSPtr(const uint32_t app_id)); MOCK_METHOD2(SendHashUpdateNotification, void(const uint32_t app_id, ApplicationManager& app_mngr)); - MOCK_METHOD1(HMIResultToString, - std::string(hmi_apis::Common_Result::eType hmi_result)); - MOCK_METHOD1(HMIResultFromString, - hmi_apis::Common_Result::eType(const std::string& hmi_result)); - MOCK_METHOD1(MobileResultToString, - std::string(mobile_apis::Result::eType mobile_result)); - MOCK_METHOD1(MobileResultFromString, - mobile_api::Result::eType(const std::string& mobile_result)); MOCK_METHOD1(HMIToMobileResult, mobile_api::Result::eType( const hmi_apis::Common_Result::eType hmi_result)); MOCK_METHOD1(MobileToHMIResult, hmi_apis::Common_Result::eType( const mobile_api::Result::eType mobile_result)); - MOCK_METHOD1(StringToHMILevel, - mobile_api::HMILevel::eType(const std::string& hmi_level)); MOCK_METHOD3(CreateDeviceListSO, smart_objects::SmartObjectSPtr( const connection_handler::DeviceMap& devices, @@ -177,14 +167,6 @@ class MockMessageHelper { const std::vector<uint8_t>& policy_data, const std::string& url, ApplicationManager& app_mngr)); - MOCK_METHOD1(CommonLanguageFromString, - hmi_apis::Common_Language::eType(const std::string& language)); - MOCK_METHOD1(CommonLightNameFromString, - hmi_apis::Common_LightName::eType(const std::string& lightName)); - MOCK_METHOD1(CommonLanguageToString, - std::string(hmi_apis::Common_Language::eType)); - MOCK_METHOD1(MobileLanguageToString, - std::string(mobile_apis::Language::eType)); MOCK_METHOD2(CreateModuleInfoSO, smart_objects::SmartObjectSPtr(uint32_t function_id, ApplicationManager& app_mngr)); @@ -340,8 +322,6 @@ class MockMessageHelper { void(const uint32_t app_id, const std::string& icon_path, ApplicationManager& application_manager)); - MOCK_METHOD1(StringifiedHMILevel, - std::string(const mobile_apis::HMILevel::eType hmi_level)); MOCK_METHOD2(GetDeviceMacAddressForHandle, std::string(const transport_manager::DeviceHandle device_handle, const ApplicationManager& app_mngr)); diff --git a/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h b/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h index 6b2d31f72f..c2c02a1d0c 100644 --- a/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h +++ b/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h @@ -96,11 +96,11 @@ class MockResumeCtrl : public resumption::ResumeCtrl { MOCK_CONST_METHOD2(GetSavedAppHmiLevel, int32_t(const std::string&, const std::string&)); MOCK_METHOD1(RestoreAppHMIState, - bool(application_manager::ApplicationSharedPtr application)); + void(application_manager::ApplicationSharedPtr application)); MOCK_METHOD1(SetupDefaultHMILevel, bool(application_manager::ApplicationSharedPtr application)); MOCK_METHOD1(StartAppHmiStateResumption, - bool(application_manager::ApplicationSharedPtr application)); + void(application_manager::ApplicationSharedPtr application)); MOCK_METHOD3(SetAppHMIState, bool(application_manager::ApplicationSharedPtr application, const mobile_apis::HMILevel::eType hmi_level, diff --git a/src/components/application_manager/test/message_helper/message_helper_test.cc b/src/components/application_manager/test/message_helper/message_helper_test.cc index 273775bebf..c380805bc2 100644 --- a/src/components/application_manager/test/message_helper/message_helper_test.cc +++ b/src/components/application_manager/test/message_helper/message_helper_test.cc @@ -641,41 +641,6 @@ class MessageHelperTest : public ::testing::Test { const size_t delta_from_functions_id; }; -TEST_F(MessageHelperTest, - CommonLanguageFromString_StringValueOfEnum_CorrectEType) { - HmiLanguage::eType enum_value; - HmiLanguage::eType enum_from_string_value; - // Check all languages >= 0 - for (size_t array_index = 0; array_index < language_strings.size(); - ++array_index) { - enum_value = static_cast<HmiLanguage::eType>(array_index); - enum_from_string_value = - MessageHelper::CommonLanguageFromString(language_strings[array_index]); - EXPECT_EQ(enum_value, enum_from_string_value); - } - // Check InvalidEnum == -1 - enum_value = HmiLanguage::INVALID_ENUM; - enum_from_string_value = MessageHelper::CommonLanguageFromString(""); - EXPECT_EQ(enum_value, enum_from_string_value); -} - -TEST_F(MessageHelperTest, - CommonLanguageToString_ETypeValueOfEnum_CorrectString) { - std::string string_from_enum; - HmiLanguage::eType casted_enum; - // Check all languages >=0 - for (size_t array_index = 0; array_index < language_strings.size(); - ++array_index) { - casted_enum = static_cast<HmiLanguage::eType>(array_index); - string_from_enum = MessageHelper::CommonLanguageToString(casted_enum); - EXPECT_EQ(language_strings[array_index], string_from_enum); - } - // Check InvalidEnum == -1 - string_from_enum = - MessageHelper::CommonLanguageToString(HmiLanguage::INVALID_ENUM); - EXPECT_EQ("", string_from_enum); -} - TEST_F(MessageHelperTest, ConvertEnumAPINoCheck_AnyEnumType_AnotherEnumType) { hmi_apis::Common_LayoutMode::eType tested_enum_value = hmi_apis::Common_LayoutMode::ICON_ONLY; @@ -686,38 +651,6 @@ TEST_F(MessageHelperTest, ConvertEnumAPINoCheck_AnyEnumType_AnotherEnumType) { EXPECT_EQ(hmi_apis::Common_AppHMIType::DEFAULT, converted); } -TEST_F(MessageHelperTest, HMIResultFromString_StringValueOfEnum_CorrectEType) { - HmiResults::eType enum_value; - HmiResults::eType enum_from_string_value; - // Check all results >= 0 - for (size_t array_index = 0; array_index < hmi_result_strings.size(); - ++array_index) { - enum_value = static_cast<HmiResults::eType>(array_index); - enum_from_string_value = - MessageHelper::HMIResultFromString(hmi_result_strings[array_index]); - EXPECT_EQ(enum_value, enum_from_string_value); - } - // Check InvalidEnum == -1 - enum_value = HmiResults::INVALID_ENUM; - enum_from_string_value = MessageHelper::HMIResultFromString(""); - EXPECT_EQ(enum_value, enum_from_string_value); -} - -TEST_F(MessageHelperTest, HMIResultToString_ETypeValueOfEnum_CorrectString) { - std::string string_from_enum; - HmiResults::eType casted_enum; - // Check all results >=0 - for (size_t array_index = 0; array_index < hmi_result_strings.size(); - ++array_index) { - casted_enum = static_cast<HmiResults::eType>(array_index); - string_from_enum = MessageHelper::HMIResultToString(casted_enum); - EXPECT_EQ(hmi_result_strings[array_index], string_from_enum); - } - // Check InvalidEnum == -1 - string_from_enum = MessageHelper::HMIResultToString(HmiResults::INVALID_ENUM); - EXPECT_EQ("", string_from_enum); -} - TEST_F(MessageHelperTest, HMIToMobileResult_HmiResultEType_GetCorrectMobileResultEType) { MobileResults::eType tested_enum; @@ -727,7 +660,7 @@ TEST_F(MessageHelperTest, for (size_t enum_index = 0; enum_index < hmi_result_strings.size(); ++enum_index) { tested_enum = - MessageHelper::MobileResultFromString(hmi_result_strings[enum_index]); + StringToEnum<MobileResults::eType>(hmi_result_strings[enum_index]); casted_hmi_enum = static_cast<HmiResults::eType>(enum_index); converted_enum = MessageHelper::HMIToMobileResult(casted_hmi_enum); EXPECT_EQ(tested_enum, converted_enum); @@ -955,27 +888,6 @@ TEST_F(MessageHelperTest, } } -TEST_F(MessageHelperTest, - StringifiedHmiLevel_LevelEnum_EqualsWithStringsInArray) { - mobile_apis::HMILevel::eType casted_enum; - std::string converted_value; - for (size_t i = 0; i < hmi_level_strings.size(); ++i) { - casted_enum = static_cast<mobile_apis::HMILevel::eType>(i); - converted_value = MessageHelper::StringifiedHMILevel(casted_enum); - EXPECT_EQ(hmi_level_strings[i], converted_value); - } -} - -TEST_F(MessageHelperTest, StringToHmiLevel_LevelString_EqEType) { - mobile_apis::HMILevel::eType tested_enum; - mobile_apis::HMILevel::eType converted_enum; - for (size_t i = 0; i < hmi_level_strings.size(); ++i) { - tested_enum = static_cast<mobile_apis::HMILevel::eType>(i); - converted_enum = MessageHelper::StringToHMILevel(hmi_level_strings[i]); - EXPECT_EQ(tested_enum, converted_enum); - } -} - TEST_F(MessageHelperTest, SubscribeApplicationToSoftButton_CallFromApp) { // Create application mock MockApplicationSharedPtr appSharedPtr = std::make_shared<MockApplication>(); diff --git a/src/components/application_manager/test/mock_message_helper.cc b/src/components/application_manager/test/mock_message_helper.cc index fdad51ad63..91f953eaf5 100644 --- a/src/components/application_manager/test/mock_message_helper.cc +++ b/src/components/application_manager/test/mock_message_helper.cc @@ -102,30 +102,6 @@ smart_objects::SmartObjectSPtr GetHashUpdateNotification( app_id); } -std::string MessageHelper::HMIResultToString( - hmi_apis::Common_Result::eType hmi_result) { - return MockMessageHelper::message_helper_mock()->HMIResultToString( - hmi_result); -} - -hmi_apis::Common_Result::eType MessageHelper::HMIResultFromString( - const std::string& hmi_result) { - return MockMessageHelper::message_helper_mock()->HMIResultFromString( - hmi_result); -} - -std::string MessageHelper::MobileResultToString( - mobile_apis::Result::eType mobile_result) { - return MockMessageHelper::message_helper_mock()->MobileResultToString( - mobile_result); -} - -mobile_api::Result::eType MessageHelper::MobileResultFromString( - const std::string& mobile_result) { - return MockMessageHelper::message_helper_mock()->MobileResultFromString( - mobile_result); -} - mobile_api::Result::eType MessageHelper::HMIToMobileResult( const hmi_apis::Common_Result::eType hmi_result) { return MockMessageHelper::message_helper_mock()->HMIToMobileResult( @@ -138,11 +114,6 @@ hmi_apis::Common_Result::eType MessageHelper::MobileToHMIResult( mobile_result); } -mobile_api::HMILevel::eType MessageHelper::StringToHMILevel( - const std::string& hmi_level) { - return MockMessageHelper::message_helper_mock()->StringToHMILevel(hmi_level); -} - smart_objects::SmartObjectSPtr MessageHelper::CreateDeviceListSO( const connection_handler::DeviceMap& devices, const policy::PolicyHandlerInterface& policy_handler, @@ -286,18 +257,6 @@ void MessageHelper::SendUpdateSDLResponse(const std::string& result, result, correlation_id, app_mngr); } -hmi_apis::Common_Language::eType MessageHelper::CommonLanguageFromString( - const std::string& language) { - return MockMessageHelper::message_helper_mock()->CommonLanguageFromString( - language); -} - -hmi_apis::Common_LightName::eType MessageHelper::CommonLightNameFromString( - const std::string& lightName) { - return MockMessageHelper::message_helper_mock()->CommonLightNameFromString( - lightName); -} - smart_objects::SmartObjectSPtr MessageHelper::CreateModuleInfoSO( uint32_t function_id, ApplicationManager& app_mngr) { return MockMessageHelper::message_helper_mock()->CreateModuleInfoSO( @@ -376,16 +335,6 @@ mobile_apis::Result::eType MessageHelper::VerifyImageFiles( message, app, app_mngr); } -std::string MessageHelper::CommonLanguageToString( - hmi_apis::Common_Language::eType lang) { - return MockMessageHelper::message_helper_mock()->CommonLanguageToString(lang); -} - -std::string MessageHelper::MobileLanguageToString( - mobile_apis::Language::eType lang) { - return MockMessageHelper::message_helper_mock()->MobileLanguageToString(lang); -} - smart_objects::SmartObjectSPtr MessageHelper::GetBCActivateAppRequestToHMI( ApplicationConstSharedPtr app, const policy::PolicyHandlerInterface& policy_handler, @@ -574,12 +523,6 @@ void MessageHelper::SendSetAppIcon(const uint32_t app_id, app_id, icon_path, application_manager); } -std::string MessageHelper::StringifiedHMILevel( - const mobile_apis::HMILevel::eType hmi_level) { - return MockMessageHelper::message_helper_mock()->StringifiedHMILevel( - hmi_level); -} - std::string MessageHelper::GetDeviceMacAddressForHandle( const transport_manager::DeviceHandle device_handle, const ApplicationManager& app_mngr) { diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc index 35fa7d912e..39ad034d6f 100644 --- a/src/components/application_manager/test/policy_handler_test.cc +++ b/src/components/application_manager/test/policy_handler_test.cc @@ -248,8 +248,6 @@ class PolicyHandlerTest : public ::testing::Test { EXPECT_CALL(*mock_app_, hmi_level(kDefaultWindowId)) .WillOnce(Return(mobile_apis::HMILevel::HMI_NONE)); - EXPECT_CALL(mock_message_helper_, StringToHMILevel(default_hmi_level)) - .WillOnce(Return(hmi_level)); ChangePolicyManagerToMock(); const policy::EncryptionRequired require_encryption; EXPECT_CALL(*mock_policy_manager_, GetAppEncryptionRequired(kPolicyAppId_)) @@ -593,16 +591,13 @@ TEST_F(PolicyHandlerTest, TEST_F(PolicyHandlerTest, OnPermissionsUpdated_MethodWith3Parameters_FromNONE_ToFULL) { // Set hmi level from NONE to FULL - const std::string new_kHmiLevel_string = "HMI_FULL"; + const std::string new_kHmiLevel_string = "FULL"; mobile_apis::HMILevel::eType new_hmi_level = mobile_apis::HMILevel::HMI_FULL; // Check expectations EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .Times(2) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); - EXPECT_CALL(mock_message_helper_, StringToHMILevel(new_kHmiLevel_string)) - .WillOnce(Return(new_hmi_level)); - EXPECT_CALL(*mock_app_, hmi_level(kDefaultWindowId)) .WillOnce(Return(mobile_apis::HMILevel::HMI_NONE)); ChangePolicyManagerToMock(); @@ -625,7 +620,7 @@ TEST_F(PolicyHandlerTest, TEST_F(PolicyHandlerTest, OnPermissionsUpdated_MethodWith3Parameters_FromNONE_ToNotFull) { // Set hmi level from NONE to Limited - const std::string new_kHmiLevel_string = "HMI_LIMITED"; + const std::string new_kHmiLevel_string = "LIMITED"; mobile_apis::HMILevel::eType new_hmi_level = mobile_apis::HMILevel::HMI_LIMITED; // Check expectations @@ -633,9 +628,6 @@ TEST_F(PolicyHandlerTest, .Times(2) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); - EXPECT_CALL(mock_message_helper_, StringToHMILevel(new_kHmiLevel_string)) - .WillOnce(Return(new_hmi_level)); - EXPECT_CALL(*mock_app_, hmi_level(kDefaultWindowId)) .WillOnce(Return(mobile_apis::HMILevel::HMI_NONE)); ChangePolicyManagerToMock(); @@ -658,15 +650,12 @@ TEST_F(PolicyHandlerTest, TEST_F(PolicyHandlerTest, OnPermissionsUpdated_MethodWith3Parameters_FromNotNONE) { // Set hmi level from LIMITED to FULL - std::string new_kHmiLevel_string = "HMI_FULL"; - mobile_apis::HMILevel::eType new_hmi_level = mobile_apis::HMILevel::HMI_FULL; + std::string new_kHmiLevel_string = "FULL"; // Check expectations EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .Times(2) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); - EXPECT_CALL(mock_message_helper_, StringToHMILevel(new_kHmiLevel_string)) - .WillOnce(Return(new_hmi_level)); EXPECT_CALL(*mock_app_, hmi_level(kDefaultWindowId)) .WillOnce(Return(mobile_apis::HMILevel::HMI_LIMITED)); @@ -716,8 +705,6 @@ TEST_F(PolicyHandlerTest, CheckPermissions) { CheckPermissions( kDeviceId, kPolicyAppId_, kHmiLevel_, kRpc_, kRpc_params, _)); #endif // EXTERNAL_PROPRIETARY_MODE - EXPECT_CALL(mock_message_helper_, StringifiedHMILevel(hmi_level)) - .WillOnce(Return(kHmiLevel_)); EXPECT_CALL(mock_message_helper_, GetDeviceMacAddressForHandle(device, _)) .WillOnce(Return(kDeviceId)); // Act @@ -1248,17 +1235,15 @@ TEST_F(PolicyHandlerTest, OnGetUserFriendlyMessage) { ChangePolicyManagerToMock(); // Check expectations std::vector<std::string> message_codes; - const std::string language("ru-ru"); + const std::string language("RU-RU"); const uint32_t correlation_id = 2; #ifdef EXTERNAL_PROPRIETARY_MODE const hmi_apis::Common_Language::eType default_language = hmi_apis::Common_Language::EN_US; - const std::string default_language_string = "EN_US"; + const std::string default_language_string = "EN-US"; application_manager_test::MockHMICapabilities mock_hmi_capabilities; EXPECT_CALL(app_manager_, hmi_capabilities()) .WillOnce(ReturnRef(mock_hmi_capabilities)); - EXPECT_CALL(mock_message_helper_, CommonLanguageToString(default_language)) - .WillOnce(Return(default_language_string)); EXPECT_CALL(mock_hmi_capabilities, active_ui_language()) .WillOnce(Return(default_language)); EXPECT_CALL( @@ -3073,16 +3058,12 @@ TEST_F(PolicyHandlerTest, GetAppPropertiesStatus_HybridAppNotChanged_SUCCESS) { } TEST_F(PolicyHandlerTest, GetAppPropertiesStatus_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); policy_handler_.LoadPolicyLibrary(); smart_objects::SmartObject properties; properties[strings::app_id] = kPolicyAppId_; - EXPECT_CALL(*mock_policy_manager_, GetAppProperties(_, _)).Times(0); - EXPECT_CALL(*mock_policy_manager_, GetInitialAppData(_, _, _)).Times(0); const auto expected_app_properties_state = policy::PolicyHandlerInterface::AppPropertiesState::NO_CHANGES; EXPECT_EQ(expected_app_properties_state, @@ -3114,16 +3095,11 @@ TEST_F(PolicyHandlerTest, PushAppIdToPTUQueue_PolicyEnabled_SUCCESS) { } TEST_F(PolicyHandlerTest, PushAppIdToPTUQueue_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - - const uint32_t expected_apps_count = 0u; EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); - EXPECT_CALL(*mock_policy_manager_, - UpdatePTUReadyAppsCount(expected_apps_count)) - .Times(0); policy_handler_.LoadPolicyLibrary(); policy_handler_.PushAppIdToPTUQueue(kAppId1_); + const uint32_t expected_apps_count = 0u; EXPECT_EQ(expected_apps_count, policy_handler_.applications_ptu_queue_.size()); } @@ -3134,16 +3110,6 @@ TEST_F(PolicyHandlerTest, StopRetrySequence_PolicyEnabled_SUCCESS) { policy_handler_.StopRetrySequence(); } -TEST_F(PolicyHandlerTest, StopRetrySequence_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); - EXPECT_CALL(*mock_policy_manager_, StopRetrySequence()).Times(0); - - policy_handler_.LoadPolicyLibrary(); - policy_handler_.StopRetrySequence(); -} - TEST_F(PolicyHandlerTest, GetPolicyTableData_PolicyEnabled_SUCCESS) { ChangePolicyManagerToMock(); Json::Value expected_table_data(Json::objectValue); @@ -3154,10 +3120,7 @@ TEST_F(PolicyHandlerTest, GetPolicyTableData_PolicyEnabled_SUCCESS) { } TEST_F(PolicyHandlerTest, GetPolicyTableData_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); - EXPECT_CALL(*mock_policy_manager_, GetPolicyTableData()).Times(0); policy_handler_.LoadPolicyLibrary(); @@ -3185,10 +3148,7 @@ TEST_F(PolicyHandlerTest, GetRemovedVehicleDataItems_PolicyEnabled_SUCCESS) { TEST_F(PolicyHandlerTest, GetRemovedVehicleDataItems_PolicyDisabled_FAIL) { using rpc::policy_table_interface_base::VehicleDataItem; - ChangePolicyManagerToMock(); - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); - EXPECT_CALL(*mock_policy_manager_, GetRemovedVehicleDataItems()).Times(0); policy_handler_.LoadPolicyLibrary(); @@ -3226,16 +3186,6 @@ TEST_F(PolicyHandlerTest, OnLocalAppAdded_PolicyEnabled_SUCCESS) { policy_handler_.OnLocalAppAdded(); } -TEST_F(PolicyHandlerTest, OnLocalAppAdded_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); - EXPECT_CALL(*mock_policy_manager_, OnLocalAppAdded()).Times(0); - - policy_handler_.LoadPolicyLibrary(); - policy_handler_.OnLocalAppAdded(); -} - TEST_F(PolicyHandlerTest, OnPermissionsUpdated_PolicyEnabled_SUCCESS) { ChangePolicyManagerToMock(); @@ -3255,14 +3205,10 @@ TEST_F(PolicyHandlerTest, OnPermissionsUpdated_PolicyEnabled_SUCCESS) { } TEST_F(PolicyHandlerTest, OnPermissionsUpdated_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); policy_handler_.LoadPolicyLibrary(); EXPECT_CALL(app_manager_, application(kDeviceId_, kPolicyAppId_)).Times(0); - EXPECT_CALL(*mock_policy_manager_, GetAppEncryptionRequired(kPolicyAppId_)) - .Times(0); EXPECT_CALL(*mock_app_, app_id()).Times(0); Permissions app_permissions; @@ -3281,16 +3227,6 @@ TEST_F(PolicyHandlerTest, IsNewApplication_PolicyEnabled_SUCCESS) { EXPECT_TRUE(policy_handler_.IsNewApplication(kPolicyAppId_)); } -TEST_F(PolicyHandlerTest, IsNewApplication_PolicyDisabled_FAIL) { - ChangePolicyManagerToMock(); - - EXPECT_CALL(policy_settings_, enable_policy()).WillOnce(Return(false)); - policy_handler_.LoadPolicyLibrary(); - - EXPECT_CALL(*mock_policy_manager_, IsNewApplication(kPolicyAppId_)).Times(0); - EXPECT_FALSE(policy_handler_.IsNewApplication(kPolicyAppId_)); -} - } // namespace policy_handler_test } // namespace components } // namespace test diff --git a/src/components/application_manager/test/resumption/resume_ctrl_test.cc b/src/components/application_manager/test/resumption/resume_ctrl_test.cc index ded6aa956e..8d228240d2 100644 --- a/src/components/application_manager/test/resumption/resume_ctrl_test.cc +++ b/src/components/application_manager/test/resumption/resume_ctrl_test.cc @@ -251,25 +251,6 @@ class ResumeCtrlTest : public ::testing::Test { * @brief Group of tests which check starting resumption with different data */ -TEST_F(ResumeCtrlTest, StartResumption_AppWithGrammarId) { - smart_objects::SmartObject saved_app; - saved_app[application_manager::strings::hash_id] = kHash_; - saved_app[application_manager::strings::grammar_id] = kTestGrammarId_; - - // Check RestoreApplicationData - GetInfoFromApp(); - ON_CALL(mock_app_mngr_, GetDefaultHmiLevel(const_app_)) - .WillByDefault(Return(kDefaultTestLevel_)); - ON_CALL(*mock_storage_, - GetSavedApplication(kTestPolicyAppId_, kMacAddress_, _)) - .WillByDefault(DoAll(SetArgReferee<2>(saved_app), Return(true))); - - EXPECT_CALL(*mock_app_, set_grammar_id(kTestGrammarId_)); - - const bool res = res_ctrl_->StartResumption(mock_app_, kHash_, callback_); - EXPECT_TRUE(res); -} - MATCHER_P4(CheckAppFile, is_persistent, is_download, file_name, file_type, "") { application_manager::AppFile app_file = arg; return app_file.is_persistent == is_persistent && @@ -986,8 +967,7 @@ TEST_F(ResumeCtrlTest, RestoreAppHMIState_RestoreHMILevelFull) { ON_CALL(mock_app_mngr_, GetUserConsentForDevice("12345")) .WillByDefault(Return(policy::kDeviceAllowed)); - const bool res = res_ctrl_->RestoreAppHMIState(mock_app_); - EXPECT_TRUE(res); + res_ctrl_->RestoreAppHMIState(mock_app_); } TEST_F(ResumeCtrlTest, SetupDefaultHMILevel) { diff --git a/src/components/application_manager/test/resumption/resumption_data_test.cc b/src/components/application_manager/test/resumption/resumption_data_test.cc index 12a38e1bc4..d5228934db 100644 --- a/src/components/application_manager/test/resumption/resumption_data_test.cc +++ b/src/components/application_manager/test/resumption/resumption_data_test.cc @@ -176,7 +176,7 @@ void ResumptionDataTest::CheckChoiceSet(sm::SmartObject& res_list) { sm::SmartObject command = res_list[i][am::strings::choice_set][j]; EXPECT_EQ(i + j, command[am::strings::choice_id].asUInt()); char numb[12]; - std::snprintf(numb, 12, "%d", i + j); + std::snprintf(numb, 12, "%u", i + j); std::string test_choice = (*test_choiceset_map[i])[am::strings::choice_set][j] [am::strings::vr_commands][0] @@ -340,11 +340,10 @@ void ResumptionDataTest::CheckTimeoutPrompt( void ResumptionDataTest::CheckVRHelp(sm::SmartObject& res_list) { std::string text; - int position; for (uint i = 0; i < kCountOfVrhelptitle_; ++i) { text = (*vr_help_)[i][am::strings::text].asString(); EXPECT_EQ(text, res_list[i][am::strings::text].asString()); - position = (*vr_help_)[i][am::strings::position].asInt(); + int position = (*vr_help_)[i][am::strings::position].asInt(); EXPECT_EQ(position, res_list[i][am::strings::position].asInt()); } } @@ -517,7 +516,7 @@ void ResumptionDataTest::SetCommands() { sm::SmartObject sm_icon; for (uint32_t i = 0; i < kCountOfCommands_; ++i) { char numb[12]; - std::snprintf(numb, 12, "%d", i); + std::snprintf(numb, 12, "%u", i); sm_comm[am::strings::cmd_id] = i; sm_comm[am::strings::menu_params][am::strings::position] = i; sm_comm[am::strings::menu_params][am::hmi_request::parent_id] = i; @@ -526,7 +525,7 @@ void ResumptionDataTest::SetCommands() { for (uint32_t j = 0; j < kCountOfChoice_; ++j) { char vr[12]; - std::snprintf(vr, 12, "%d", i + j); + std::snprintf(vr, 12, "%u", i + j); vr_commandsvector[j] = "VrCommand " + std::string(vr); } sm_comm[am::strings::vr_commands] = vr_commandsvector; @@ -544,7 +543,7 @@ void ResumptionDataTest::SetSubmenues() { sm::SmartObject sm_comm; for (uint32_t i = 10; i < kCountOfSubmenues_ + 10; ++i) { char numb[12]; - std::snprintf(numb, 12, "%d", i); + std::snprintf(numb, 12, "%u", i); sm_comm[am::strings::menu_id] = i; sm_comm[am::strings::position] = i; sm_comm[am::strings::menu_name] = "SubMenu" + std::string(numb); @@ -563,7 +562,7 @@ void ResumptionDataTest::SetChoiceSet() { for (uint32_t i = 0; i < kCountOfChoiceSets_; ++i) { for (uint32_t j = 0; j < kCountOfChoice_; ++j) { char numb[12]; - std::snprintf(numb, 12, "%d", i + j); + std::snprintf(numb, 12, "%u", i + j); choice[am::strings::choice_id] = i + j; vr_commandsvector[0] = "ChoiceSet VrCommand " + std::string(numb); @@ -596,11 +595,10 @@ void ResumptionDataTest::SetChoiceSet() { void ResumptionDataTest::SetAppFiles() { am::AppFile test_file; - int file_types; for (uint i = 0; i < kCountOfFiles_; ++i) { char numb[12]; std::snprintf(numb, 12, "%d", i); - file_types = i; + int file_types = i; test_file.is_persistent = true; test_file.is_download_complete = true; test_file.file_type = static_cast<FileType::eType>(file_types); diff --git a/src/components/application_manager/test/state_controller/state_controller_test.cc b/src/components/application_manager/test/state_controller/state_controller_test.cc index 374ad611ef..16e8bff8b8 100644 --- a/src/components/application_manager/test/state_controller/state_controller_test.cc +++ b/src/components/application_manager/test/state_controller/state_controller_test.cc @@ -1539,7 +1539,7 @@ TEST_F(StateControllerImplTest, MoveSimpleAppToValidStates) { namespace AudioStreamingState = mobile_apis::AudioStreamingState; namespace VideoStreamingState = mobile_apis::VideoStreamingState; namespace SystemContext = mobile_apis::SystemContext; - HmiStatePtr initial_state = createHmiState(HMILevel::INVALID_ENUM, + HmiStatePtr initial_state = createHmiState(HMILevel::HMI_NONE, AudioStreamingState::INVALID_ENUM, VideoStreamingState::INVALID_ENUM, SystemContext::INVALID_ENUM); @@ -1580,7 +1580,7 @@ TEST_F(StateControllerImplTest, MoveAudioNotResumeAppToValidStates) { NiceMock<application_manager_test::MockApplication>* audio_app_mock = media_navi_vc_app_ptr_; - HmiStatePtr initial_state = createHmiState(HMILevel::INVALID_ENUM, + HmiStatePtr initial_state = createHmiState(HMILevel::HMI_NONE, AudioStreamingState::INVALID_ENUM, VideoStreamingState::INVALID_ENUM, SystemContext::INVALID_ENUM); @@ -1619,7 +1619,7 @@ TEST_F(StateControllerImplTest, MoveAudioResumeAppToValidStates) { NiceMock<application_manager_test::MockApplication>* audio_app_mock = media_navi_vc_app_ptr_; - HmiStatePtr initial_state = createHmiState(HMILevel::INVALID_ENUM, + HmiStatePtr initial_state = createHmiState(HMILevel::HMI_NONE, AudioStreamingState::INVALID_ENUM, VideoStreamingState::INVALID_ENUM, SystemContext::INVALID_ENUM); diff --git a/src/components/config_profile/src/ini_file.cc b/src/components/config_profile/src/ini_file.cc index f549f4b915..dd64f48afa 100644 --- a/src/components/config_profile/src/ini_file.cc +++ b/src/components/config_profile/src/ini_file.cc @@ -152,13 +152,15 @@ char* ini_read_value(const char* fname, return NULL; } +#ifdef BUILD_TESTS +// cppcheck-suppress unusedFunction //Used in unit tests char ini_write_value(const char* fname, const char* chapter, const char* item, const char* value, uint8_t flag) { FILE *rd_fp, *wr_fp = 0; - uint16_t i, cr_count; + uint16_t cr_count; int32_t wr_result; bool chapter_found = false; bool value_written = false; @@ -186,11 +188,9 @@ char ini_write_value(const char* fname, #if USE_MKSTEMP { const char* temp_str = "./"; - int32_t fd = -1; if (temp_str) { snprintf(temp_fname, PATH_MAX, "%s/ini.XXXXXX", temp_str); - - fd = mkstemp(temp_fname); + int32_t fd = mkstemp(temp_fname); if (-1 == fd) { fclose(rd_fp); return FALSE; @@ -244,7 +244,7 @@ char ini_write_value(const char* fname, first chapter is significant */ value_written = true; } else if (result == INI_RIGHT_ITEM) { - for (i = 0; i < cr_count; i++) + for (uint16_t i = 0; i < cr_count; i++) fprintf(wr_fp, "\n"); cr_count = 0; wr_result = fprintf(wr_fp, "%s=%s\n", item, value); @@ -286,10 +286,10 @@ char ini_write_value(const char* fname, return (value_written); } +#endif // BUILD_TESTS Ini_search_id ini_parse_line(const char* line, const char* tag, char* value) { const char* line_ptr; - char* temp_ptr; char temp_str[INI_LINE_LEN] = ""; *temp_str = '\0'; @@ -332,7 +332,7 @@ Ini_search_id ini_parse_line(const char* line, const char* tag, char* value) { return INI_NOTHING; snprintf(temp_str, INI_LINE_LEN, "%s", line_ptr); - temp_ptr = strrchr(temp_str, ']'); + char* temp_ptr = strrchr(temp_str, ']'); if (NULL == temp_ptr) { return INI_NOTHING; } else { diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc index a86d09da94..d9204acf90 100644 --- a/src/components/config_profile/src/profile.cc +++ b/src/components/config_profile/src/profile.cc @@ -1739,8 +1739,7 @@ void Profile::UpdateValues() { help_prompt_.clear(); std::string help_prompt_value; if (ReadValue(&help_prompt_value, kGlobalPropertiesSection, kHelpPromptKey)) { - char* str = NULL; - str = strtok(const_cast<char*>(help_prompt_value.c_str()), ","); + char* str = strtok(const_cast<char*>(help_prompt_value.c_str()), ","); while (str != NULL) { // Default prompt should have delimiter included for each item const std::string prompt_item = std::string(str) + tts_delimiter_; @@ -1759,8 +1758,7 @@ void Profile::UpdateValues() { std::string timeout_prompt_value; if (ReadValue( &timeout_prompt_value, kGlobalPropertiesSection, kTimeoutPromptKey)) { - char* str = NULL; - str = strtok(const_cast<char*>(timeout_prompt_value.c_str()), ","); + char* str = strtok(const_cast<char*>(timeout_prompt_value.c_str()), ","); while (str != NULL) { // Default prompt should have delimiter included for each item const std::string prompt_item = std::string(str) + tts_delimiter_; @@ -1784,8 +1782,7 @@ void Profile::UpdateValues() { vr_commands_.clear(); std::string vr_help_command_value; if (ReadValue(&vr_help_command_value, kVrCommandsSection, kHelpCommandKey)) { - char* str = NULL; - str = strtok(const_cast<char*>(vr_help_command_value.c_str()), ","); + char* str = strtok(const_cast<char*>(vr_help_command_value.c_str()), ","); while (str != NULL) { const std::string vr_item = str; vr_commands_.push_back(vr_item); @@ -1867,8 +1864,8 @@ void Profile::UpdateValues() { "", kMainSection, kSupportedDiagModesKey)) { - char* str = NULL; - str = strtok(const_cast<char*>(supported_diag_modes_value.c_str()), ","); + char* str = + strtok(const_cast<char*>(supported_diag_modes_value.c_str()), ","); while (str != NULL) { errno = 0; uint32_t user_value = strtol(str, NULL, 16); diff --git a/src/components/connection_handler/include/connection_handler/connection.h b/src/components/connection_handler/include/connection_handler/connection.h index 1a93509aca..8b286e1309 100644 --- a/src/components/connection_handler/include/connection_handler/connection.h +++ b/src/components/connection_handler/include/connection_handler/connection.h @@ -177,6 +177,17 @@ class Connection { uint32_t RemoveSession(uint8_t session_id); /** + * @brief Called upon final message being sent for a session + */ + void OnFinalMessageCallback(); + + /** + * @brief Check whether final message was sent from this connection + * @return true if final message was sent by any session of this connection + */ + bool IsFinalMessageSent() const; + + /** * @brief Adds uprotected service to session or * check protection to service has been started before * @param session_id session ID @@ -378,6 +389,7 @@ class Connection { HeartBeatMonitor* heartbeat_monitor_; uint32_t heartbeat_timeout_; threads::Thread* heart_beat_monitor_thread_; + bool final_message_sent_; DISALLOW_COPY_AND_ASSIGN(Connection); }; diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h index fb859330b9..3bfa5b34b8 100644 --- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h +++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h @@ -35,6 +35,7 @@ #include <list> #include <map> +#include <set> #include <string> #include <vector> @@ -272,6 +273,8 @@ class ConnectionHandlerImpl */ void OnMalformedMessageCallback(const uint32_t& connection_key) OVERRIDE; + void OnFinalMessageCallback(const uint32_t& connection_key) OVERRIDE; + /** * @brief Converts connection handle to transport type string used in * smartDeviceLink.ini file, e.g. "TCP_WIFI" @@ -606,10 +609,10 @@ class ConnectionHandlerImpl * \note This is invoked only once but can be invoked by multiple threads. * Also it can be invoked before OnServiceStartedCallback() returns. **/ - virtual void NotifyServiceStartedResult( - uint32_t session_key, - bool result, - std::vector<std::string>& rejected_params); + void NotifyServiceStartedResult(uint32_t session_key, + bool result, + std::vector<std::string>& rejected_params, + const std::string& reason) OVERRIDE; /** * \brief Called when secondary transport with given session ID is established @@ -646,6 +649,10 @@ class ConnectionHandlerImpl **/ void RemoveConnection(const ConnectionHandle connection_handle); + /** + * @brief Called when connection is closed. + * @param connection_id Connection unique identifier. + */ void OnConnectionEnded(const transport_manager::ConnectionUID connection_id); const uint8_t GetSessionIdFromSecondaryTransport( diff --git a/src/components/connection_handler/src/connection.cc b/src/components/connection_handler/src/connection.cc index 14e2b83848..5bd72773c2 100644 --- a/src/components/connection_handler/src/connection.cc +++ b/src/components/connection_handler/src/connection.cc @@ -82,7 +82,8 @@ Connection::Connection(ConnectionHandle connection_handle, , connection_handle_(connection_handle) , connection_device_handle_(connection_device_handle) , primary_connection_handle_(0) - , heartbeat_timeout_(heartbeat_timeout) { + , heartbeat_timeout_(heartbeat_timeout) + , final_message_sent_(false) { SDL_LOG_AUTO_TRACE(); DCHECK(connection_handler_); @@ -110,7 +111,7 @@ Connection::~Connection() { << static_cast<int>(session_it->first) << " from Session/Connection Map in Connection Destructor"); connection_handler_->RemoveSession(session_it->first); - session_it++; + ++session_it; } session_map_.clear(); @@ -162,6 +163,15 @@ uint32_t Connection::RemoveSession(uint8_t session_id) { return session_id; } +void Connection::OnFinalMessageCallback() { + SDL_LOG_AUTO_TRACE(); + final_message_sent_ = true; +} + +bool Connection::IsFinalMessageSent() const { + return final_message_sent_; +} + bool Connection::AddNewService(uint8_t session_id, protocol_handler::ServiceType service_type, const bool request_protection, @@ -324,7 +334,7 @@ uint8_t Connection::RemoveSecondaryServices( removed_services_list.push_back(service_it->service_type); service_it = service_list.erase(service_it); } else { - service_it++; + ++service_it; } } diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index b9d1de8332..549450dbe0 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -215,7 +215,7 @@ namespace { struct DeviceFinder { explicit DeviceFinder(const std::string& device_uid) : device_uid_(device_uid) {} - bool operator()(const DeviceMap::value_type& device) { + bool operator()(const DeviceMap::value_type& device) const { return device_uid_ == device.second.mac_address(); } @@ -366,7 +366,7 @@ void ConnectionHandlerImpl::OnUnexpectedDisconnect( transport_manager::ConnectionUID connection_id, const transport_manager::CommunicationError& error) { SDL_LOG_AUTO_TRACE(); - + UNUSED(error); OnConnectionEnded(connection_id); } @@ -403,9 +403,8 @@ bool AllowProtection(const ConnectionHandlerSettings& settings, if (std::find(force_unprotected_list.begin(), force_unprotected_list.end(), service_type) != force_unprotected_list.end()) { - SDL_LOG_ERROR( - - "Service " << static_cast<int>(service_type) << " shall be protected"); + SDL_LOG_ERROR("Service " << static_cast<int>(service_type) + << " shall be protected"); return false; } SDL_LOG_DEBUG("Service " << static_cast<int>(service_type) << " allowed"); @@ -465,10 +464,21 @@ void ConnectionHandlerImpl::OnSessionStartedCallback( return; } #endif // ENABLE_SECURITY - sync_primitives::AutoReadLock lock(connection_list_lock_); - ConnectionList::iterator it = - connection_list_.find(primary_connection_handle); - if (connection_list_.end() == it) { + + auto find_connection = + [this](const transport_manager::ConnectionUID& primary_connection_handle) + -> Connection* { + sync_primitives::AutoReadLock lock(connection_list_lock_); + auto it = connection_list_.find(primary_connection_handle); + if (it != connection_list_.end()) { + return it->second; + } + return nullptr; + }; + + Connection* connection = find_connection(primary_connection_handle); + + if (!connection) { SDL_LOG_ERROR("Unknown connection!"); protocol_handler_->NotifySessionStarted( context, @@ -477,7 +487,6 @@ void ConnectionHandlerImpl::OnSessionStartedCallback( return; } - Connection* connection = it->second; context.is_new_service_ = !connection->SessionServiceExists(session_id, service_type); @@ -510,7 +519,7 @@ void ConnectionHandlerImpl::OnSessionStartedCallback( context, rejected_params, "Cannot start " + - std::string(is_protected ? "a protected" : " an unprotected") + + std::string(is_protected ? "a protected" : "an unprotected") + " service of type " + std::to_string(service_type) + ". " + err_reason); return; @@ -548,7 +557,8 @@ void ConnectionHandlerImpl::OnSessionStartedCallback( void ConnectionHandlerImpl::NotifyServiceStartedResult( uint32_t session_key, bool result, - std::vector<std::string>& rejected_params) { + std::vector<std::string>& rejected_params, + const std::string& reason) { SDL_LOG_AUTO_TRACE(); protocol_handler::SessionContext context; @@ -589,7 +599,7 @@ void ConnectionHandlerImpl::NotifyServiceStartedResult( } if (protocol_handler_ != NULL) { - protocol_handler_->NotifySessionStarted(context, rejected_params); + protocol_handler_->NotifySessionStarted(context, rejected_params, reason); } } @@ -665,6 +675,25 @@ void ConnectionHandlerImpl::OnMalformedMessageCallback( CloseConnection(connection_handle); } +void ConnectionHandlerImpl::OnFinalMessageCallback( + const uint32_t& connection_key) { + SDL_LOG_AUTO_TRACE(); + + transport_manager::ConnectionUID connection_handle = 0; + uint8_t session_id = 0; + PairFromKey(connection_key, &connection_handle, &session_id); + + sync_primitives::AutoWriteLock connection_list_lock(connection_list_lock_); + ConnectionList::iterator connection_it = + connection_list_.find(connection_handle); + + if (connection_list_.end() != connection_it) { + SDL_LOG_DEBUG("OnFinalMessageCallback found connection " + << connection_handle); + connection_it->second->OnFinalMessageCallback(); + } +} + uint32_t ConnectionHandlerImpl::OnSessionEndedCallback( const transport_manager::ConnectionUID connection_handle, const uint8_t session_id, @@ -719,16 +748,14 @@ uint32_t ConnectionHandlerImpl::OnSessionEndedCallback( KeyFromPair(primary_connection_handle, session_id); if (protocol_handler::kRpc == service_type) { - SDL_LOG_INFO( - - "Session " << static_cast<uint32_t>(session_id) << " to be removed"); + SDL_LOG_INFO("Session " << static_cast<uint32_t>(session_id) + << " to be removed"); // old version of protocol doesn't support hash if (protocol_handler::HASH_ID_NOT_SUPPORTED != *hashCode) { if (protocol_handler::HASH_ID_WRONG == *hashCode || session_key != *hashCode) { - SDL_LOG_WARN( - - "Wrong hash_id for session " << static_cast<uint32_t>(session_id)); + SDL_LOG_WARN("Wrong hash_id for session " + << static_cast<uint32_t>(session_id)); *hashCode = protocol_handler::HASH_ID_WRONG; if (err_reason) { @@ -748,13 +775,11 @@ uint32_t ConnectionHandlerImpl::OnSessionEndedCallback( return 0; } } else { - SDL_LOG_INFO( - - "Service " << static_cast<uint32_t>(service_type) << " to be removed"); + SDL_LOG_INFO("Service " << static_cast<uint32_t>(service_type) + << " to be removed"); if (!connection->RemoveService(session_id, service_type)) { - SDL_LOG_WARN( - - "Couldn't remove service " << static_cast<uint32_t>(service_type)); + SDL_LOG_WARN("Couldn't remove service " + << static_cast<uint32_t>(service_type)); if (err_reason) { *err_reason = "Couldn't remove service " + std::to_string(static_cast<uint32_t>(service_type)); @@ -944,6 +969,8 @@ ConnectionHandlerImpl::TransportTypeProfileStringFromDeviceHandle( return std::string("IAP_CARPLAY"); } else if (connection_type == "CLOUD_WEBSOCKET") { return std::string("WEBSOCKET"); + } else if (connection_type == "WEBENGINE_WEBSOCKET") { + return std::string("WEBENGINE"); #ifdef BUILD_TESTS } else if (connection_type == "BTMAC") { return std::string("BTMAC"); @@ -976,11 +1003,10 @@ void ConnectionHandlerImpl::PairFromKey( uint8_t* session_id) const { *connection_handle = key & 0xFF00FFFF; *session_id = key >> 16; - SDL_LOG_DEBUG( - - "ConnectionHandle:" << static_cast<int32_t>(*connection_handle) - << " Session:" << static_cast<int32_t>(*session_id) - << " for key:" << static_cast<int32_t>(key)); + SDL_LOG_DEBUG("ConnectionHandle: " + << static_cast<int32_t>(*connection_handle) + << " Session: " << static_cast<int32_t>(*session_id) + << " for key: " << static_cast<int32_t>(key)); } int32_t ConnectionHandlerImpl::GetDataOnSessionKey( @@ -1157,7 +1183,7 @@ const uint8_t ConnectionHandlerImpl::GetSessionIdFromSecondaryTransport( transport_manager::ConnectionUID secondary_transport_id) const { sync_primitives::AutoLock auto_lock(session_connection_map_lock_ptr_); SessionConnectionMap::const_iterator it = session_connection_map_.begin(); - for (; session_connection_map_.end() != it; it++) { + for (; session_connection_map_.end() != it; ++it) { SessionTransports st = it->second; if (st.secondary_transport == secondary_transport_id) { return it->first; @@ -1563,9 +1589,8 @@ void ConnectionHandlerImpl::CloseSession(ConnectionHandle connection_handle, return; } - SDL_LOG_DEBUG( - - "Session with id: " << session_id << " has been closed successfully"); + SDL_LOG_DEBUG("Session with id: " << session_id + << " has been closed successfully"); } void ConnectionHandlerImpl::CloseConnectionSessions( @@ -1710,6 +1735,10 @@ void ConnectionHandlerImpl::OnConnectionEnded( ending_connection_ = connection.get(); const SessionMap session_map = connection->session_map(); + const CloseSessionReason close_reason = + connection->IsFinalMessageSent() ? CloseSessionReason::kFinalMessage + : CloseSessionReason::kCommon; + for (SessionMap::const_iterator session_it = session_map.begin(); session_map.end() != session_it; ++session_it) { @@ -1725,9 +1754,7 @@ void ConnectionHandlerImpl::OnConnectionEnded( service_list.rbegin(); for (; service_list_itr != service_list.rend(); ++service_list_itr) { connection_handler_observer_->OnServiceEndedCallback( - session_key, - service_list_itr->service_type, - CloseSessionReason::kCommon); + session_key, service_list_itr->service_type, close_reason); } } ending_connection_ = NULL; diff --git a/src/components/connection_handler/src/device.cc b/src/components/connection_handler/src/device.cc index c831c0b2d2..94e7226f84 100644 --- a/src/components/connection_handler/src/device.cc +++ b/src/components/connection_handler/src/device.cc @@ -54,9 +54,8 @@ Device::Device(DeviceHandle device_handle, , mac_address_(mac_address) , connection_type_(connection_type) { mac_address_ = encryption::MakeHash(mac_address); - SDL_LOG_DEBUG( - - "Device: MAC address - " << mac_address << ", hash - " << mac_address_); + SDL_LOG_DEBUG("Device: MAC address - " << mac_address << ", hash - " + << mac_address_); } DeviceHandle Device::device_handle() const { diff --git a/src/components/connection_handler/src/heartbeat_monitor.cc b/src/components/connection_handler/src/heartbeat_monitor.cc index e53e914b0a..f3e2da2696 100644 --- a/src/components/connection_handler/src/heartbeat_monitor.cc +++ b/src/components/connection_handler/src/heartbeat_monitor.cc @@ -78,9 +78,8 @@ void HeartBeatMonitor::Process() { void HeartBeatMonitor::threadMain() { AutoLock main_lock(main_thread_lock_); - SDL_LOG_DEBUG( - - "Start heart beat monitor. Timeout is " << default_heartbeat_timeout_); + SDL_LOG_DEBUG("Start heart beat monitor. Timeout is " + << default_heartbeat_timeout_); while (run_) { heartbeat_monitor_.WaitFor(main_lock, kDefaultCycleTimeout); Process(); diff --git a/src/components/connection_handler/test/connection_handler_impl_test.cc b/src/components/connection_handler/test/connection_handler_impl_test.cc index 5a8feda2db..9305eee2ee 100644 --- a/src/components/connection_handler/test/connection_handler_impl_test.cc +++ b/src/components/connection_handler/test/connection_handler_impl_test.cc @@ -65,9 +65,9 @@ using ::testing::ReturnRefOfCopy; using ::testing::SaveArg; using ::testing::SaveArgPointee; -// custom action to call a member function with 3 arguments -ACTION_P5(InvokeMemberFuncWithArg3, ptr, memberFunc, a, b, c) { - (ptr->*memberFunc)(a, b, c); +// custom action to call a member function with 4 arguments +ACTION_P6(InvokeMemberFuncWithArg4, ptr, memberFunc, a, b, c, d) { + (ptr->*memberFunc)(a, b, c, d); } namespace { @@ -855,6 +855,24 @@ TEST_F(ConnectionHandlerTest, OnConnectionClosed) { connection_handler_->OnConnectionClosed(uid_); } +TEST_F(ConnectionHandlerTest, OnFinalMessageCallback_OnConnectionClosed) { + AddTestDeviceConnection(); + AddTestSession(); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + + EXPECT_CALL(mock_connection_handler_observer, + OnServiceEndedCallback(connection_key_, kBulk, kFinalMessage)); + EXPECT_CALL(mock_connection_handler_observer, + OnServiceEndedCallback(connection_key_, kRpc, kFinalMessage)); + + connection_handler_->OnFinalMessageCallback(connection_key_); + connection_handler_->OnConnectionClosed(uid_); +} + TEST_F(ConnectionHandlerTest, OnUnexpectedDisconnect) { AddTestDeviceConnection(); AddTestSession(); @@ -874,6 +892,27 @@ TEST_F(ConnectionHandlerTest, OnUnexpectedDisconnect) { connection_handler_->OnUnexpectedDisconnect(uid_, err); } +TEST_F(ConnectionHandlerTest, OnFinalMessageCallback_OnUnexpectedDisconnect) { + AddTestDeviceConnection(); + AddTestSession(); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + + EXPECT_CALL(mock_connection_handler_observer, + OnServiceEndedCallback( + connection_key_, kBulk, CloseSessionReason::kFinalMessage)); + EXPECT_CALL(mock_connection_handler_observer, + OnServiceEndedCallback( + connection_key_, kRpc, CloseSessionReason::kFinalMessage)); + + connection_handler_->OnFinalMessageCallback(connection_key_); + transport_manager::CommunicationError err; + connection_handler_->OnUnexpectedDisconnect(uid_, err); +} + TEST_F(ConnectionHandlerTest, ConnectToDevice) { // Precondition const uint32_t dev_handle1 = 1; @@ -1307,16 +1346,18 @@ TEST_F(ConnectionHandlerTest, SessionStarted_WithRpc) { connection_handler_->set_connection_handler_observer( &mock_connection_handler_observer); std::vector<std::string> empty; + std::string reason; uint32_t session_key = connection_handler_->KeyFromPair(uid_, out_context_.initial_session_id_); EXPECT_CALL(mock_connection_handler_observer, OnServiceStartedCallback(device_handle_, _, kRpc, NULL)) - .WillOnce(InvokeMemberFuncWithArg3( + .WillOnce(InvokeMemberFuncWithArg4( connection_handler_, &ConnectionHandler::NotifyServiceStartedResult, session_key, true, - ByRef(empty))); + ByRef(empty), + reason)); connection_handler_->set_protocol_handler(&mock_protocol_handler_); EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) @@ -1345,15 +1386,17 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_SUCCESS) { uint32_t session_key = connection_handler_->KeyFromPair(uid_, out_context_.new_session_id_); std::vector<std::string> empty; + std::string reason; EXPECT_CALL(mock_connection_handler_observer, OnServiceStartedCallback( device_handle_, session_key, kMobileNav, dummy_params)) - .WillOnce(InvokeMemberFuncWithArg3( + .WillOnce(InvokeMemberFuncWithArg4( connection_handler_, &ConnectionHandler::NotifyServiceStartedResult, session_key, true, - ByRef(empty))); + ByRef(empty), + reason)); // confirm that NotifySessionStarted() is called connection_handler_->set_protocol_handler(&mock_protocol_handler_); @@ -1385,15 +1428,17 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_FAILURE) { uint32_t session_key = connection_handler_->KeyFromPair(uid_, out_context_.new_session_id_); std::vector<std::string> empty; + std::string reason; EXPECT_CALL(mock_connection_handler_observer, OnServiceStartedCallback( device_handle_, session_key, kMobileNav, dummy_params)) - .WillOnce(InvokeMemberFuncWithArg3( + .WillOnce(InvokeMemberFuncWithArg4( connection_handler_, &ConnectionHandler::NotifyServiceStartedResult, session_key, false, - ByRef(empty))); + ByRef(empty), + reason)); // confirm that NotifySessionStarted() is called connection_handler_->set_protocol_handler(&mock_protocol_handler_); @@ -1455,6 +1500,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) { connection_handler_->KeyFromPair(uid_, context_second.new_session_id_); std::vector<std::string> empty; + std::string reason; + ChangeProtocol(uid_, context_first.new_session_id_, protocol_handler::PROTOCOL_VERSION_3); @@ -1472,18 +1519,20 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) { device_handle_, session_key2, kMobileNav, dummy_params)) // call NotifyServiceStartedResult() twice, first for the second session // then for the first session - .WillOnce(DoAll(InvokeMemberFuncWithArg3( + .WillOnce(DoAll(InvokeMemberFuncWithArg4( connection_handler_, &ConnectionHandler::NotifyServiceStartedResult, session_key2, false, - ByRef(empty)), - InvokeMemberFuncWithArg3( + ByRef(empty), + reason), + InvokeMemberFuncWithArg4( connection_handler_, &ConnectionHandler::NotifyServiceStartedResult, session_key1, true, - ByRef(empty)))); + ByRef(empty), + reason))); // verify that connection handler will not mix up the two results SessionContext new_context_first, new_context_second; diff --git a/src/components/formatters/src/CFormatterJsonBase.cc b/src/components/formatters/src/CFormatterJsonBase.cc index e5354d5326..d88ffc7158 100644 --- a/src/components/formatters/src/CFormatterJsonBase.cc +++ b/src/components/formatters/src/CFormatterJsonBase.cc @@ -95,7 +95,7 @@ void ns_smart_device_link::ns_json_handler::formatters::CFormatterJsonBase:: for (std::set<std::string>::const_iterator key = keys.begin(); key != keys.end(); - key++) { + ++key) { Json::Value value(Json::nullValue); objToJsonValue(obj.getElement(*key), value); diff --git a/src/components/formatters/test/include/formatters/SmartFactoryTestHelper.h b/src/components/formatters/test/include/formatters/SmartFactoryTestHelper.h index 08962db120..d937849b5d 100644 --- a/src/components/formatters/test/include/formatters/SmartFactoryTestHelper.h +++ b/src/components/formatters/test/include/formatters/SmartFactoryTestHelper.h @@ -110,10 +110,6 @@ class CSmartFactoryTest : public CSmartFactory<FunctionIdTest::eType, std::shared_ptr<ISchemaItem> > TStructsSchemaItems; - static std::shared_ptr<ISchemaItem> ProvideObjectSchemaItemForStruct( - TStructsSchemaItems& struct_schema_items, - const StructIdentifiersTest::eType struct_id); - void InitStructSchemes(TStructsSchemaItems& struct_schema_items); void InitFunctionSchemes( diff --git a/src/components/formatters/test/src/SmartFactoryTestHelper.cc b/src/components/formatters/test/src/SmartFactoryTestHelper.cc index 4d089ff9b1..dd4dbe5910 100644 --- a/src/components/formatters/test/src/SmartFactoryTestHelper.cc +++ b/src/components/formatters/test/src/SmartFactoryTestHelper.cc @@ -432,13 +432,6 @@ std::shared_ptr<ISchemaItem> CSmartFactoryTest::InitStructSchemaItem_Common_1( TSchemaItemParameter<size_t>(500), TSchemaItemParameter<std::string>()); - // Struct member image. - // - // Image struct - std::shared_ptr<ISchemaItem> image_SchemaItem = - ProvideObjectSchemaItemForStruct(struct_schema_items, - StructIdentifiersTest::Common_2); - // Struct member position. // // Position to display item @@ -446,19 +439,12 @@ std::shared_ptr<ISchemaItem> CSmartFactoryTest::InitStructSchemaItem_Common_1( TNumberSchemaItem<int32_t>::create(TSchemaItemParameter<int32_t>(1), TSchemaItemParameter<int32_t>(500), TSchemaItemParameter<int32_t>()); - Members struct_members; - struct_members["image"] = SMember(image_SchemaItem, false); Members schema_members; schema_members["text"] = SMember(text_SchemaItem, true); schema_members["position"] = SMember(position_SchemaItem, true); - Members root_members_map; - root_members_map[""] = - SMember(CObjectSchemaItem::create(struct_members), true); - root_members_map[""] = - SMember(CObjectSchemaItem::create(schema_members), true); return CObjectSchemaItem::create(schema_members); } @@ -485,16 +471,3 @@ CSmartFactoryTest::InitStructSchemaItem_Common_2() { return CObjectSchemaItem::create(schema_members); } - -std::shared_ptr<ISchemaItem> -CSmartFactoryTest::ProvideObjectSchemaItemForStruct( - TStructsSchemaItems& struct_schema_items, - const StructIdentifiersTest::eType struct_id) { - const TStructsSchemaItems::const_iterator it = - struct_schema_items.find(struct_id); - if (it != struct_schema_items.end()) { - return it->second; - } - return ns_smart_device_link::ns_smart_objects::CAlwaysFalseSchemaItem:: - create(); -} diff --git a/src/components/formatters/test/src/create_smartSchema.cc b/src/components/formatters/test/src/create_smartSchema.cc index c852c65ea1..23459e2eac 100644 --- a/src/components/formatters/test/src/create_smartSchema.cc +++ b/src/components/formatters/test/src/create_smartSchema.cc @@ -139,6 +139,8 @@ const AppTypeTest::eType test::components::formatters::AppTypeTest::MEDIA, }; +#ifdef BUILD_TESTS +// cppcheck-suppress unusedFunction //Used in unit tests CSmartSchema initObjectSchema() { std::set<TestType::eType> resultCode_allowedEnumSubsetValues; resultCode_allowedEnumSubsetValues.insert( @@ -222,6 +224,7 @@ CSmartSchema initObjectSchema() { return CSmartSchema(CObjectSchemaItem::create(rootMembersMap)); }; +// cppcheck-suppress unusedFunction //Used in unit tests CSmartSchema initSchemaForMetaFormatter() { std::set<TestType::eType> resultCode_allowedEnumSubsetValues; resultCode_allowedEnumSubsetValues.insert( @@ -336,15 +339,6 @@ CSmartSchema initSchemaForMetaFormatter() { ISchemaItemPtr majorVersion_SchemaItem = TNumberSchemaItem<int>::create(); ISchemaItemPtr minorVersion_SchemaItem = TNumberSchemaItem<int>::create(); ISchemaItemPtr patchVersion_SchemaItem = TNumberSchemaItem<int>::create(); - ISchemaItemPtr syncMsg_SchemaItem = - CStringSchemaItem::create(TSchemaItemParameter<size_t>(0), - TSchemaItemParameter<size_t>(1000), - TSchemaItemParameter<std::string>()); - - ISchemaItemPtr syncMsgVersion_SchemaItem = - CArraySchemaItem::create(syncMsg_SchemaItem, - TSchemaItemParameter<size_t>(0), - TSchemaItemParameter<size_t>(1000)); // Creation map for syncMsgVersion std::map<std::string, SMember> schemaSyncMsgVersionMap; @@ -400,6 +394,7 @@ CSmartSchema initSchemaForMetaFormatter() { SMember(CObjectSchemaItem::create(paramsMembersMap), true); return CSmartSchema(CObjectSchemaItem::create(rootMembersMap)); }; +#endif // BUILD_TESTS } // namespace formatters } // namespace components diff --git a/src/components/formatters/test/src/meta_formatter_test_helper.cc b/src/components/formatters/test/src/meta_formatter_test_helper.cc index 4f8975fe53..0c396d4dc7 100644 --- a/src/components/formatters/test/src/meta_formatter_test_helper.cc +++ b/src/components/formatters/test/src/meta_formatter_test_helper.cc @@ -148,7 +148,7 @@ void CMetaFormatterTestHelper::CompareObjects(const SmartObject& first, for (std::set<std::string>::const_iterator key = keys.begin(); key != keys.end(); - key++) { + ++key) { CompareObjects(first.getElement(*key), second.getElement(*key)); } } else if (SmartType_Boolean == first.getType()) { diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/mb_controller.h b/src/components/hmi_message_handler/include/hmi_message_handler/mb_controller.h index 6e0ad66199..5a10ccee38 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/mb_controller.h +++ b/src/components/hmi_message_handler/include/hmi_message_handler/mb_controller.h @@ -66,8 +66,7 @@ enum ErrorCode { class WebsocketSession; -class CMessageBrokerController - : public std::enable_shared_from_this<CMessageBrokerController> { +class CMessageBrokerController { public: CMessageBrokerController(const std::string& address, uint16_t port, @@ -99,7 +98,7 @@ class CMessageBrokerController void sendResponse(Json::Value& message); - void sendJsonMessage(Json::Value& message); + bool sendJsonMessage(Json::Value& message); void subscribeTo(std::string property); @@ -123,26 +122,26 @@ class CMessageBrokerController std::string GetComponentName(std::string& method); - void processInternalRequest(Json::Value& message, - WebsocketSession* ws_session); + void processInternalRequest(const Json::Value& message, + WebsocketSession& ws_session); - void pushRequest(Json::Value& message, WebsocketSession* ws_session); + bool pushRequest(Json::Value& message, WebsocketSession& ws_session); // Registry - bool addController(WebsocketSession* ws_session, std::string name); + bool addController(WebsocketSession& ws_session, const std::string& name); - void deleteController(WebsocketSession* ws_session); + void deleteController(WebsocketSession& ws_session); - void deleteController(std::string name); + void deleteController(const std::string& name); - void removeSubscribersBySession(const WebsocketSession* ws); + void removeSubscribersBySession(const WebsocketSession& ws); - bool addSubscriber(WebsocketSession* ws_session, std::string name); + bool addSubscriber(WebsocketSession& ws_session, const std::string& name); - void deleteSubscriber(WebsocketSession* ws, std::string name); + void deleteSubscriber(const WebsocketSession& ws, const std::string& name); - int getSubscribersFd(std::string name, - std::vector<WebsocketSession*>& result); + std::vector<std::shared_ptr<WebsocketSession> > getSubscribersFd( + const std::string& name); int getNextControllerId(); @@ -168,13 +167,13 @@ class CMessageBrokerController mConnectionList; sync_primitives::Lock mConnectionListLock; - std::map<std::string, WebsocketSession*> mControllersList; + std::map<std::string, std::weak_ptr<WebsocketSession> > mControllersList; sync_primitives::Lock mControllersListLock; - std::multimap<std::string, WebsocketSession*> mSubscribersList; + std::multimap<std::string, std::weak_ptr<WebsocketSession> > mSubscribersList; sync_primitives::Lock mSubscribersListLock; - std::map<std::string, WebsocketSession*> mRequestList; + std::map<std::string, std::weak_ptr<WebsocketSession> > mRequestList; sync_primitives::Lock mRequestListLock; std::atomic_bool shutdown_; diff --git a/src/components/hmi_message_handler/src/mb_controller.cc b/src/components/hmi_message_handler/src/mb_controller.cc index 681e57906a..e74f719780 100644 --- a/src/components/hmi_message_handler/src/mb_controller.cc +++ b/src/components/hmi_message_handler/src/mb_controller.cc @@ -137,15 +137,13 @@ bool CMessageBrokerController::isNotification(Json::Value& message) { void CMessageBrokerController::sendNotification(Json::Value& message) { std::string methodName = message["method"].asString(); - std::vector<WebsocketSession*> result; - int subscribersCount = getSubscribersFd(methodName, result); - if (0 < subscribersCount) { - std::vector<WebsocketSession*>::iterator it; - for (it = result.begin(); it != result.end(); ++it) { - (*it)->sendJsonMessage(message); - } - } else { - SDL_LOG_ERROR(("No subscribers for this property!\n")); + const auto result = getSubscribersFd(methodName); + if (result.empty()) { + SDL_LOG_ERROR("No subscribers for method: " << methodName); + } + + for (const auto& ws : result) { + ws->sendJsonMessage(message); } } @@ -159,40 +157,59 @@ bool CMessageBrokerController::isResponse(Json::Value& message) { } void CMessageBrokerController::sendResponse(Json::Value& message) { - WebsocketSession* ws; - std::map<std::string, WebsocketSession*>::iterator it; - sync_primitives::AutoLock request_lock(mRequestListLock); - + std::weak_ptr<WebsocketSession> weak_ws; std::string id = message["id"].asString(); - it = mRequestList.find(id); - if (it != mRequestList.end()) { - ws = it->second; + + { + sync_primitives::AutoLock request_lock(mRequestListLock); + const auto it = mRequestList.find(id); + if (it != mRequestList.end()) { + std::swap(weak_ws, it->second); + mRequestList.erase(it); + } + } + + if (auto ws = weak_ws.lock()) { ws->sendJsonMessage(message); - mRequestList.erase(it); + } else { + SDL_LOG_ERROR("A request is not found for id: " << id); } } -void CMessageBrokerController::sendJsonMessage(Json::Value& message) { +bool CMessageBrokerController::sendJsonMessage(Json::Value& message) { if (isNotification(message)) { sendNotification(message); - return; + return true; } else if (isResponse(message)) { sendResponse(message); - return; + return true; } // Send request - WebsocketSession* ws; - std::map<std::string, WebsocketSession*>::iterator it; + std::shared_ptr<WebsocketSession> ws; std::string method = message["method"].asString(); std::string component_name = GetComponentName(method); - sync_primitives::AutoLock lock(mControllersListLock); - it = mControllersList.find(component_name); - if (it != mControllersList.end()) { - ws = it->second; - ws->sendJsonMessage(message); + { + sync_primitives::AutoLock lock(mControllersListLock); + const auto it = mControllersList.find(component_name); + if (it != mControllersList.end()) { + ws = it->second.lock(); + if (!ws) { + // Clear expired + mControllersList.erase(it); + } + } + } + + if (!ws) { + SDL_LOG_ERROR( + "A controller is not found for the method: " << component_name); + return false; } + + ws->sendJsonMessage(message); + return true; } void CMessageBrokerController::subscribeTo(std::string property) {} @@ -245,139 +262,121 @@ std::string CMessageBrokerController::GetComponentName(std::string& method) { return return_string; } -bool CMessageBrokerController::addController(WebsocketSession* ws_session, - std::string name) { - bool result = false; - std::map<std::string, WebsocketSession*>::iterator it; - +bool CMessageBrokerController::addController(WebsocketSession& ws_session, + const std::string& name) { sync_primitives::AutoLock lock(mControllersListLock); - it = mControllersList.find(name); - if (it == mControllersList.end()) { - mControllersList.insert( - std::map<std::string, WebsocketSession*>::value_type(name, ws_session)); - result = true; - } else { - SDL_LOG_ERROR(("Controller already exists!\n")); - } - return result; + return mControllersList.emplace(name, ws_session.shared_from_this()).second; } -void CMessageBrokerController::deleteController(WebsocketSession* ws_session) { - { - sync_primitives::AutoLock lock(mControllersListLock); - std::map<std::string, WebsocketSession*>::iterator it; - for (it = mControllersList.begin(); it != mControllersList.end();) { - if (it->second == ws_session) { - mControllersList.erase(it++); - } else { - ++it; - } +void CMessageBrokerController::deleteController(WebsocketSession& ws_session) { + removeSubscribersBySession(ws_session); + sync_primitives::AutoLock lock(mControllersListLock); + for (auto it = mControllersList.cbegin(); it != mControllersList.cend();) { + const std::shared_ptr<WebsocketSession> ws = it->second.lock(); + if (!ws || ws.get() == &ws_session) { + it = mControllersList.erase(it); + } else { + ++it; } } - removeSubscribersBySession(ws_session); } -void CMessageBrokerController::deleteController(std::string name) { - std::map<std::string, WebsocketSession*>::iterator it; - WebsocketSession* ws; +void CMessageBrokerController::deleteController(const std::string& name) { + std::weak_ptr<WebsocketSession> weak_ws; { sync_primitives::AutoLock lock(mControllersListLock); - it = mControllersList.find(name); + const auto it = mControllersList.find(name); if (it != mControllersList.end()) { - ws = it->second; + std::swap(weak_ws, it->second); mControllersList.erase(it); - } else { - return; } } - removeSubscribersBySession(ws); + + if (auto ws = weak_ws.lock()) { + removeSubscribersBySession(*ws); + } else { + SDL_LOG_ERROR("A controller is not found for the method: " << name); + } } void CMessageBrokerController::removeSubscribersBySession( - const WebsocketSession* ws) { + const WebsocketSession& ws) { sync_primitives::AutoLock lock(mSubscribersListLock); - std::multimap<std::string, WebsocketSession*>::iterator it_s = - mSubscribersList.begin(); - for (; it_s != mSubscribersList.end();) { - if (it_s->second == ws) { - mSubscribersList.erase(it_s++); + for (auto it_s = mSubscribersList.cbegin(); + it_s != mSubscribersList.cend();) { + auto ws_session = it_s->second.lock(); + if (!ws_session || ws_session.get() == &ws) { + it_s = mSubscribersList.erase(it_s); } else { ++it_s; } } } -void CMessageBrokerController::pushRequest(Json::Value& message, - WebsocketSession* ws_session) { - sync_primitives::AutoLock lock(mRequestListLock); +bool CMessageBrokerController::pushRequest(Json::Value& message, + WebsocketSession& ws_session) { std::string id = message["id"].asString(); - mRequestList.insert( - std::map<std::string, WebsocketSession*>::value_type(id, ws_session)); + sync_primitives::AutoLock lock(mRequestListLock); + return mRequestList.emplace(std::move(id), ws_session.shared_from_this()) + .second; } -bool CMessageBrokerController::addSubscriber(WebsocketSession* ws_session, - std::string name) { - bool result = true; +bool CMessageBrokerController::addSubscriber(WebsocketSession& ws_session, + const std::string& name) { sync_primitives::AutoLock lock(mSubscribersListLock); - std::pair<std::multimap<std::string, WebsocketSession*>::iterator, - std::multimap<std::string, WebsocketSession*>::iterator> - p = mSubscribersList.equal_range(name); - if (p.first != p.second) { - std::multimap<std::string, WebsocketSession*>::iterator itr; - for (itr = p.first; itr != p.second; ++itr) { - if (ws_session == itr->second) { - result = false; - SDL_LOG_ERROR(("Subscriber already exists!\n")); - } + auto p = mSubscribersList.equal_range(name); + for (auto it = p.first; it != p.second;) { + const std::shared_ptr<WebsocketSession> ws = it->second.lock(); + if (!ws) { + // Clear expired + it = mSubscribersList.erase(it); + } else if (ws.get() == &ws_session) { + // Found an element: {name, ws_session} + return false; + } else { + ++it; } } - if (result) { - mSubscribersList.insert( - std::map<std::string, WebsocketSession*>::value_type(name, ws_session)); - } - return result; + + // Not found an element: {name, ws_session} + mSubscribersList.emplace_hint(p.second, name, ws_session.shared_from_this()); + return true; } -void CMessageBrokerController::deleteSubscriber(WebsocketSession* ws, - std::string name) { +void CMessageBrokerController::deleteSubscriber(const WebsocketSession& ws, + const std::string& name) { sync_primitives::AutoLock lock(mSubscribersListLock); - std::pair<std::multimap<std::string, WebsocketSession*>::iterator, - std::multimap<std::string, WebsocketSession*>::iterator> - p = mSubscribersList.equal_range(name); - if (p.first != p.second) { - std::multimap<std::string, WebsocketSession*>::iterator itr; - for (itr = p.first; itr != p.second;) { - if (ws == itr->second) { - mSubscribersList.erase(itr++); - } else { - ++itr; - } + auto p = mSubscribersList.equal_range(name); + for (auto it = p.first; it != p.second;) { + const std::shared_ptr<WebsocketSession> ws_session = it->second.lock(); + if (!ws_session || &ws == ws_session.get()) { + it = mSubscribersList.erase(it); + } else { + ++it; } } } -int CMessageBrokerController::getSubscribersFd( - std::string name, std::vector<WebsocketSession*>& result) { - int res = 0; - std::map<std::string, WebsocketSession*>::iterator it; - +std::vector<std::shared_ptr<WebsocketSession> > +CMessageBrokerController::getSubscribersFd(const std::string& name) { + std::vector<std::shared_ptr<WebsocketSession> > result; sync_primitives::AutoLock lock(mSubscribersListLock); - std::pair<std::multimap<std::string, WebsocketSession*>::iterator, - std::multimap<std::string, WebsocketSession*>::iterator> - p = mSubscribersList.equal_range(name); - if (p.first != p.second) { - std::multimap<std::string, WebsocketSession*>::iterator itr; - for (itr = p.first; itr != p.second; ++itr) { - result.push_back(itr->second); + auto p = mSubscribersList.equal_range(name); + for (auto it = p.first; it != p.second;) { + if (std::shared_ptr<WebsocketSession> ws = it->second.lock()) { + result.push_back(std::move(ws)); + ++it; + } else { + // Clear expired + it = mSubscribersList.erase(it); } } - res = result.size(); - return res; + return result; } void CMessageBrokerController::processInternalRequest( - Json::Value& message, WebsocketSession* ws_session) { + const Json::Value& message, WebsocketSession& ws_session) { std::string method = message["method"].asString(); std::string methodName = getMethodName(method); if (methodName == "registerComponent") { @@ -390,7 +389,7 @@ void CMessageBrokerController::processInternalRequest( response["id"] = message["id"]; response["jsonrpc"] = "2.0"; response["result"] = getNextControllerId(); - ws_session->sendJsonMessage(response); + ws_session.sendJsonMessage(response); } else { Json::Value error, err; error["id"] = message["id"]; @@ -398,7 +397,7 @@ void CMessageBrokerController::processInternalRequest( err["code"] = CONTROLLER_EXISTS; err["message"] = "Controller has been already registered."; error["error"] = err; - ws_session->sendJsonMessage(error); + ws_session.sendJsonMessage(error); } } else { Json::Value error, err; @@ -407,7 +406,7 @@ void CMessageBrokerController::processInternalRequest( err["code"] = INVALID_REQUEST; err["message"] = "Wrong method parameter."; error["error"] = err; - ws_session->sendJsonMessage(error); + ws_session.sendJsonMessage(error); } } else if (methodName == "subscribeTo") { Json::Value params = message["params"]; @@ -418,7 +417,7 @@ void CMessageBrokerController::processInternalRequest( response["id"] = message["id"]; response["jsonrpc"] = "2.0"; response["result"] = "OK"; - ws_session->sendJsonMessage(response); + ws_session.sendJsonMessage(response); } else { Json::Value error, err; error["id"] = message["id"]; @@ -426,7 +425,7 @@ void CMessageBrokerController::processInternalRequest( err["code"] = CONTROLLER_EXISTS; err["message"] = "Subscribe has been already registered."; error["error"] = err; - ws_session->sendJsonMessage(error); + ws_session.sendJsonMessage(error); } } else { Json::Value error, err; @@ -435,7 +434,7 @@ void CMessageBrokerController::processInternalRequest( err["code"] = INVALID_REQUEST; err["message"] = "Wrong method parameter."; error["error"] = err; - ws_session->sendJsonMessage(error); + ws_session.sendJsonMessage(error); } } else if (methodName == "unregisterComponent") { @@ -448,7 +447,7 @@ void CMessageBrokerController::processInternalRequest( response["id"] = message["id"]; response["jsonrpc"] = "2.0"; response["result"] = "OK"; - ws_session->sendJsonMessage(response); + ws_session.sendJsonMessage(response); } else { Json::Value error, err; error["id"] = message["id"]; @@ -456,7 +455,7 @@ void CMessageBrokerController::processInternalRequest( err["code"] = INVALID_REQUEST; err["message"] = "Wrong method parameter."; error["error"] = err; - ws_session->sendJsonMessage(error); + ws_session.sendJsonMessage(error); } } else if (methodName == "unsubscribeFrom") { Json::Value params = message["params"]; @@ -467,7 +466,7 @@ void CMessageBrokerController::processInternalRequest( response["id"] = message["id"]; response["jsonrpc"] = "2.0"; response["result"] = "OK"; - ws_session->sendJsonMessage(response); + ws_session.sendJsonMessage(response); } else { Json::Value error, err; error["id"] = message["id"]; @@ -475,7 +474,7 @@ void CMessageBrokerController::processInternalRequest( err["code"] = INVALID_REQUEST; err["message"] = "Wrong method parameter."; error["error"] = err; - ws_session->sendJsonMessage(error); + ws_session.sendJsonMessage(error); } } else { } diff --git a/src/components/hmi_message_handler/src/messagebroker_adapter.cc b/src/components/hmi_message_handler/src/messagebroker_adapter.cc index ca3d03dd91..cc13341ca0 100644 --- a/src/components/hmi_message_handler/src/messagebroker_adapter.cc +++ b/src/components/hmi_message_handler/src/messagebroker_adapter.cc @@ -70,7 +70,9 @@ void MessageBrokerAdapter::SendMessageToHMI( return; } - sendJsonMessage(json_value); + if (!sendJsonMessage(json_value)) { + handler()->OnErrorSending(message); + } } void MessageBrokerAdapter::processResponse(std::string method, diff --git a/src/components/hmi_message_handler/src/websocket_session.cc b/src/components/hmi_message_handler/src/websocket_session.cc index f2cb265770..a387b639a2 100644 --- a/src/components/hmi_message_handler/src/websocket_session.cc +++ b/src/components/hmi_message_handler/src/websocket_session.cc @@ -85,7 +85,7 @@ void WebsocketSession::Recv(boost::system::error_code ec) { SDL_LOG_ERROR(str_err); shutdown_ = true; thread_delegate_->SetShutdown(); - controller_->deleteController(this); + controller_->deleteController(*this); return; } @@ -126,7 +126,7 @@ void WebsocketSession::Read(boost::system::error_code ec, SDL_LOG_ERROR(str_err); shutdown_ = true; thread_delegate_->SetShutdown(); - controller_->deleteController(this); + controller_->deleteController(*this); buffer_.consume(buffer_.size()); return; } @@ -198,9 +198,9 @@ void WebsocketSession::onMessageReceived(Json::Value message) { std::string component_name = GetComponentName(method); if (component_name == "MB") { - controller_->processInternalRequest(message, this); + controller_->processInternalRequest(message, *this); } else { - controller_->pushRequest(message, this); + controller_->pushRequest(message, *this); controller_->processRequest(message); } } diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index 72dfb71a29..67f23956be 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -554,9 +554,24 @@ class ApplicationManager { */ virtual void IviInfoUpdated(const std::string& vehicle_info, int value) = 0; + /** + * @brief Creates the application object for a newly registered application. + * This method performs initialiation of the app object by setting properties + * and starting the resumption process if applicable. + * @param request_for_registration Smart Object RegisterAppInterfaceRequest + * message received from mobile. + */ virtual ApplicationSharedPtr RegisterApplication( const std::shared_ptr<smart_objects::SmartObject>& request_for_registration) = 0; + /** + * @brief Completes initialization process by adding the app to the + * applications accessor. App is now accessible by all other Core components. + * @param application ApplicationSharedPtr for newly registered application. + * @param connection_key Internal application id of registering application. + */ + virtual void FinalizeAppRegistration(ApplicationSharedPtr application, + const uint32_t connection_key) = 0; virtual void SendUpdateAppList() = 0; @@ -813,11 +828,11 @@ class ApplicationManager { * @brief Callback calls when application starts/stops data streaming * @param app_id Streaming application id * @param service_type Streaming service type - * @param state Shows if streaming started or stopped + * @param new_state Defines new streaming state */ virtual void OnAppStreaming(uint32_t app_id, protocol_handler::ServiceType service_type, - bool state) = 0; + const Application::StreamingState new_state) = 0; /** * @brief CreateRegularState create regular HMI state for application @@ -858,18 +873,24 @@ class ApplicationManager { protocol_handler::ServiceType service_type) = 0; /** - * @brief Called when application completes streaming configuration + * @brief Called when application successfully completes streaming + * configuration * @param app_id Streaming application id * @param service_type Streaming service type - * @param result true if configuration is successful, false otherwise - * @param rejected_params list of rejected parameters' name. Valid - * only when result is false. */ - virtual void OnStreamingConfigured( + virtual void OnStreamingConfigurationSuccessful( + uint32_t app_id, protocol_handler::ServiceType service_type) = 0; + + /** + * @brief Called when application fails streaming configuration + * @param app_id Streaming application id + * @param rejected_params list of rejected parameter names + * @param reason NACK reason + */ + virtual void OnStreamingConfigurationFailed( uint32_t app_id, - protocol_handler::ServiceType service_type, - bool result, - std::vector<std::string>& rejected_params) = 0; + std::vector<std::string>& rejected_params, + const std::string& reason) = 0; virtual const ApplicationManagerSettings& get_settings() const = 0; // Extract the app ID to use internally based on the UseFullAppID .ini setting diff --git a/src/components/include/application_manager/state_controller.h b/src/components/include/application_manager/state_controller.h index 422b34e0a0..e604675cea 100644 --- a/src/components/include/application_manager/state_controller.h +++ b/src/components/include/application_manager/state_controller.h @@ -35,9 +35,12 @@ #include "application_manager/application.h" #include "application_manager/application_manager.h" +#include "application_manager/postponed_activation_controller.h" #include "application_manager/request_controller_settings.h" #include "stdint.h" +class PostponedActivationController; + namespace application_manager { class StateController { public: @@ -246,6 +249,8 @@ class StateController { * @param app_id id of application to check */ virtual void DropPostponedWindows(const uint32_t app_id) = 0; + + virtual PostponedActivationController& GetPostponedActivationController() = 0; }; } // namespace application_manager diff --git a/src/components/include/connection_handler/connection_handler.h b/src/components/include/connection_handler/connection_handler.h index de78024e61..c5995fbbb8 100644 --- a/src/components/include/connection_handler/connection_handler.h +++ b/src/components/include/connection_handler/connection_handler.h @@ -48,7 +48,13 @@ */ namespace connection_handler { -enum CloseSessionReason { kCommon = 0, kFlood, kMalformed, kUnauthorizedApp }; +enum CloseSessionReason { + kCommon = 0, + kFlood, + kMalformed, + kUnauthorizedApp, + kFinalMessage +}; class ConnectionHandlerObserver; @@ -297,7 +303,8 @@ class ConnectionHandler { virtual void NotifyServiceStartedResult( uint32_t session_key, bool result, - std::vector<std::string>& rejected_params) = 0; + std::vector<std::string>& rejected_params, + const std::string& reason) = 0; /** * \brief Called when secondary transport with given session ID is established diff --git a/src/components/include/media_manager/media_manager.h b/src/components/include/media_manager/media_manager.h index 2d2201a949..0729adc7d8 100644 --- a/src/components/include/media_manager/media_manager.h +++ b/src/components/include/media_manager/media_manager.h @@ -70,14 +70,6 @@ class MediaManager { */ virtual const MediaManagerSettings& settings() const = 0; - /** - * \brief Convert an amount of audio bytes to an estimated time in ms - * \param data_size number of bytes to be played - * \return milliseconds required to play <data_size> many bytes with - * the current pcm stream capabilities - */ - virtual uint32_t DataSizeToMilliseconds(uint64_t data_size) const = 0; - virtual ~MediaManager() {} }; diff --git a/src/components/include/protocol/rpc_type.h b/src/components/include/protocol/rpc_type.h index db4a808cfd..fde8fe7885 100644 --- a/src/components/include/protocol/rpc_type.h +++ b/src/components/include/protocol/rpc_type.h @@ -49,7 +49,6 @@ enum RpcType { // Validate and map byte value to RPC type RpcType RpcTypeFromByte(uint8_t byte); // Check and convert RpcType to byte value ready to be transmitted -uint8_t RpcTypeToByte(RpcType type); const char* RpcTypeToString(RpcType type); diff --git a/src/components/include/protocol/service_type.h b/src/components/include/protocol/service_type.h index 803b8106b8..77a095f7e9 100644 --- a/src/components/include/protocol/service_type.h +++ b/src/components/include/protocol/service_type.h @@ -79,7 +79,6 @@ enum ServiceType { * Service types to binary stream */ ServiceType ServiceTypeFromByte(uint8_t type); -uint8_t ServiceTypeToByte(ServiceType type); } // namespace protocol_handler #endif // SRC_COMPONENTS_INCLUDE_PROTOCOL_SERVICE_TYPE_H_ diff --git a/src/components/include/protocol_handler/protocol_handler.h b/src/components/include/protocol_handler/protocol_handler.h index bb596631a0..c7ee670972 100644 --- a/src/components/include/protocol_handler/protocol_handler.h +++ b/src/components/include/protocol_handler/protocol_handler.h @@ -134,6 +134,8 @@ class ProtocolHandler { * @param rejected_params list of parameters name that are rejected. * Only valid when generated_session_id is 0. Note, even if * generated_session_id is 0, the list may be empty. + * @param err_reason string with NACK reason. Only valid when + * generated_session_id is 0. */ virtual void NotifySessionStarted( const SessionContext& context, diff --git a/src/components/include/protocol_handler/session_observer.h b/src/components/include/protocol_handler/session_observer.h index cdf4267188..593ce8408c 100644 --- a/src/components/include/protocol_handler/session_observer.h +++ b/src/components/include/protocol_handler/session_observer.h @@ -179,6 +179,13 @@ class SessionObserver { virtual void OnMalformedMessageCallback(const uint32_t& connection_key) = 0; /** + * @brief Callback function used by ProtocolHandler when the last message was + * sent for a mobile connection + * @param connection_key used by other components as an application identifier + */ + virtual void OnFinalMessageCallback(const uint32_t& connection_key) = 0; + + /** * @brief Converts connection handle to transport type string used in * smartDeviceLink.ini file, e.g. "TCP_WIFI" * @param connection_handle A connection identifier diff --git a/src/components/include/test/application_manager/mock_application_manager.h b/src/components/include/test/application_manager/mock_application_manager.h index 862c862a20..ee5d7f315a 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -220,6 +220,9 @@ class MockApplicationManager : public application_manager::ApplicationManager { application_manager::ApplicationSharedPtr( const std::shared_ptr<smart_objects::SmartObject>& request_for_registration)); + MOCK_METHOD2(FinalizeAppRegistration, + void(application_manager::ApplicationSharedPtr, + const uint32_t connection_key)); MOCK_METHOD0(SendUpdateAppList, void()); MOCK_METHOD2(MarkAppsGreyOut, void(const connection_handler::DeviceHandle handle, @@ -309,10 +312,11 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_METHOD1(OnAppUnauthorized, void(const uint32_t& app_id)); MOCK_METHOD1(ActivateApplication, bool(application_manager::ApplicationSharedPtr app)); - MOCK_METHOD3(OnAppStreaming, - void(uint32_t app_id, - protocol_handler::ServiceType service_type, - bool state)); + MOCK_METHOD3( + OnAppStreaming, + void(uint32_t app_id, + protocol_handler::ServiceType service_type, + application_manager::Application::StreamingState new_state)); MOCK_CONST_METHOD6(CreateRegularState, application_manager::HmiStatePtr( application_manager::ApplicationSharedPtr app, @@ -373,11 +377,13 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_METHOD0(OnTimerSendTTSGlobalProperties, void()); MOCK_METHOD0(OnLowVoltage, void()); MOCK_METHOD0(OnWakeUp, void()); - MOCK_METHOD4(OnStreamingConfigured, + MOCK_METHOD2(OnStreamingConfigurationSuccessful, + void(uint32_t app_id, + protocol_handler::ServiceType service_type)); + MOCK_METHOD3(OnStreamingConfigurationFailed, void(uint32_t app_id, - protocol_handler::ServiceType service_type, - bool result, - std::vector<std::string>& rejected_params)); + std::vector<std::string>& rejected_params, + const std::string& reason)); MOCK_METHOD2(ProcessReconnection, void(application_manager::ApplicationSharedPtr application, const uint32_t connection_key)); diff --git a/src/components/include/test/application_manager/mock_state_controller.h b/src/components/include/test/application_manager/mock_state_controller.h index a06336467e..ca538bacb0 100644 --- a/src/components/include/test/application_manager/mock_state_controller.h +++ b/src/components/include/test/application_manager/mock_state_controller.h @@ -113,6 +113,8 @@ class MockStateController : public am::StateController { MOCK_METHOD2(DeactivateApp, void(am::ApplicationSharedPtr app, const am::WindowID window_id)); + MOCK_METHOD0(GetPostponedActivationController, + application_manager::PostponedActivationController&()); }; } // namespace application_manager_test diff --git a/src/components/include/test/connection_handler/mock_connection_handler.h b/src/components/include/test/connection_handler/mock_connection_handler.h index d44dd94ddd..bf266751d4 100644 --- a/src/components/include/test/connection_handler/mock_connection_handler.h +++ b/src/components/include/test/connection_handler/mock_connection_handler.h @@ -123,10 +123,11 @@ class MockConnectionHandler : public connection_handler::ConnectionHandler { transport_manager::ConnectionUID secondary_transport_id)); MOCK_CONST_METHOD1(GetSessionTransports, const SessionTransports(uint8_t session_id)); - MOCK_METHOD3(NotifyServiceStartedResult, + MOCK_METHOD4(NotifyServiceStartedResult, void(uint32_t session_key, bool result, - std::vector<std::string>& rejected_params)); + std::vector<std::string>& rejected_params, + const std::string& reason)); MOCK_METHOD3( OnSecondaryTransportStarted, bool(transport_manager::ConnectionUID& primary_connection_handle, diff --git a/src/components/include/test/media_manager/mock_media_manager.h b/src/components/include/test/media_manager/mock_media_manager.h index 364c495236..36e35352d6 100644 --- a/src/components/include/test/media_manager/mock_media_manager.h +++ b/src/components/include/test/media_manager/mock_media_manager.h @@ -64,7 +64,6 @@ class MockMediaManager : public media_manager::MediaManager { MOCK_METHOD2(FramesProcessed, void(int32_t application_key, int32_t frame_number)); MOCK_CONST_METHOD0(settings, const media_manager::MediaManagerSettings&()); - MOCK_CONST_METHOD1(DataSizeToMilliseconds, uint32_t(uint64_t data_size)); }; } // namespace media_manager_test diff --git a/src/components/include/test/protocol_handler/mock_protocol_handler.h b/src/components/include/test/protocol_handler/mock_protocol_handler.h index e3a52157ec..94a9efd9e5 100644 --- a/src/components/include/test/protocol_handler/mock_protocol_handler.h +++ b/src/components/include/test/protocol_handler/mock_protocol_handler.h @@ -64,9 +64,6 @@ class MockProtocolHandler : public ::protocol_handler::ProtocolHandler { MOCK_CONST_METHOD0(get_settings, const ::protocol_handler::ProtocolHandlerSettings&()); MOCK_METHOD0(get_session_observer, protocol_handler::SessionObserver&()); - MOCK_METHOD2(NotifySessionStarted, - void(const ::protocol_handler::SessionContext& context, - std::vector<std::string>& rejected_params)); MOCK_METHOD3(NotifySessionStarted, void(const ::protocol_handler::SessionContext& context, std::vector<std::string>& rejected_params, diff --git a/src/components/include/test/protocol_handler/mock_session_observer.h b/src/components/include/test/protocol_handler/mock_session_observer.h index 3414153fc7..6bd67f6516 100644 --- a/src/components/include/test/protocol_handler/mock_session_observer.h +++ b/src/components/include/test/protocol_handler/mock_session_observer.h @@ -83,6 +83,7 @@ class MockSessionObserver : public ::protocol_handler::SessionObserver { void(const uint32_t& connection_key)); MOCK_METHOD1(OnMalformedMessageCallback, void(const uint32_t& connection_key)); + MOCK_METHOD1(OnFinalMessageCallback, void(const uint32_t& connection_key)); MOCK_CONST_METHOD1( TransportTypeProfileStringFromConnHandle, const std::string(transport_manager::ConnectionUID connection_handle)); diff --git a/src/components/media_manager/include/media_manager/media_manager_impl.h b/src/components/media_manager/include/media_manager/media_manager_impl.h index 3e24212ed5..8d60cd0e54 100644 --- a/src/components/media_manager/include/media_manager/media_manager_impl.h +++ b/src/components/media_manager/include/media_manager/media_manager_impl.h @@ -33,7 +33,6 @@ #ifndef SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_IMPL_H_ #define SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_IMPL_H_ -#include <chrono> #include <map> #include <string> #include "interfaces/MOBILE_API.h" @@ -80,7 +79,6 @@ class MediaManagerImpl : public MediaManager, protocol_handler::ServiceType service_type); virtual void StopStreaming(int32_t application_key, protocol_handler::ServiceType service_type); - virtual void SetProtocolHandler( protocol_handler::ProtocolHandler* protocol_handler); virtual void OnMessageReceived( @@ -91,8 +89,6 @@ class MediaManagerImpl : public MediaManager, virtual const MediaManagerSettings& settings() const OVERRIDE; - virtual uint32_t DataSizeToMilliseconds(uint64_t data_size) const OVERRIDE; - #ifdef BUILD_TESTS void set_mock_a2dp_player(MediaAdapter* media_adapter); void set_mock_mic_listener(MediaListenerPtr media_listener); @@ -118,12 +114,6 @@ class MediaManagerImpl : public MediaManager, std::map<protocol_handler::ServiceType, MediaAdapterImplPtr> streamer_; std::map<protocol_handler::ServiceType, MediaListenerPtr> streamer_listener_; - uint32_t bits_per_sample_; - uint32_t sampling_rate_; - uint64_t stream_data_size_; - std::chrono::time_point<std::chrono::system_clock> - socket_audio_stream_start_time_; - application_manager::ApplicationManager& application_manager_; private: diff --git a/src/components/media_manager/include/media_manager/streamer_adapter.h b/src/components/media_manager/include/media_manager/streamer_adapter.h index a35e680b6a..15f21bb924 100644 --- a/src/components/media_manager/include/media_manager/streamer_adapter.h +++ b/src/components/media_manager/include/media_manager/streamer_adapter.h @@ -87,7 +87,7 @@ class StreamerAdapter : public MediaAdapterImpl { }; private: - int32_t current_application_; + std::atomic_int current_application_; utils::MessageQueue<protocol_handler::RawMessagePtr> messages_; Streamer* streamer_; diff --git a/src/components/media_manager/src/audio/a2dp_source_player_adapter.cc b/src/components/media_manager/src/audio/a2dp_source_player_adapter.cc index b9cdf55482..a2c088c8a1 100644 --- a/src/components/media_manager/src/audio/a2dp_source_player_adapter.cc +++ b/src/components/media_manager/src/audio/a2dp_source_player_adapter.cc @@ -85,9 +85,8 @@ A2DPSourcePlayerAdapter::~A2DPSourcePlayerAdapter() { } void A2DPSourcePlayerAdapter::StartActivity(int32_t application_key) { - SDL_LOG_INFO( - - "Starting a2dp playing music for " << application_key << " application."); + SDL_LOG_INFO("Starting a2dp playing music for " << application_key + << " application."); if (application_key != current_application_) { current_application_ = application_key; diff --git a/src/components/media_manager/src/media_manager_impl.cc b/src/components/media_manager/src/media_manager_impl.cc index ce80cc3c50..6f0a67b0c9 100644 --- a/src/components/media_manager/src/media_manager_impl.cc +++ b/src/components/media_manager/src/media_manager_impl.cc @@ -35,8 +35,6 @@ #include "application_manager/application_impl.h" #include "application_manager/application_manager.h" #include "application_manager/message_helper.h" -#include "application_manager/smart_object_keys.h" -#include "interfaces/MOBILE_API.h" #include "media_manager/audio/from_mic_recorder_listener.h" #include "media_manager/streamer_listener.h" #include "protocol_handler/protocol_handler.h" @@ -66,9 +64,6 @@ MediaManagerImpl::MediaManagerImpl( , protocol_handler_(NULL) , a2dp_player_(NULL) , from_mic_recorder_(NULL) - , bits_per_sample_(16) - , sampling_rate_(16000) - , stream_data_size_(0ull) , application_manager_(application_manager) { Init(); } @@ -165,23 +160,6 @@ void MediaManagerImpl::Init() { streamer_[ServiceType::kAudio]->AddListener( streamer_listener_[ServiceType::kAudio]); } - - if (application_manager_.hmi_capabilities().pcm_stream_capabilities()) { - const auto pcm_caps = - application_manager_.hmi_capabilities().pcm_stream_capabilities(); - - if (pcm_caps->keyExists(application_manager::strings::bits_per_sample)) { - bits_per_sample_ = - pcm_caps->getElement(application_manager::strings::bits_per_sample) - .asUInt(); - } - - if (pcm_caps->keyExists(application_manager::strings::sampling_rate)) { - sampling_rate_ = - pcm_caps->getElement(application_manager::strings::sampling_rate) - .asUInt(); - } - } } void MediaManagerImpl::PlayA2DPSource(int32_t application_key) { @@ -298,8 +276,6 @@ void MediaManagerImpl::StopStreaming( int32_t application_key, protocol_handler::ServiceType service_type) { SDL_LOG_AUTO_TRACE(); - stream_data_size_ = 0ull; - if (streamer_[service_type]) { streamer_[service_type]->StopActivity(application_key); } @@ -337,25 +313,7 @@ void MediaManagerImpl::OnMessageReceived( ApplicationSharedPtr app = application_manager_.application(streaming_app_id); if (app) { - if (ServiceType::kAudio == service_type && - "socket" == settings().audio_server_type()) { - if (stream_data_size_ == 0) { - socket_audio_stream_start_time_ = std::chrono::system_clock::now(); - } - - stream_data_size_ += message->data_size(); - uint32_t ms_for_all_data = DataSizeToMilliseconds(stream_data_size_); - uint32_t ms_since_stream_start = - std::chrono::duration_cast<std::chrono::milliseconds>( - std::chrono::system_clock::now() - - socket_audio_stream_start_time_) - .count(); - uint32_t ms_stream_remaining = ms_for_all_data - ms_since_stream_start; - - app->WakeUpStreaming(service_type, ms_stream_remaining); - } else { - app->WakeUpStreaming(service_type); - } + app->WakeUpStreaming(service_type); streamer_[service_type]->SendData(streaming_app_id, message); } } @@ -378,8 +336,7 @@ void MediaManagerImpl::FramesProcessed(int32_t application_key, auto video_stream = std::dynamic_pointer_cast<StreamerAdapter>( streamer_[protocol_handler::ServiceType::kMobileNav]); - if (audio_stream.use_count() != 0 && - "pipe" == settings().audio_server_type()) { + if (audio_stream.use_count() != 0) { size_t audio_queue_size = audio_stream->GetMsgQueueSize(); SDL_LOG_DEBUG("# Messages in audio queue = " << audio_queue_size); if (audio_queue_size > 0) { @@ -387,8 +344,7 @@ void MediaManagerImpl::FramesProcessed(int32_t application_key, } } - if (video_stream.use_count() != 0 && - "pipe" == settings().video_server_type()) { + if (video_stream.use_count() != 0) { size_t video_queue_size = video_stream->GetMsgQueueSize(); SDL_LOG_DEBUG("# Messages in video queue = " << video_queue_size); if (video_queue_size > 0) { @@ -402,10 +358,4 @@ const MediaManagerSettings& MediaManagerImpl::settings() const { return settings_; } -uint32_t MediaManagerImpl::DataSizeToMilliseconds(uint64_t data_size) const { - constexpr uint16_t latency_compensation = 500; - return 1000 * data_size / (sampling_rate_ * bits_per_sample_ / 8) + - latency_compensation; -} - } // namespace media_manager diff --git a/src/components/media_manager/src/pipe_streamer_adapter.cc b/src/components/media_manager/src/pipe_streamer_adapter.cc index 0759813c04..5e4c87c73d 100644 --- a/src/components/media_manager/src/pipe_streamer_adapter.cc +++ b/src/components/media_manager/src/pipe_streamer_adapter.cc @@ -86,9 +86,8 @@ bool PipeStreamerAdapter::PipeStreamer::Connect() { return false; } - SDL_LOG_INFO( - - "Pipe " << named_pipe_path_ << " was successfuly opened for writing"); + SDL_LOG_INFO("Pipe " << named_pipe_path_ + << " was successfuly opened for writing"); return true; } diff --git a/src/components/media_manager/src/streamer_adapter.cc b/src/components/media_manager/src/streamer_adapter.cc index 808b9715af..8dedd56ea5 100644 --- a/src/components/media_manager/src/streamer_adapter.cc +++ b/src/components/media_manager/src/streamer_adapter.cc @@ -59,7 +59,6 @@ void StreamerAdapter::StartActivity(int32_t application_key) { << " has been already started"); return; } - messages_.Reset(); DCHECK(thread_); const size_t kStackSize = 16384; @@ -87,6 +86,7 @@ void StreamerAdapter::StopActivity(int32_t application_key) { DCHECK(streamer_); streamer_->exitThreadMain(); + messages_.Reset(); for (std::set<MediaListenerPtr>::iterator it = media_listeners_.begin(); media_listeners_.end() != it; diff --git a/src/components/media_manager/test/media_manager_impl_test.cc b/src/components/media_manager/test/media_manager_impl_test.cc index 3b4e6f6150..a64faabe91 100644 --- a/src/components/media_manager/test/media_manager_impl_test.cc +++ b/src/components/media_manager/test/media_manager_impl_test.cc @@ -35,7 +35,6 @@ #include "application_manager/message.h" #include "application_manager/mock_application.h" #include "application_manager/mock_application_manager.h" -#include "application_manager/mock_hmi_capabilities.h" #include "application_manager/resumption/resume_ctrl.h" #include "application_manager/state_controller.h" #include "gmock/gmock.h" @@ -110,10 +109,6 @@ class MediaManagerImplTest : public ::testing::Test { .WillByDefault(ReturnRef(kDefaultValue)); ON_CALL(mock_media_manager_settings_, audio_server_type()) .WillByDefault(ReturnRef(kDefaultValue)); - ON_CALL(mock_hmi_capabilities_, pcm_stream_capabilities()) - .WillByDefault(Return(nullptr)); - ON_CALL(app_mngr_, hmi_capabilities()) - .WillByDefault(ReturnRef(mock_hmi_capabilities_)); mock_app_ = std::make_shared<MockApp>(); media_manager_impl_.reset( new MediaManagerImpl(app_mngr_, mock_media_manager_settings_)); @@ -181,7 +176,7 @@ class MediaManagerImplTest : public ::testing::Test { .WillOnce(Return(true)); EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); - EXPECT_CALL(*mock_app_, WakeUpStreaming(service_type, 0ull)); + EXPECT_CALL(*mock_app_, WakeUpStreaming(service_type)); MockMediaAdapterImplPtr mock_media_streamer = std::make_shared<MockMediaAdapterImpl>(); media_manager_impl_->set_mock_streamer(service_type, mock_media_streamer); @@ -211,7 +206,6 @@ class MediaManagerImplTest : public ::testing::Test { const ::testing::NiceMock<MockMediaManagerSettings> mock_media_manager_settings_; std::shared_ptr<MediaManagerImpl> media_manager_impl_; - application_manager_test::MockHMICapabilities mock_hmi_capabilities_; }; TEST_F(MediaManagerImplTest, diff --git a/src/components/policy/policy_external/include/policy/policy_helper.h b/src/components/policy/policy_external/include/policy/policy_helper.h index 69ba8806d4..87a9228c12 100644 --- a/src/components/policy/policy_external/include/policy/policy_helper.h +++ b/src/components/policy/policy_external/include/policy/policy_helper.h @@ -68,13 +68,6 @@ struct CompareGroupName { const StringsValueType& group_name_; }; -/* - * @brief Used for compare of policies parameters mapped with specific - * application ids - */ -bool operator!=(const policy_table::ApplicationParams& first, - const policy_table::ApplicationParams& second); - /** * @brief Helper struct for checking changes of application policies, which * come with update along with current data snapshot @@ -393,15 +386,6 @@ FunctionalGroupIDs Merge(const FunctionalGroupIDs& first, const FunctionalGroupIDs& second); /** - * @brief Finds same values - * @param first First source of values - * @param second Second source of values - * @return Same values set, if any found - */ -FunctionalGroupIDs FindSame(const FunctionalGroupIDs& first, - const FunctionalGroupIDs& second); - -/** * @brief Unwrap application policies from predefined values to specific policy * values, i.e. if application has "default", it will be assigned default * policies diff --git a/src/components/policy/policy_external/include/policy/policy_table/types.h b/src/components/policy/policy_external/include/policy/policy_table/types.h index c95802f181..6b2f05d336 100644 --- a/src/components/policy/policy_external/include/policy/policy_table/types.h +++ b/src/components/policy/policy_external/include/policy/policy_table/types.h @@ -654,6 +654,7 @@ struct VehicleDataItem : CompositeType { Optional<String<0, 255> > until; Optional<Boolean> removed; Optional<Boolean> deprecated; + Optional<String<0, UINT32_MAX> > defvalue; Optional<Float<-INT32_MAX, INT32_MAX> > minvalue; Optional<Float<-INT32_MAX, INT32_MAX> > maxvalue; Optional<Integer<uint32_t, 0, UINT32_MAX> > minsize; @@ -682,6 +683,12 @@ struct VehicleDataItem : CompositeType { * @return true if type is valid. */ bool ValidateTypes() const; + /** + * @brief Validates default value of vehicle data item based + * on type, unable to validate enum values + * @return true if defvalue is valid. + */ + bool ValidateDefault() const; bool IsPrimitiveType() const; bool ValidateNaming(std::string str) const; diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc index 67d8bdb2d1..81a5518cb8 100644 --- a/src/components/policy/policy_external/src/cache_manager.cc +++ b/src/components/policy/policy_external/src/cache_manager.cc @@ -166,7 +166,8 @@ struct LinkCollector typedef std::vector<policy_table::UserConsentRecords::key_type> ApplicationsIds; - LinkCollector(std::map<std::string, std::string>& links) : links_(links) {} + explicit LinkCollector(std::map<std::string, std::string>& links) + : links_(links) {} void operator()(const policy_table::DeviceData::value_type& value) { using namespace policy_table; @@ -208,10 +209,12 @@ struct ExternalConsentConsentGroupAppender }; struct DefaultPolicyUpdater { - DefaultPolicyUpdater(const policy_table::ApplicationParams& default_params) + explicit DefaultPolicyUpdater( + const policy_table::ApplicationParams& default_params) : default_params_(default_params) {} - void operator()(policy_table::ApplicationPolicies::value_type& pt_value) { + void operator()( + policy_table::ApplicationPolicies::value_type& pt_value) const { if (policy::kDefaultId == pt_value.second.get_string()) { pt_value.second = default_params_; pt_value.second.set_to_string(policy::kDefaultId); @@ -1302,7 +1305,6 @@ int CacheManager::IgnitionCyclesBeforeExchange() { *pt_->policy_table.module_meta->ignition_cycles_since_last_exchange); current = std::max(last_exch, 0); SDL_LOG_DEBUG( - "IgnitionCyclesBeforeExchange current:" << static_cast<int>(current)); return std::max(limit - current, 0); @@ -1340,7 +1342,6 @@ bool CacheManager::SetCountersPassedForSuccessfulUpdate( case DAYS_AFTER_EPOCH: *pt_->policy_table.module_meta->pt_exchanged_x_days_after_epoch = value; SDL_LOG_DEBUG( - "SetCountersPassedForSuccessfulUpdate days after epoch:" << value); break; default: @@ -1704,6 +1705,8 @@ std::vector<UserFriendlyMessage> CacheManager::GetUserFriendlyMsg( SDL_LOG_ERROR("No fallback language found for message code: " << *it); continue; } + // FIXME (VSemenyuk): message_string will always be overwritten by + // active_hmi_language_message_string message_string = fallback_message_string; } message_string = active_hmi_language_message_string; @@ -1827,10 +1830,6 @@ bool CacheManager::GetPriority(const std::string& policy_app_id, void CacheManager::CheckSnapshotInitialization() { CACHE_MANAGER_CHECK_VOID(); - if (!snapshot_) { - SDL_LOG_ERROR("Snapshot pointer is not initialized"); - return; - } *(snapshot_->policy_table.module_config.preloaded_pt) = false; @@ -2182,9 +2181,9 @@ int CacheManager::CountUnconsentedGroups(const std::string& policy_app_id, pt_->policy_table.app_policies_section; policy_table::Strings::iterator app_groups; - policy_table::Strings::iterator app_groups_end = app_groups; + policy_table::Strings::iterator app_groups_end; policy_table::Strings::iterator app_pre_groups; - policy_table::Strings::iterator app_pre_groups_end = app_pre_groups; + policy_table::Strings::iterator app_pre_groups_end; if (kDeviceId == policy_app_id) { app_groups = app_policies_section.device.groups.begin(); @@ -2294,11 +2293,10 @@ std::string CacheManager::GetCCPUVersionFromPT() const { bool CacheManager::IsMetaInfoPresent() const { CACHE_MANAGER_CHECK(false); - bool result = true; sync_primitives::AutoLock lock(cache_lock_); - result = NULL != pt_->policy_table.module_meta->ccpu_version && - NULL != pt_->policy_table.module_meta->wers_country_code && - NULL != pt_->policy_table.module_meta->language; + bool result = NULL != pt_->policy_table.module_meta->ccpu_version && + NULL != pt_->policy_table.module_meta->wers_country_code && + NULL != pt_->policy_table.module_meta->language; return result; } @@ -2353,9 +2351,8 @@ bool CacheManager::CleanupUnpairedDevices() { SDL_LOG_DEBUG("Device_data size is: " << device_data.size()); device_data.erase(it_device); - SDL_LOG_INFO( - - "Device id " << *iter << " had been deleted from device_data section."); + SDL_LOG_INFO("Device id " << *iter + << " had been deleted from device_data section."); SDL_LOG_DEBUG("Device_data size is: " << device_data.size()); } is_unpaired_.clear(); diff --git a/src/components/policy/policy_external/src/policy_helper.cc b/src/components/policy/policy_external/src/policy_helper.cc index 4607c3ca5f..0dde301d0e 100644 --- a/src/components/policy/policy_external/src/policy_helper.cc +++ b/src/components/policy/policy_external/src/policy_helper.cc @@ -102,25 +102,6 @@ bool CompareGroupName::operator()( return !(strcasecmp(gn_.c_str(), gn_compare.c_str())); } -bool operator!=(const policy_table::ApplicationParams& first, - const policy_table::ApplicationParams& second) { - if (first.groups.size() != second.groups.size()) { - return true; - } - StringsConstItr it_first = first.groups.begin(); - StringsConstItr it_first_end = first.groups.end(); - StringsConstItr it_second = second.groups.begin(); - StringsConstItr it_second_end = second.groups.end(); - for (; it_first != it_first_end; ++it_first) { - CompareGroupName gp(*it_first); - StringsConstItr it = std::find_if(it_second, it_second_end, gp); - if (it_second_end == it) { - return true; - } - } - return false; -} - CheckAppPolicy::CheckAppPolicy( PolicyManagerImpl* pm, const std::shared_ptr<policy_table::Table> update, @@ -607,7 +588,6 @@ bool CheckAppPolicy::IsConsentRequired(const std::string& app_id, return false; } - bool is_preconsented = false; policy_table::Strings::value_type str(group_name); policy_table::Strings::iterator pre_begin = update_->policy_table.app_policies_section.apps[app_id] @@ -618,7 +598,7 @@ bool CheckAppPolicy::IsConsentRequired(const std::string& app_id, policy_table::Strings::iterator it2 = std::find(pre_begin, pre_end, str); - is_preconsented = pre_end != it2; + bool is_preconsented = pre_end != it2; return it->second.user_consent_prompt.is_initialized() && !is_preconsented; } @@ -695,7 +675,6 @@ bool CheckAppPolicy::IsAppPropertiesChanged( if (!IsKnownAppication(app_policy.first)) { SDL_LOG_DEBUG( - "AppProperties provided for new application: " << app_policy.first); return true; } @@ -768,7 +747,7 @@ bool CheckAppPolicy::IsEncryptionRequiredFlagChanged( return result; }; - auto get_app_rpcs = [](const std::string group_name, + auto get_app_rpcs = [](const std::string& group_name, const FunctionalGroupings& groups) -> rpc::Optional<policy_table::Rpcs> { auto it = groups.find(group_name); @@ -953,8 +932,7 @@ void FillNotificationData::UpdateParameters( // If 'parameters' section is omitted if (!in_parameters.is_initialized()) { - if (!does_require_user_consent_ || - (does_require_user_consent_ && kAllowedKey == current_key_)) { + if (!does_require_user_consent_ || kAllowedKey == current_key_) { out_parameter.any_parameter_allowed = true; } } @@ -1251,28 +1229,6 @@ FunctionalGroupIDs Merge(const FunctionalGroupIDs& first, return merged; } -FunctionalGroupIDs FindSame(const FunctionalGroupIDs& first, - const FunctionalGroupIDs& second) { - SDL_LOG_INFO("Find same groups"); - FunctionalGroupIDs first_copy(first); - FunctionalGroupIDs second_copy(second); - - std::sort(first_copy.begin(), first_copy.end()); - std::sort(second_copy.begin(), second_copy.end()); - - FunctionalGroupIDs same; - std::set_intersection(first_copy.begin(), - first_copy.end(), - second_copy.begin(), - second_copy.end(), - std::back_inserter(same)); - - same.resize( - std::distance(same.begin(), std::unique(same.begin(), same.end()))); - - return same; -} - bool UnwrapAppPolicies(policy_table::ApplicationPolicies& app_policies) { policy_table::ApplicationPolicies::iterator it_default = app_policies.find(kDefaultId); diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc index 773c689409..9bcea70803 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -62,7 +62,7 @@ namespace { struct GroupNamesAppender : public std::unary_function<void, const policy::FunctionalGroupPermission&> { - GroupNamesAppender(policy_table::Strings& names) : names_(names) {} + explicit GroupNamesAppender(policy_table::Strings& names) : names_(names) {} void operator()(const policy::FunctionalGroupPermission& value) { names_.push_back(value.group_name); @@ -465,7 +465,6 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( const std::string& file, const BinaryMessage& pt_content) { SDL_LOG_INFO("LoadPT of size " << pt_content.size()); SDL_LOG_DEBUG( - "PTU content is: " << std::string(pt_content.begin(), pt_content.end())); // Parse message into table struct @@ -491,7 +490,6 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( auto policy_table_snapshot = cache_->GenerateSnapshot(); if (!policy_table_snapshot) { SDL_LOG_ERROR( - "Failed to create snapshot of policy table, trying another exchange"); return PtProcessingResult::kNewPtRequired; } @@ -507,7 +505,6 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( // Replace current data with updated if (!cache_->ApplyUpdate(*pt_update)) { SDL_LOG_WARN( - "Unsuccessful save of updated policy table, trying another exchange"); return PtProcessingResult::kNewPtRequired; } @@ -968,7 +965,6 @@ void PolicyManagerImpl::CheckPermissions(const PTString& device_id, hmi_level)) { // RPC found in allowed == allowed by backend, but disallowed by user SDL_LOG_DEBUG( - "RPC found in allowed == allowed by backend, but disallowed by user"); result.hmi_level_permitted = kRpcUserDisallowed; } else { @@ -1266,7 +1262,6 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( app_permissions_diff_.find(policy_app_id); if (app_permissions_diff_.end() == it_pending) { SDL_LOG_WARN( - "No pending permissions had been found for appID: " << policy_app_id); return; } @@ -1284,7 +1279,6 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( for (; it_groups != it_end_groups; ++it_groups) { if (policy::kGroupUndefined == it_groups->state) { SDL_LOG_DEBUG( - "Unconsented groups still present for appID: " << policy_app_id); it_pending->second.appPermissionsConsentNeeded = true; return; @@ -1292,7 +1286,6 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( } SDL_LOG_DEBUG( - "Unconsented groups not present anymore for appID: " << policy_app_id); it_pending->second.appPermissionsConsentNeeded = false; return; @@ -1827,13 +1820,12 @@ bool PolicyManagerImpl::IsNeedToUpdateExternalConsentStatus( ItemV difference_v; difference_v.resize(new_status_v.size() + existing_status_v.size()); - ItemV::iterator ci = difference_v.begin(); - ci = std::set_difference(new_status_v.begin(), - new_status_v.end(), - existing_status_v.begin(), - existing_status_v.end(), - difference_v.begin(), - ConsentStatusComparatorFunc); + ItemV::iterator ci = std::set_difference(new_status_v.begin(), + new_status_v.end(), + existing_status_v.begin(), + existing_status_v.end(), + difference_v.begin(), + ConsentStatusComparatorFunc); difference_v.resize(ci - difference_v.begin()); return !difference_v.empty(); @@ -2255,16 +2247,14 @@ void PolicyManagerImpl::AddNewApplication(const std::string& device_id, if (kDeviceHasNoConsent == device_consent || kDeviceDisallowed == device_consent) { - SDL_LOG_INFO( - - "Setting " << policy::kPreDataConsentId - << " permissions for application id: " << application_id); + SDL_LOG_INFO("Setting " + << policy::kPreDataConsentId + << " permissions for application id: " << application_id); cache_->SetPredataPolicy(application_id); } else { - SDL_LOG_INFO( - - "Setting " << policy::kDefaultId - << " permissions for application id: " << application_id); + SDL_LOG_INFO("Setting " + << policy::kDefaultId + << " permissions for application id: " << application_id); cache_->SetDefaultPolicy(application_id); } @@ -2285,10 +2275,9 @@ void PolicyManagerImpl::PromoteExistedApplication( << " device_consent: " << device_consent); if (kDeviceAllowed == device_consent && cache_->IsPredataPolicy(application_id)) { - SDL_LOG_INFO( - - "Setting " << policy::kDefaultId - << " permissions for application id: " << application_id); + SDL_LOG_INFO("Setting " + << policy::kDefaultId + << " permissions for application id: " << application_id); cache_->SetDefaultPolicy(application_id); } ProcessExternalConsentStatusForApp( @@ -2386,7 +2375,7 @@ void PolicyManagerImpl::SetDefaultHmiTypes( } struct HMITypeToInt { - int operator()(const policy_table::AppHMITypes::value_type item) { + int operator()(const policy_table::AppHMITypes::value_type item) const { return policy_table::AppHMIType(item); } }; @@ -2587,6 +2576,7 @@ __attribute__((visibility("default"))) policy::PolicyManager* CreateManager( return new policy::PolicyManagerImpl(); } +// cppcheck-suppress unusedFunction __attribute__((visibility("default"))) void DeleteManager( policy::PolicyManager* pm) { delete pm; diff --git a/src/components/policy/policy_external/src/policy_table/types.cc b/src/components/policy/policy_external/src/policy_table/types.cc index 1f344f5263..243cf98066 100644 --- a/src/components/policy/policy_external/src/policy_table/types.cc +++ b/src/components/policy/policy_external/src/policy_table/types.cc @@ -1,5 +1,8 @@ #include "policy/policy_table/types.h" + #include <algorithm> +#include <regex> + #include "rpc_base/rpc_base_json_inl.h" namespace rpc { @@ -872,7 +875,6 @@ ModuleConfig::ModuleConfig(const Json::Value* value__) impl::ValueMember(value__, "lock_screen_dismissal_enabled")) {} void ModuleConfig::SafeCopyFrom(const ModuleConfig& from) { - exchange_after_x_days = from.exchange_after_x_days; exchange_after_x_kilometers = from.exchange_after_x_kilometers; exchange_after_x_days = from.exchange_after_x_days; exchange_after_x_ignition_cycles = from.exchange_after_x_ignition_cycles; @@ -2217,6 +2219,7 @@ VehicleDataItem::VehicleDataItem(const VehicleDataItem& vehicle_data) , until(vehicle_data.until) , removed(vehicle_data.removed) , deprecated(vehicle_data.deprecated) + , defvalue(vehicle_data.defvalue) , minvalue(vehicle_data.minvalue) , maxvalue(vehicle_data.maxvalue) , minsize(vehicle_data.minsize) @@ -2236,12 +2239,17 @@ VehicleDataItem::VehicleDataItem(const Json::Value* value__) , until(impl::ValueMember(value__, "until")) , removed(impl::ValueMember(value__, "removed")) , deprecated(impl::ValueMember(value__, "deprecated")) + , defvalue(static_cast<Json::Value*>(nullptr)) , minvalue(impl::ValueMember(value__, "minvalue")) , maxvalue(impl::ValueMember(value__, "maxvalue")) , minsize(impl::ValueMember(value__, "minsize")) , maxsize(impl::ValueMember(value__, "maxsize")) , minlength(impl::ValueMember(value__, "minlength")) - , maxlength(impl::ValueMember(value__, "maxlength")) {} + , maxlength(impl::ValueMember(value__, "maxlength")) { + if (value__->isMember("defvalue")) { + *defvalue = impl::ValueMember(value__, "defvalue")->asString(); + } +} VehicleDataItem::~VehicleDataItem() {} @@ -2267,6 +2275,7 @@ Json::Value VehicleDataItem::ToJsonValue() const { impl::WriteJsonField("until", until, &ret); impl::WriteJsonField("removed", removed, &ret); impl::WriteJsonField("deprecated", deprecated, &ret); + impl::WriteJsonField("defvalue", defvalue, &ret); impl::WriteJsonField("minvalue", minvalue, &ret); impl::WriteJsonField("maxvalue", maxvalue, &ret); impl::WriteJsonField("minsize", minsize, &ret); @@ -2281,9 +2290,10 @@ bool VehicleDataItem::operator==(const VehicleDataItem& vd) { mandatory == vd.mandatory && params == vd.params && array == vd.array && since == vd.since && until == vd.until && removed == vd.removed && deprecated == vd.deprecated && - minvalue == vd.minvalue && maxvalue == vd.maxvalue && - minsize == vd.minsize && maxsize == vd.maxsize && - minlength == vd.minlength && maxlength == vd.maxlength); + defvalue == vd.defvalue && minvalue == vd.minvalue && + maxvalue == vd.maxvalue && minsize == vd.minsize && + maxsize == vd.maxsize && minlength == vd.minlength && + maxlength == vd.maxlength); } bool VehicleDataItem::is_valid() const { @@ -2317,6 +2327,9 @@ bool VehicleDataItem::is_valid() const { if (!deprecated.is_valid()) { return false; } + if (!(defvalue.is_valid() && ValidateDefault())) { + return false; + } if (!minvalue.is_valid()) { return false; } @@ -2373,6 +2386,9 @@ bool VehicleDataItem::struct_not_empty() const { if (!deprecated.is_initialized()) { return false; } + if (!defvalue.is_initialized()) { + return false; + } if (!minvalue.is_initialized()) { return false; } @@ -2443,6 +2459,13 @@ void VehicleDataItem::ReportErrors(rpc::ValidationReport* report__) const { if (!deprecated.is_valid()) { deprecated.ReportErrors(&report__->ReportSubobject("deprecated")); } + if (!defvalue.is_valid()) { + defvalue.ReportErrors(&report__->ReportSubobject("defvalue")); + } + if (!ValidateDefault()) { + report__->set_validation_info("Invalid default value: " + + std::string(*defvalue)); + } if (!minvalue.is_valid()) { minvalue.ReportErrors(&report__->ReportSubobject("minvalue")); } @@ -2475,6 +2498,7 @@ void VehicleDataItem::SetPolicyTableType(PolicyTableType pt_type) { until.SetPolicyTableType(pt_type); removed.SetPolicyTableType(pt_type); deprecated.SetPolicyTableType(pt_type); + defvalue.SetPolicyTableType(pt_type); minvalue.SetPolicyTableType(pt_type); maxvalue.SetPolicyTableType(pt_type); minsize.SetPolicyTableType(pt_type); @@ -2510,6 +2534,46 @@ bool VehicleDataItem::ValidateNaming(std::string str) const { !contains_spec_chars(str); } +bool VehicleDataItem::ValidateDefault() const { + if (!defvalue.is_initialized()) { + return true; + } + std::string value = std::string(*defvalue); + bool valid = false; + if (VehicleDataItem::kInteger == std::string(type)) { + // Match int + std::regex pattern("^-?\\d+$"); + bool type_matches = std::regex_match(value, pattern); + if (type_matches) { + size_t int_value = std::stol(value); + valid = (!minvalue.is_initialized() || int_value >= *minvalue) && + (!maxvalue.is_initialized() || int_value <= *maxvalue); + } + } else if (VehicleDataItem::kFloat == std::string(type) || + VehicleDataItem::kDouble == std::string(type)) { + // Match double + std::regex pattern("^-?\\d+(\\.\\d+)?$"); + bool type_matches = std::regex_match(value, pattern); + if (type_matches) { + double dbl_value = std::stod(value); + valid = (!minvalue.is_initialized() || dbl_value >= *minvalue) && + (!maxvalue.is_initialized() || dbl_value <= *maxvalue); + } + } else if (VehicleDataItem::kString == std::string(type)) { + size_t length = value.length(); + valid = (!minsize.is_initialized() || length >= *minsize) && + (!maxsize.is_initialized() || length <= *maxsize); + } else if (VehicleDataItem::kBoolean == std::string(type)) { + valid = ("false" == value || "true" == value); + } else if (VehicleDataItem::kStruct != std::string(type) && + !IsPrimitiveType()) { + // Enum values cannot be validated here + valid = true; + } + + return valid; +} + bool VehicleDataItem::ValidateTypes() const { if (VehicleDataItem::kStruct == std::string(type)) { return params.is_initialized() && !(params->empty()) && params.is_valid(); diff --git a/src/components/policy/policy_external/src/policy_table/validation.cc b/src/components/policy/policy_external/src/policy_table/validation.cc index 89c5992fab..825fd20b84 100644 --- a/src/components/policy/policy_external/src/policy_table/validation.cc +++ b/src/components/policy/policy_external/src/policy_table/validation.cc @@ -30,7 +30,6 @@ bool VerifyPredefinedApp(ApplicationPolicies::value_type& app_policies) { if (PT_PRELOADED == app_policies.second.GetPolicyTableType() && predefined_request_types.is_cleaned_up()) { SDL_LOG_ERROR( - app_id << " policy RequestTypes is empty after clean-up. Exiting."); return false; } @@ -326,9 +325,8 @@ bool VehicleDataItem::Validate() const { }; if (!ValidateTypes()) { - SDL_LOG_ERROR( - - "Unknown type: " << std::string(type) << " of " << std::string(key)); + SDL_LOG_ERROR("Unknown type: " << std::string(type) << " of " + << std::string(key)); return false; } return true; diff --git a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc index 05b45e5f1c..7147e0949d 100644 --- a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc +++ b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc @@ -1123,7 +1123,6 @@ void SQLPTExtRepresentation::GatherConsentGroup( // Fill data for ExternalConsent consents if (!query.Prepare(sql_pt_ext::kSelectExternalConsentStatusGroup)) { SDL_LOG_WARN( - "Incorrect select statement for ExternalConsent consented groups."); return; } diff --git a/src/components/policy/policy_external/src/sql_pt_queries.cc b/src/components/policy/policy_external/src/sql_pt_queries.cc index 95c82b6ea6..9e69d2cef8 100644 --- a/src/components/policy/policy_external/src/sql_pt_queries.cc +++ b/src/components/policy/policy_external/src/sql_pt_queries.cc @@ -480,6 +480,7 @@ const std::string kCreateSchema = " `until` VARCHAR(45), " " `removed` BOOL, " " `deprecated` BOOL, " + " `defvalue` VARCHAR(65535), " " `minvalue` INTEGER, " " `maxvalue` INTEGER, " " `minsize` INTEGER, " @@ -759,13 +760,14 @@ const std::string kInsertVehicleDataItem = " `until`, " " `removed`, " " `deprecated`, " + " `defvalue`, " " `minvalue`, " " `maxvalue`, " " `minsize`, " " `maxsize`, " " `minlength`, " " `maxlength`) " - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "; + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "; const std::string kInsertVehicleDataItemParams = "INSERT INTO `vehicle_data_item_parameters` (" diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc index 36e363d922..d4458ef2a5 100644 --- a/src/components/policy/policy_external/src/sql_pt_representation.cc +++ b/src/components/policy/policy_external/src/sql_pt_representation.cc @@ -108,9 +108,8 @@ void SQLPTRepresentation::CheckPermissions(const PTString& app_id, utils::dbms::SQLQuery query(db()); if (!query.Prepare(sql_pt::kSelectRpc)) { - SDL_LOG_WARN( - - "Incorrect select statement from rpcs" << query.LastError().text()); + SDL_LOG_WARN("Incorrect select statement from rpcs" + << query.LastError().text()); return; } query.Bind(0, app_id); @@ -379,9 +378,8 @@ InitResult SQLPTRepresentation::Init(const PolicySettings* settings) { utils::dbms::SQLQuery check_first_run(db()); if (check_first_run.Prepare(sql_pt::kIsFirstRun) && check_first_run.Next()) { - SDL_LOG_INFO( - - "Selecting is first run " << check_first_run.GetBoolean(0)); + SDL_LOG_INFO("Selecting is first run " + << check_first_run.GetBoolean(0)); if (check_first_run.GetBoolean(0)) { utils::dbms::SQLQuery set_not_first_run(db()); set_not_first_run.Exec(sql_pt::kSetNotFirstRun); @@ -403,13 +401,11 @@ InitResult SQLPTRepresentation::Init(const PolicySettings* settings) { utils::dbms::SQLQuery query(db()); if (!query.Exec(sql_pt::kCreateSchema)) { SDL_LOG_ERROR( - "Failed creating schema of database: " << query.LastError().text()); return InitResult::FAIL; } if (!query.Exec(sql_pt::kInsertInitData)) { SDL_LOG_ERROR( - "Failed insert init data to database: " << query.LastError().text()); return InitResult::FAIL; } @@ -442,7 +438,6 @@ bool SQLPTRepresentation::Clear() { } if (!query.Exec(sql_pt::kInsertInitData)) { SDL_LOG_ERROR( - "Failed insert init data to database: " << query.LastError().text()); return false; } @@ -457,13 +452,11 @@ bool SQLPTRepresentation::RefreshDB() { } if (!query.Exec(sql_pt::kCreateSchema)) { SDL_LOG_ERROR( - "Failed creating schema of database: " << query.LastError().text()); return false; } if (!query.Exec(sql_pt::kInsertInitData)) { SDL_LOG_ERROR( - "Failed insert init data to database: " << query.LastError().text()); return false; } @@ -1711,22 +1704,25 @@ policy_table::VehicleDataItem SQLPTRepresentation::PopulateVDIFromQuery( *result.deprecated = query.GetBoolean(8); } if (!query.IsNull(9)) { - *result.minvalue = query.GetInteger(9); + *result.defvalue = query.GetString(9); } if (!query.IsNull(10)) { - *result.maxvalue = query.GetInteger(10); + *result.minvalue = query.GetInteger(10); } if (!query.IsNull(11)) { - *result.minsize = query.GetUInteger(11); + *result.maxvalue = query.GetInteger(11); } if (!query.IsNull(12)) { - *result.maxsize = query.GetUInteger(12); + *result.minsize = query.GetUInteger(12); } if (!query.IsNull(13)) { - *result.minlength = query.GetUInteger(13); + *result.maxsize = query.GetUInteger(13); } if (!query.IsNull(14)) { - *result.maxlength = query.GetUInteger(14); + *result.minlength = query.GetUInteger(14); + } + if (!query.IsNull(15)) { + *result.maxlength = query.GetUInteger(15); } result.params->mark_initialized(); @@ -1750,9 +1746,7 @@ SQLPTRepresentation::SelectCompositeVehicleDataItems() const { if (!vdi.is_initialized()) { return policy_table::VehicleDataItems(); } - for (const auto& item : vdi) { - result.push_back(item); - } + std::copy(vdi.begin(), vdi.end(), std::back_inserter(result)); } return result; @@ -2632,24 +2626,27 @@ bool SQLPTRepresentation::InsertVehicleDataItem( vehicle_data_item.deprecated.is_initialized() ? query.Bind(8, *vehicle_data_item.deprecated) : query.Bind(8); - vehicle_data_item.minvalue.is_initialized() - ? query.Bind(9, *vehicle_data_item.minvalue) + vehicle_data_item.defvalue.is_initialized() + ? query.Bind(9, *vehicle_data_item.defvalue) : query.Bind(9); - vehicle_data_item.maxvalue.is_initialized() - ? query.Bind(10, *vehicle_data_item.maxvalue) + vehicle_data_item.minvalue.is_initialized() + ? query.Bind(10, *vehicle_data_item.minvalue) : query.Bind(10); - vehicle_data_item.minsize.is_initialized() - ? query.Bind(11, static_cast<int64_t>(*vehicle_data_item.minsize)) + vehicle_data_item.maxvalue.is_initialized() + ? query.Bind(11, *vehicle_data_item.maxvalue) : query.Bind(11); - vehicle_data_item.maxsize.is_initialized() - ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.maxsize)) + vehicle_data_item.minsize.is_initialized() + ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.minsize)) : query.Bind(12); - vehicle_data_item.minlength.is_initialized() - ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.minlength)) + vehicle_data_item.maxsize.is_initialized() + ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.maxsize)) : query.Bind(13); - vehicle_data_item.maxlength.is_initialized() - ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.maxlength)) + vehicle_data_item.minlength.is_initialized() + ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.minlength)) : query.Bind(14); + vehicle_data_item.maxlength.is_initialized() + ? query.Bind(15, static_cast<int64_t>(*vehicle_data_item.maxlength)) + : query.Bind(15); if (!query.Exec() || !query.Reset()) { SDL_LOG_ERROR("Failed to insert vehicle data item: " @@ -2684,7 +2681,6 @@ bool SQLPTRepresentation::InsertVehicleDataItem( if (!query.Exec() || !query.Reset()) { SDL_LOG_ERROR( - "Failed to insert to vehicle data item relations helper table: " << static_cast<std::string>(param.key) << ". Error: " << query.LastError().text()); diff --git a/src/components/policy/policy_external/test/sql_pt_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_test.cc index 5495ef65b0..224c663c52 100644 --- a/src/components/policy/policy_external/test/sql_pt_representation_test.cc +++ b/src/components/policy/policy_external/test/sql_pt_representation_test.cc @@ -408,6 +408,7 @@ TEST_F(SQLPTRepresentationTest, VehicleDataItem_Store_Complete_Item) { *message.until = "5.0"; *message.removed = false; *message.deprecated = false; + *message.defvalue = "0"; *message.minvalue = 0; *message.maxvalue = 255; *message.minsize = 0; diff --git a/src/components/policy/policy_regular/include/policy/policy_helper.h b/src/components/policy/policy_regular/include/policy/policy_helper.h index d5155cf91b..f01d132049 100644 --- a/src/components/policy/policy_regular/include/policy/policy_helper.h +++ b/src/components/policy/policy_regular/include/policy/policy_helper.h @@ -68,13 +68,6 @@ struct CompareGroupName { }; /* - * @brief Used for compare of policies parameters mapped with specific - * application ids - */ -bool operator!=(const policy_table::ApplicationParams& first, - const policy_table::ApplicationParams& second); - -/* * @brief Helper struct for checking changes of application policies, which * come with update along with current data snapshot * In case of policies changed for some application, current data will be @@ -257,15 +250,6 @@ FunctionalGroupIDs Merge(const FunctionalGroupIDs& first, const FunctionalGroupIDs& second); /** - * @brief Finds same values - * @param first First source of values - * @param second Second source of values - * @return Same values set, if any found - */ -FunctionalGroupIDs FindSame(const FunctionalGroupIDs& first, - const FunctionalGroupIDs& second); - -/** * @brief Unwrap application policies from predefined values to specific policy * values, i.e. if application has "default", it will be assigned default * policies diff --git a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h index 307697dd64..dff4802d82 100644 --- a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h +++ b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h @@ -869,7 +869,7 @@ class PolicyManagerImpl : public PolicyManager { void ResetTimeout() OVERRIDE; protected: -#ifdef USE_HMI_PTU_DECRYPTION +#if defined USE_HMI_PTU_DECRYPTION && defined PROPRIETARY_MODE /** * @brief Parse policy table content and convert to PT object * @param pt_content binary content of PT diff --git a/src/components/policy/policy_regular/include/policy/policy_table/types.h b/src/components/policy/policy_regular/include/policy/policy_table/types.h index 38d49bcc7c..673f17e32b 100644 --- a/src/components/policy/policy_regular/include/policy/policy_table/types.h +++ b/src/components/policy/policy_regular/include/policy/policy_table/types.h @@ -551,6 +551,7 @@ struct VehicleDataItem : CompositeType { Optional<String<0, 255> > until; Optional<Boolean> removed; Optional<Boolean> deprecated; + Optional<String<0, UINT32_MAX> > defvalue; Optional<Float<-INT32_MAX, INT32_MAX> > minvalue; Optional<Float<-INT32_MAX, INT32_MAX> > maxvalue; Optional<Integer<uint32_t, 0, UINT32_MAX> > minsize; @@ -579,6 +580,12 @@ struct VehicleDataItem : CompositeType { * @return true if type is valid. */ bool ValidateTypes() const; + /** + * @brief Validates default value of vehicle data item based + * on type, unable to validate enum values + * @return true if defvalue is valid. + */ + bool ValidateDefault() const; bool IsPrimitiveType() const; bool ValidateNaming(std::string str) const; diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc index 5a75c47725..8f98996687 100644 --- a/src/components/policy/policy_regular/src/cache_manager.cc +++ b/src/components/policy/policy_regular/src/cache_manager.cc @@ -79,7 +79,7 @@ SDL_CREATE_LOG_VARIABLE("Policy") } struct LanguageFinder { - LanguageFinder(const std::string& language) : language_(language) {} + explicit LanguageFinder(const std::string& language) : language_(language) {} bool operator()(const policy_table::Languages::value_type& lang) const { return !strcasecmp(language_.c_str(), lang.first.c_str()); } @@ -89,10 +89,12 @@ struct LanguageFinder { }; struct PolicyTableUpdater { - PolicyTableUpdater(const policy_table::ApplicationParams& default_params) + explicit PolicyTableUpdater( + const policy_table::ApplicationParams& default_params) : default_params_(default_params) {} - void operator()(policy_table::ApplicationPolicies::value_type& pt_value) { + void operator()( + policy_table::ApplicationPolicies::value_type& pt_value) const { if (policy::kDefaultId == pt_value.second.get_string()) { pt_value.second = default_params_; pt_value.second.set_to_string(policy::kDefaultId); @@ -607,7 +609,6 @@ int CacheManager::IgnitionCyclesBeforeExchange() { *pt_->policy_table.module_meta->ignition_cycles_since_last_exchange); current = std::max(last_exch, 0); SDL_LOG_DEBUG( - "IgnitionCyclesBeforeExchange current:" << static_cast<int>(current)); return std::max(limit - current, 0); @@ -645,7 +646,6 @@ bool CacheManager::SetCountersPassedForSuccessfulUpdate( case DAYS_AFTER_EPOCH: *pt_->policy_table.module_meta->pt_exchanged_x_days_after_epoch = value; SDL_LOG_DEBUG( - "SetCountersPassedForSuccessfulUpdate days after epoch:" << value); break; default: @@ -1138,10 +1138,6 @@ bool CacheManager::GetPriority(const std::string& policy_app_id, void CacheManager::CheckSnapshotInitialization() { CACHE_MANAGER_CHECK_VOID(); - if (!snapshot_) { - SDL_LOG_ERROR("Snapshot pointer is not initialized"); - return; - } *(snapshot_->policy_table.module_config.preloaded_pt) = false; @@ -1309,8 +1305,6 @@ void CacheManager::PersistData() { copy_pt.policy_table.app_policies_section.apps.end(); bool is_revoked = false; - bool is_default_policy; - bool is_predata_policy; for (; app_policy_iter != app_policy_iter_end; ++app_policy_iter) { const std::string app_id = (*app_policy_iter).first; @@ -1321,7 +1315,7 @@ void CacheManager::PersistData() { copy_pt.policy_table.app_policies_section.apps[app_id].is_null(); } - is_default_policy = + bool is_default_policy = copy_pt.policy_table.app_policies_section.apps.end() != copy_pt.policy_table.app_policies_section.apps.find(app_id) && policy::kDefaultId == @@ -1329,7 +1323,7 @@ void CacheManager::PersistData() { .get_string(); // TODO(AOleynik): Remove this field from DB - is_predata_policy = + bool is_predata_policy = copy_pt.policy_table.app_policies_section.apps.end() != copy_pt.policy_table.app_policies_section.apps.find(app_id) && policy::kPreDataConsentId == diff --git a/src/components/policy/policy_regular/src/policy_helper.cc b/src/components/policy/policy_regular/src/policy_helper.cc index 7d99ff51c0..a5d66fafba 100644 --- a/src/components/policy/policy_regular/src/policy_helper.cc +++ b/src/components/policy/policy_regular/src/policy_helper.cc @@ -54,9 +54,10 @@ bool CompareStrings(const StringsValueType& first, } struct CheckGroupName { - CheckGroupName(const policy::StringsValueType& value) : value_(value) {} + explicit CheckGroupName(const policy::StringsValueType& value) + : value_(value) {} - bool operator()(const FunctionalGroupNames::value_type& value) { + bool operator()(const FunctionalGroupNames::value_type& value) const { return value.second.second == std::string(value_); } @@ -101,25 +102,6 @@ bool CompareGroupName::operator()( return !(strcasecmp(gn_.c_str(), gn_compare.c_str())); } -bool operator!=(const policy_table::ApplicationParams& first, - const policy_table::ApplicationParams& second) { - if (first.groups.size() != second.groups.size()) { - return true; - } - StringsConstItr it_first = first.groups.begin(); - StringsConstItr it_first_end = first.groups.end(); - StringsConstItr it_second = second.groups.begin(); - StringsConstItr it_second_end = second.groups.end(); - for (; it_first != it_first_end; ++it_first) { - CompareGroupName gp(*it_first); - StringsConstItr it = std::find_if(it_second, it_second_end, gp); - if (it_second_end == it) { - return true; - } - } - return false; -} - CheckAppPolicy::CheckAppPolicy( PolicyManagerImpl* pm, const std::shared_ptr<policy_table::Table> update, @@ -340,7 +322,6 @@ void policy::CheckAppPolicy::NotifySystem( const auto devices_ids = listener.GetDevicesIds(app_policy.first); if (devices_ids.empty()) { SDL_LOG_WARN( - "Couldn't find device info for application id: " << app_policy.first); return; } @@ -559,8 +540,7 @@ bool CheckAppPolicy::IsConsentRequired(const std::string& app_id, return false; } - bool is_preconsented = false; - return it->second.user_consent_prompt.is_initialized() && !is_preconsented; + return it->second.user_consent_prompt.is_initialized(); } bool CheckAppPolicy::IsRequestTypeChanged( @@ -635,7 +615,6 @@ bool CheckAppPolicy::IsAppPropertiesChanged( if (!IsKnownAppication(app_policy.first)) { SDL_LOG_DEBUG( - "AppProperties provided for new application: " << app_policy.first); return true; } @@ -707,7 +686,7 @@ bool CheckAppPolicy::IsEncryptionRequiredFlagChanged( return result; }; - auto get_app_rpcs = [](const std::string group_name, + auto get_app_rpcs = [](const std::string& group_name, const FunctionalGroupings& groups) -> rpc::Optional<policy_table::Rpcs> { auto it = groups.find(group_name); @@ -1106,28 +1085,6 @@ FunctionalGroupIDs Merge(const FunctionalGroupIDs& first, return merged; } -FunctionalGroupIDs FindSame(const FunctionalGroupIDs& first, - const FunctionalGroupIDs& second) { - SDL_LOG_INFO("Find same groups"); - FunctionalGroupIDs first_copy(first); - FunctionalGroupIDs second_copy(second); - - std::sort(first_copy.begin(), first_copy.end()); - std::sort(second_copy.begin(), second_copy.end()); - - FunctionalGroupIDs same; - std::set_intersection(first_copy.begin(), - first_copy.end(), - second_copy.begin(), - second_copy.end(), - std::back_inserter(same)); - - same.resize( - std::distance(same.begin(), std::unique(same.begin(), same.end()))); - - return same; -} - bool UnwrapAppPolicies(policy_table::ApplicationPolicies& app_policies) { policy_table::ApplicationPolicies::iterator it = app_policies.begin(); policy_table::ApplicationPolicies::iterator it_default = diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc index 36beeeb07f..059375322a 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -87,7 +87,7 @@ void PolicyManagerImpl::set_listener(PolicyListener* listener) { update_status_manager_.set_listener(listener); } -#ifdef USE_HMI_PTU_DECRYPTION +#if defined USE_HMI_PTU_DECRYPTION && defined PROPRIETARY_MODE std::shared_ptr<policy_table::Table> PolicyManagerImpl::Parse( const BinaryMessage& pt_content) { @@ -328,10 +328,9 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( const std::string& file, const BinaryMessage& pt_content) { SDL_LOG_INFO("LoadPT of size " << pt_content.size()); SDL_LOG_DEBUG( - "PTU content is: " << std::string(pt_content.begin(), pt_content.end())); -#ifdef USE_HMI_PTU_DECRYPTION +#if defined USE_HMI_PTU_DECRYPTION && defined PROPRIETARY_MODE // Assuemes Policy Table was parsed, formatted, and/or decrypted by // the HMI after system request before calling OnReceivedPolicyUpdate // Parse message into table struct @@ -386,7 +385,6 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( // Replace current data with updated if (!cache_->ApplyUpdate(*pt_update)) { SDL_LOG_WARN( - "Unsuccessful save of updated policy table, trying another exchange"); return PtProcessingResult::kNewPtRequired; } @@ -1023,7 +1021,6 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( app_permissions_diff_.find(policy_app_id); if (app_permissions_diff_.end() == it_pending) { SDL_LOG_WARN( - "No pending permissions had been found for appID: " << policy_app_id); return; } @@ -1041,7 +1038,6 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( for (; it_groups != it_end_groups; ++it_groups) { if (policy::kGroupUndefined == it_groups->state) { SDL_LOG_DEBUG( - "Unconsented groups still present for appID: " << policy_app_id); it_pending->second.appPermissionsConsentNeeded = true; return; @@ -1049,7 +1045,6 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( } SDL_LOG_DEBUG( - "Unconsented groups not present anymore for appID: " << policy_app_id); it_pending->second.appPermissionsConsentNeeded = false; return; @@ -1708,7 +1703,7 @@ void PolicyManagerImpl::SetDefaultHmiTypes( } struct HMITypeToInt { - int operator()(const policy_table::AppHMITypes::value_type item) { + int operator()(const policy_table::AppHMITypes::value_type item) const { return policy_table::AppHMIType(item); } }; diff --git a/src/components/policy/policy_regular/src/policy_table/types.cc b/src/components/policy/policy_regular/src/policy_table/types.cc index 017a7e75cb..d3473bb2a7 100644 --- a/src/components/policy/policy_regular/src/policy_table/types.cc +++ b/src/components/policy/policy_regular/src/policy_table/types.cc @@ -1,5 +1,8 @@ // This file is generated, do not edit #include "policy/policy_table/types.h" + +#include <regex> + #include "rpc_base/rpc_base_json_inl.h" namespace rpc { @@ -1676,6 +1679,7 @@ VehicleDataItem::VehicleDataItem(const VehicleDataItem& vehicle_data) , until(vehicle_data.until) , removed(vehicle_data.removed) , deprecated(vehicle_data.deprecated) + , defvalue(vehicle_data.defvalue) , minvalue(vehicle_data.minvalue) , maxvalue(vehicle_data.maxvalue) , minsize(vehicle_data.minsize) @@ -1695,12 +1699,17 @@ VehicleDataItem::VehicleDataItem(const Json::Value* value__) , until(impl::ValueMember(value__, "until")) , removed(impl::ValueMember(value__, "removed")) , deprecated(impl::ValueMember(value__, "deprecated")) + , defvalue(static_cast<Json::Value*>(nullptr)) , minvalue(impl::ValueMember(value__, "minvalue")) , maxvalue(impl::ValueMember(value__, "maxvalue")) , minsize(impl::ValueMember(value__, "minsize")) , maxsize(impl::ValueMember(value__, "maxsize")) , minlength(impl::ValueMember(value__, "minlength")) - , maxlength(impl::ValueMember(value__, "maxlength")) {} + , maxlength(impl::ValueMember(value__, "maxlength")) { + if (value__->isMember("defvalue")) { + *defvalue = impl::ValueMember(value__, "defvalue")->asString(); + } +} VehicleDataItem::~VehicleDataItem() {} @@ -1726,6 +1735,7 @@ Json::Value VehicleDataItem::ToJsonValue() const { impl::WriteJsonField("until", until, &ret); impl::WriteJsonField("removed", removed, &ret); impl::WriteJsonField("deprecated", deprecated, &ret); + impl::WriteJsonField("defvalue", defvalue, &ret); impl::WriteJsonField("minvalue", minvalue, &ret); impl::WriteJsonField("maxvalue", maxvalue, &ret); impl::WriteJsonField("minsize", minsize, &ret); @@ -1740,9 +1750,10 @@ bool VehicleDataItem::operator==(const VehicleDataItem& vd) { mandatory == vd.mandatory && params == vd.params && array == vd.array && since == vd.since && until == vd.until && removed == vd.removed && deprecated == vd.deprecated && - minvalue == vd.minvalue && maxvalue == vd.maxvalue && - minsize == vd.minsize && maxsize == vd.maxsize && - minlength == vd.minlength && maxlength == vd.maxlength); + defvalue == vd.defvalue && minvalue == vd.minvalue && + maxvalue == vd.maxvalue && minsize == vd.minsize && + maxsize == vd.maxsize && minlength == vd.minlength && + maxlength == vd.maxlength); } bool VehicleDataItem::is_valid() const { @@ -1776,6 +1787,9 @@ bool VehicleDataItem::is_valid() const { if (!deprecated.is_valid()) { return false; } + if (!(defvalue.is_valid() && ValidateDefault())) { + return false; + } if (!minvalue.is_valid()) { return false; } @@ -1832,6 +1846,9 @@ bool VehicleDataItem::struct_not_empty() const { if (!deprecated.is_initialized()) { return false; } + if (!defvalue.is_initialized()) { + return false; + } if (!minvalue.is_initialized()) { return false; } @@ -1901,6 +1918,13 @@ void VehicleDataItem::ReportErrors(rpc::ValidationReport* report__) const { if (!deprecated.is_valid()) { deprecated.ReportErrors(&report__->ReportSubobject("deprecated")); } + if (!defvalue.is_valid()) { + defvalue.ReportErrors(&report__->ReportSubobject("defvalue")); + } + if (!ValidateDefault()) { + report__->set_validation_info("Invalid default value: " + + std::string(*defvalue)); + } if (!minvalue.is_valid()) { minvalue.ReportErrors(&report__->ReportSubobject("minvalue")); } @@ -1933,6 +1957,7 @@ void VehicleDataItem::SetPolicyTableType(PolicyTableType pt_type) { until.SetPolicyTableType(pt_type); removed.SetPolicyTableType(pt_type); deprecated.SetPolicyTableType(pt_type); + defvalue.SetPolicyTableType(pt_type); minvalue.SetPolicyTableType(pt_type); maxvalue.SetPolicyTableType(pt_type); minsize.SetPolicyTableType(pt_type); @@ -1976,6 +2001,46 @@ bool VehicleDataItem::ValidateTypes() const { return (!(params.is_initialized()) || params->empty()); } +bool VehicleDataItem::ValidateDefault() const { + if (!defvalue.is_initialized()) { + return true; + } + std::string value = std::string(*defvalue); + bool valid = false; + if (VehicleDataItem::kInteger == std::string(type)) { + // Match int + std::regex pattern("^-?\\d+$"); + bool type_matches = std::regex_match(value, pattern); + if (type_matches) { + size_t int_value = std::stol(value); + valid = (!minvalue.is_initialized() || int_value >= *minvalue) && + (!maxvalue.is_initialized() || int_value <= *maxvalue); + } + } else if (VehicleDataItem::kFloat == std::string(type) || + VehicleDataItem::kDouble == std::string(type)) { + // Match double + std::regex pattern("^-?\\d+(\\.\\d+)?$"); + bool type_matches = std::regex_match(value, pattern); + if (type_matches) { + double dbl_value = std::stod(value); + valid = (!minvalue.is_initialized() || dbl_value >= *minvalue) && + (!maxvalue.is_initialized() || dbl_value <= *maxvalue); + } + } else if (VehicleDataItem::kString == std::string(type)) { + size_t length = value.length(); + valid = (!minsize.is_initialized() || length >= *minsize) && + (!maxsize.is_initialized() || length <= *maxsize); + } else if (VehicleDataItem::kBoolean == std::string(type)) { + valid = ("false" == value || "true" == value); + } else if (VehicleDataItem::kStruct != std::string(type) && + !IsPrimitiveType()) { + // Enum values cannot be validated here + valid = true; + } + + return valid; +} + bool VehicleDataItem::IsPrimitiveType() const { return helpers::in_range(kPODTypes, std::string(type)); } diff --git a/src/components/policy/policy_regular/src/policy_table/validation.cc b/src/components/policy/policy_regular/src/policy_table/validation.cc index c98a0ed5f0..dbc44f01ab 100644 --- a/src/components/policy/policy_regular/src/policy_table/validation.cc +++ b/src/components/policy/policy_regular/src/policy_table/validation.cc @@ -288,9 +288,8 @@ bool VehicleDataItem::Validate() const { }; if (!ValidateTypes()) { - SDL_LOG_ERROR( - - "Unknown type: " << std::string(type) << " of " << std::string(key)); + SDL_LOG_ERROR("Unknown type: " << std::string(type) << " of " + << std::string(key)); return false; } return true; diff --git a/src/components/policy/policy_regular/src/sql_pt_queries.cc b/src/components/policy/policy_regular/src/sql_pt_queries.cc index 4910ee32e9..cf9167406f 100644 --- a/src/components/policy/policy_regular/src/sql_pt_queries.cc +++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc @@ -448,6 +448,7 @@ const std::string kCreateSchema = " `until` VARCHAR(45), " " `removed` BOOL, " " `deprecated` BOOL, " + " `defvalue` VARCHAR(65535), " " `minvalue` INTEGER, " " `maxvalue` INTEGER, " " `minsize` INTEGER, " @@ -721,13 +722,14 @@ const std::string kInsertVehicleDataItem = " `until`, " " `removed`, " " `deprecated`, " + " `defvalue`, " " `minvalue`, " " `maxvalue`, " " `minsize`, " " `maxsize`, " " `minlength`, " " `maxlength`) " - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "; + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "; const std::string kInsertVehicleDataItemParams = "INSERT INTO `vehicle_data_item_parameters` (" diff --git a/src/components/policy/policy_regular/src/sql_pt_representation.cc b/src/components/policy/policy_regular/src/sql_pt_representation.cc index 49b7f2e7be..7193a06bdb 100644 --- a/src/components/policy/policy_regular/src/sql_pt_representation.cc +++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc @@ -92,9 +92,8 @@ void SQLPTRepresentation::CheckPermissions(const PTString& app_id, utils::dbms::SQLQuery query(db()); if (!query.Prepare(sql_pt::kSelectRpc)) { - SDL_LOG_WARN( - - "Incorrect select statement from rpcs" << query.LastError().text()); + SDL_LOG_WARN("Incorrect select statement from rpcs" + << query.LastError().text()); return; } query.Bind(0, app_id); @@ -363,9 +362,8 @@ InitResult SQLPTRepresentation::Init(const PolicySettings* settings) { utils::dbms::SQLQuery check_first_run(db()); if (check_first_run.Prepare(sql_pt::kIsFirstRun) && check_first_run.Next()) { - SDL_LOG_INFO( - - "Selecting is first run " << check_first_run.GetBoolean(0)); + SDL_LOG_INFO("Selecting is first run " + << check_first_run.GetBoolean(0)); if (check_first_run.GetBoolean(0)) { utils::dbms::SQLQuery set_not_first_run(db()); set_not_first_run.Exec(sql_pt::kSetNotFirstRun); @@ -387,13 +385,11 @@ InitResult SQLPTRepresentation::Init(const PolicySettings* settings) { utils::dbms::SQLQuery query(db()); if (!query.Exec(sql_pt::kCreateSchema)) { SDL_LOG_ERROR( - "Failed creating schema of database: " << query.LastError().text()); return InitResult::FAIL; } if (!query.Exec(sql_pt::kInsertInitData)) { SDL_LOG_ERROR( - "Failed insert init data to database: " << query.LastError().text()); return InitResult::FAIL; } @@ -426,7 +422,6 @@ bool SQLPTRepresentation::Clear() { } if (!query.Exec(sql_pt::kInsertInitData)) { SDL_LOG_ERROR( - "Failed insert init data to database: " << query.LastError().text()); return false; } @@ -441,13 +436,11 @@ bool SQLPTRepresentation::RefreshDB() { } if (!query.Exec(sql_pt::kCreateSchema)) { SDL_LOG_ERROR( - "Failed creating schema of database: " << query.LastError().text()); return false; } if (!query.Exec(sql_pt::kInsertInitData)) { SDL_LOG_ERROR( - "Failed insert init data to database: " << query.LastError().text()); return false; } @@ -2625,22 +2618,25 @@ policy_table::VehicleDataItem SQLPTRepresentation::PopulateVDIFromQuery( *result.deprecated = query.GetBoolean(8); } if (!query.IsNull(9)) { - *result.minvalue = query.GetInteger(9); + *result.defvalue = query.GetString(9); } if (!query.IsNull(10)) { - *result.maxvalue = query.GetInteger(10); + *result.minvalue = query.GetInteger(10); } if (!query.IsNull(11)) { - *result.minsize = query.GetUInteger(11); + *result.maxvalue = query.GetInteger(11); } if (!query.IsNull(12)) { - *result.maxsize = query.GetUInteger(12); + *result.minsize = query.GetUInteger(12); } if (!query.IsNull(13)) { - *result.minlength = query.GetUInteger(13); + *result.maxsize = query.GetUInteger(13); } if (!query.IsNull(14)) { - *result.maxlength = query.GetUInteger(14); + *result.minlength = query.GetUInteger(14); + } + if (!query.IsNull(15)) { + *result.maxlength = query.GetUInteger(15); } result.params->mark_initialized(); @@ -2688,24 +2684,27 @@ bool SQLPTRepresentation::InsertVehicleDataItem( vehicle_data_item.deprecated.is_initialized() ? query.Bind(8, *vehicle_data_item.deprecated) : query.Bind(8); - vehicle_data_item.minvalue.is_initialized() - ? query.Bind(9, *vehicle_data_item.minvalue) + vehicle_data_item.defvalue.is_initialized() + ? query.Bind(9, *vehicle_data_item.defvalue) : query.Bind(9); - vehicle_data_item.maxvalue.is_initialized() - ? query.Bind(10, *vehicle_data_item.maxvalue) + vehicle_data_item.minvalue.is_initialized() + ? query.Bind(10, *vehicle_data_item.minvalue) : query.Bind(10); - vehicle_data_item.minsize.is_initialized() - ? query.Bind(11, static_cast<int64_t>(*vehicle_data_item.minsize)) + vehicle_data_item.maxvalue.is_initialized() + ? query.Bind(11, *vehicle_data_item.maxvalue) : query.Bind(11); - vehicle_data_item.maxsize.is_initialized() - ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.maxsize)) + vehicle_data_item.minsize.is_initialized() + ? query.Bind(12, static_cast<int64_t>(*vehicle_data_item.minsize)) : query.Bind(12); - vehicle_data_item.minlength.is_initialized() - ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.minlength)) + vehicle_data_item.maxsize.is_initialized() + ? query.Bind(13, static_cast<int64_t>(*vehicle_data_item.maxsize)) : query.Bind(13); - vehicle_data_item.maxlength.is_initialized() - ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.maxlength)) + vehicle_data_item.minlength.is_initialized() + ? query.Bind(14, static_cast<int64_t>(*vehicle_data_item.minlength)) : query.Bind(14); + vehicle_data_item.maxlength.is_initialized() + ? query.Bind(15, static_cast<int64_t>(*vehicle_data_item.maxlength)) + : query.Bind(15); if (!query.Exec() || !query.Reset()) { SDL_LOG_ERROR("Failed to insert vehicle data item: " @@ -2740,7 +2739,6 @@ bool SQLPTRepresentation::InsertVehicleDataItem( if (!query.Exec() || !query.Reset()) { SDL_LOG_ERROR( - "Failed to insert to vehicle data item relations helper table: " << static_cast<std::string>(param.key) << ". Error: " << query.LastError().text()); @@ -2770,9 +2768,7 @@ SQLPTRepresentation::SelectCompositeVehicleDataItems() const { if (!vdi.is_initialized()) { return policy_table::VehicleDataItems(); } - for (const auto& item : vdi) { - result.push_back(item); - } + std::copy(vdi.begin(), vdi.end(), std::back_inserter(result)); } return result; diff --git a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc index 880e9ca4f9..f4efa811b6 100644 --- a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc +++ b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc @@ -466,6 +466,7 @@ TEST_F(SQLPTRepresentationTest, VehicleDataItem_Store_Complete_Item) { *message.until = "5.0"; *message.removed = false; *message.deprecated = false; + *message.defvalue = "0"; *message.minvalue = 0; *message.maxvalue = 255; *message.minsize = 0; diff --git a/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc b/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc index ec728a69ae..6431ed7394 100644 --- a/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc +++ b/src/components/policy/policy_regular/test/vehicle_data_item_type_test.cc @@ -123,6 +123,7 @@ class VehicleDataItemTypeTest : public ::testing::Test { str.AddField("until", "5.0"); str.AddField("removed", true); str.AddField("deprecated", true); + str.AddField("defvalue", "TestStringVal"); str.AddField("minvalue", 1); str.AddField("maxvalue", 2); str.AddField("minsize", 10); @@ -171,6 +172,7 @@ TEST_F(VehicleDataItemTypeTest, CheckConvertFromJsonToVehicleDataItem_Success) { EXPECT_TRUE((std::string)*vdi.until == "5.0"); EXPECT_TRUE(*vdi.removed == true); EXPECT_TRUE(*vdi.deprecated == true); + EXPECT_TRUE(*vdi.defvalue == "TestStringVal"); EXPECT_TRUE(*vdi.minvalue == 1); EXPECT_TRUE(*vdi.maxvalue == 2); EXPECT_TRUE(*vdi.minsize == 10); @@ -201,6 +203,7 @@ TEST_F(VehicleDataItemTypeTest, CheckIsValid_Struct_Success) { VehicleDataItem vdi(&json_); vdi.type = "Struct"; + vdi.defvalue = rpc::Optional<rpc::String<0, UINT32_MAX> >(); EXPECT_TRUE(vdi.is_valid()); } @@ -211,6 +214,7 @@ TEST_F(VehicleDataItemTypeTest, CheckIsValid_Struct_EmptyParams_Failed) { VehicleDataItem vdi(&json_); vdi.type = "Struct"; + vdi.defvalue = rpc::Optional<rpc::String<0, UINT32_MAX> >(); EXPECT_FALSE(vdi.is_valid()); } @@ -220,16 +224,19 @@ TEST_F(VehicleDataItemTypeTest, CheckIsValid_PODTypes_Success) { VehicleDataItem vdi(&json_); - vdi.type = "Integer"; + vdi.type = "String"; EXPECT_TRUE(vdi.is_valid()); - vdi.type = "Float"; + vdi.type = "Integer"; + *vdi.defvalue = "1"; EXPECT_TRUE(vdi.is_valid()); - vdi.type = "String"; + vdi.type = "Float"; + *vdi.defvalue = "1.1"; EXPECT_TRUE(vdi.is_valid()); vdi.type = "Boolean"; + *vdi.defvalue = "true"; EXPECT_TRUE(vdi.is_valid()); } diff --git a/src/components/protocol/src/rpc_type.cc b/src/components/protocol/src/rpc_type.cc index fb9845d148..0e2edb34e8 100644 --- a/src/components/protocol/src/rpc_type.cc +++ b/src/components/protocol/src/rpc_type.cc @@ -62,11 +62,6 @@ RpcType RpcTypeFromByte(uint8_t byte) { return supported_type ? type : kRpcTypeReserved; } -uint8_t RpcTypeToByte(RpcType type) { - DCHECK(IsSupported(type)); - return uint8_t(type); -} - const char* RpcTypeToString(RpcType type) { switch (type) { case kRpcTypeRequest: diff --git a/src/components/protocol/src/service_type.cc b/src/components/protocol/src/service_type.cc index e6417b07d0..b1674e10d8 100644 --- a/src/components/protocol/src/service_type.cc +++ b/src/components/protocol/src/service_type.cc @@ -63,9 +63,4 @@ ServiceType ServiceTypeFromByte(uint8_t byte) { return valid_type ? type : kInvalidServiceType; } -uint8_t ServiceTypeToByte(ServiceType type) { - DCHECK(IsValid(type)); - return uint8_t(type); -} - } // namespace protocol_handler diff --git a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h index ead997da69..33abd4a96b 100644 --- a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h +++ b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h @@ -379,7 +379,7 @@ class ProtocolHandlerImpl uint8_t session_id, uint8_t protocol_version, uint8_t service_type, - const std::string reason); + const std::string& reason); /** * \brief Sends fail of starting session to mobile application @@ -395,7 +395,7 @@ class ProtocolHandlerImpl uint8_t protocol_version, uint8_t service_type, std::vector<std::string>& rejectedParams, - const std::string reason); + const std::string& reason); /** * \brief Sends acknowledgement of end session/service to mobile application diff --git a/src/components/protocol_handler/src/incoming_data_handler.cc b/src/components/protocol_handler/src/incoming_data_handler.cc index f0692b3304..08997acaac 100644 --- a/src/components/protocol_handler/src/incoming_data_handler.cc +++ b/src/components/protocol_handler/src/incoming_data_handler.cc @@ -158,7 +158,7 @@ RESULT_CODE IncomingDataHandler::CreateFrame( } SDL_LOG_DEBUG("Payload size " << header_.dataSize); const uint32_t packet_size = GetPacketSize(header_); - if (packet_size <= 0) { + if (packet_size == 0) { SDL_LOG_WARN("Null packet size"); ++data_it; --data_size; diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index f1179e7107..1db599e656 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -139,7 +139,6 @@ ProtocolHandlerImpl::ProtocolHandlerImpl( } } else { SDL_LOG_WARN( - "Malformed message filtering is disabled." << "Connection will be close on first malformed message detection"); } @@ -320,7 +319,6 @@ void ProtocolHandlerImpl::SendStartSessionAck( ¶ms, strings::protocol_version, protocol_version_string); UNUSED(protocol_ver_written); SDL_LOG_DEBUG( - "Protocol version parameter was written to bson params: " << protocol_ver_written << "; Value: " << bson_object_get_string(¶ms, strings::protocol_version)); @@ -346,7 +344,6 @@ void ProtocolHandlerImpl::SendStartSessionAck( sizeof(secondaryTransport)); secondaryTransport[sizeof(secondaryTransport) - 1] = '\0'; SDL_LOG_DEBUG( - "Adding " << secondaryTransport << " to secondaryTransports parameter of StartSessionAck"); @@ -387,7 +384,6 @@ void ProtocolHandlerImpl::SendStartSessionAck( send_transport_update_event = true; } else { SDL_LOG_DEBUG( - "Multiple transports feature is disabled by configuration"); // In this case, we must remember that this session will never have // a secondary transport. @@ -396,7 +392,6 @@ void ProtocolHandlerImpl::SendStartSessionAck( } } else { SDL_LOG_WARN( - "Failed to set up secondary transport and service type params"); connection_handler_.SetSecondaryTransportID(session_id, kDisabledSecondary); @@ -451,7 +446,7 @@ void ProtocolHandlerImpl::SendStartSessionNAck(ConnectionID connection_id, uint8_t session_id, uint8_t protocol_version, uint8_t service_type, - const std::string reason) { + const std::string& reason) { std::vector<std::string> rejectedParams; SendStartSessionNAck(connection_id, session_id, @@ -467,7 +462,7 @@ void ProtocolHandlerImpl::SendStartSessionNAck( uint8_t protocol_version, uint8_t service_type, std::vector<std::string>& rejectedParams, - const std::string reason) { + const std::string& reason) { SDL_LOG_AUTO_TRACE(); ProtocolFramePtr ptr( @@ -669,7 +664,6 @@ void ProtocolHandlerImpl::SendEndServicePrivate(int32_t primary_connection_id, << static_cast<int32_t>(session_id)); } else { SDL_LOG_WARN( - "SendEndServicePrivate is failed connection or session does not exist"); } } @@ -1075,6 +1069,7 @@ void ProtocolHandlerImpl::OnTMMessageSend(const RawMessagePtr message) { if (ready_to_close_connections_.end() != connection_it) { ready_to_close_connections_.erase(connection_it); + session_observer_.OnFinalMessageCallback(connection_handle); transport_manager_.Disconnect(connection_handle); return; } @@ -1243,7 +1238,7 @@ void ProtocolHandlerImpl::OnTransportConfigUpdated( if (st.secondary_transport != kDisabledSecondary) { SendTransportUpdateEvent(st.primary_transport, itr->first); } - itr++; + ++itr; } } @@ -1451,7 +1446,6 @@ RESULT_CODE ProtocolHandlerImpl::HandleSingleFrameMessage( SDL_LOG_AUTO_TRACE(); SDL_LOG_DEBUG( - "FRAME_TYPE_SINGLE message of size " << packet->data_size() << "; message " << ConvertPacketDataToString(packet->data(), packet->data_size())); @@ -1706,7 +1700,6 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageStartSession( const ProtocolFramePtr packet) { SDL_LOG_AUTO_TRACE(); SDL_LOG_DEBUG( - "Protocol version:" << static_cast<int>(packet->protocol_version())); const ServiceType service_type = ServiceTypeFromByte(packet->service_type()); @@ -1736,12 +1729,18 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageStartSession( << service_type << ", disallowed by settings."); service_status_update_handler_->OnServiceUpdate( connection_key, service_type, settings_check); - SendStartSessionNAck(connection_id, - session_id, - protocol_version, - service_type, - "Service type: " + std::to_string(service_type) + - " disallowed by settings"); + + std::string reason("Service type: " + std::to_string(service_type) + + " disallowed by settings."); + if (ServiceStatus::PROTECTION_ENFORCED == settings_check) { + reason += " Allowed only in protected mode"; + } + if (ServiceStatus::UNSECURE_START_FAILED == settings_check) { + reason += " Allowed only in unprotected mode"; + } + + SendStartSessionNAck( + connection_id, session_id, protocol_version, service_type, reason); return RESULT_OK; } @@ -2052,9 +2051,8 @@ void ProtocolHandlerImpl::NotifySessionStarted( RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const ProtocolPacket& packet) { const ConnectionID connection_id = packet.connection_id(); - SDL_LOG_DEBUG( - - "Sending heart beat acknowledgment for connection " << connection_id); + SDL_LOG_DEBUG("Sending heart beat acknowledgment for connection " + << connection_id); uint8_t protocol_version; if (session_observer_.ProtocolVersionUsed( connection_id, packet.session_id(), protocol_version)) { @@ -2143,9 +2141,8 @@ bool ProtocolHandlerImpl::TrackMalformedMessage(const uint32_t& connection_key, << malformed_message_frequency); if (!get_settings().malformed_message_filtering() || malformed_message_frequency > malformed_frequency_count) { - SDL_LOG_WARN( - - "Malformed frequency of " << connection_key << " is marked as high."); + SDL_LOG_WARN("Malformed frequency of " << connection_key + << " is marked as high."); session_observer_.OnMalformedMessageCallback(connection_key); malformed_message_meter_.RemoveIdentifier(connection_key); return true; @@ -2248,9 +2245,8 @@ RESULT_CODE ProtocolHandlerImpl::EncryptFrame(ProtocolFramePtr packet) { security_manager::SSLContext* context = session_observer_.GetSSLContext( connection_key, ServiceTypeFromByte(packet->service_type())); - SDL_LOG_DEBUG( - - "Protection flag is: " << packet->protection_flag() << std::boolalpha); + SDL_LOG_DEBUG("Protection flag is: " << packet->protection_flag() + << std::boolalpha); if ((!context || !context->IsInitCompleted()) || !packet->protection_flag()) { SDL_LOG_DEBUG("Ecryption is skipped!"); return RESULT_OK; @@ -2492,7 +2488,6 @@ const bool ProtocolHandlerImpl::ParseSecondaryTransportConfiguration( secondary_transport_types = settings_.secondary_transports_for_wifi(); } else { SDL_LOG_ERROR( - "Bad or unknown device type in ParseSecondaryTransportConfiguration"); return false; } @@ -2556,13 +2551,11 @@ void ProtocolHandlerImpl::GenerateSecondaryTransportsForStartSessionAck( } else if (transport_type.CompareIgnoreCase("Bluetooth")) { if (device_is_ios) { SDL_LOG_TRACE( - "Adding IAP_BLUETOOTH to secondaryTransports for StartSessionAck"); secondaryTransports.push_back("IAP_BLUETOOTH"); } if (device_is_android) { SDL_LOG_TRACE( - "Adding SPP_BLUETOOTH to secondaryTransports for StartSessionAck"); secondaryTransports.push_back("SPP_BLUETOOTH"); } @@ -2573,7 +2566,7 @@ void ProtocolHandlerImpl::GenerateSecondaryTransportsForStartSessionAck( secondaryTransports.push_back("TCP_WIFI"); } - it++; + ++it; } } @@ -2600,11 +2593,10 @@ void ProtocolHandlerImpl::GenerateServiceTransportsForStartSessionAck( bool fPrimaryAdded = false; bool fSecondaryAdded = false; std::vector<std::string>::const_iterator it = service_transports.begin(); - for (; it != service_transports.end(); it++) { + for (; it != service_transports.end(); ++it) { const utils::custom_string::CustomString transport(*it); - SDL_LOG_TRACE( - - "Service Allowed to run on " << transport.c_str() << " transport"); + SDL_LOG_TRACE("Service Allowed to run on " << transport.c_str() + << " transport"); if (!fPrimaryAdded && (transport.CompareIgnoreCase(primary_connection_type.c_str()) || diff --git a/src/components/protocol_handler/src/protocol_packet.cc b/src/components/protocol_handler/src/protocol_packet.cc index bd052c8660..db2f124c53 100644 --- a/src/components/protocol_handler/src/protocol_packet.cc +++ b/src/components/protocol_handler/src/protocol_packet.cc @@ -359,12 +359,11 @@ RESULT_CODE ProtocolPacket::ProtocolHeaderValidator::validate( if (header.dataSize > payload_size || (FRAME_TYPE_CONTROL != header.frameType && header.dataSize == 0u)) { UNUSED(StringifyFrameType); - SDL_LOG_WARN( - - "Packet data size of " - << StringifyFrameType(header.frameType) - << " frame must be in range (0, payload_size=" << payload_size - << "], but actual value is " << header.dataSize); + SDL_LOG_WARN("Packet data size of " + << StringifyFrameType(header.frameType) + << " frame must be in range (0, payload_size=" + << payload_size << "], but actual value is " + << header.dataSize); return RESULT_FAIL; } } break; diff --git a/src/components/protocol_handler/src/protocol_payload.cc b/src/components/protocol_handler/src/protocol_payload.cc index 8916fe91b0..a18f04f8a1 100644 --- a/src/components/protocol_handler/src/protocol_payload.cc +++ b/src/components/protocol_handler/src/protocol_payload.cc @@ -93,8 +93,11 @@ std::ostream& operator<<(std::ostream& os, const ProtocolPayloadV2& payload) { << ", data (bytes): " << payload.data.size() << ")"; } +#ifdef BUILD_TESTS +// cppcheck-suppress unusedFunction //Used in unit tests size_t ProtocolPayloadV2SizeBits() { return PayloadHeaderBits; } +#endif // BUILD_TESTS } // namespace protocol_handler diff --git a/src/components/protocol_handler/test/protocol_handler_tm_test.cc b/src/components/protocol_handler/test/protocol_handler_tm_test.cc index d5d68d9b83..41c16817b5 100644 --- a/src/components/protocol_handler/test/protocol_handler_tm_test.cc +++ b/src/components/protocol_handler/test/protocol_handler_tm_test.cc @@ -3550,6 +3550,56 @@ TEST_F(ProtocolHandlerImplTest, MalformedLimitVerification_NullCount) { EXPECT_TRUE(waiter->WaitFor(times, kAsyncExpectationsTimeout)); } +TEST_F(ProtocolHandlerImplTest, OnFinalMessageCallback) { + const auto protection = false; + const auto is_final_message = true; + const uint32_t total_data_size = 1; + UCharDataVector data(total_data_size); + + ProtocolFramePtr ptr(new protocol_handler::ProtocolPacket(connection_id, + PROTOCOL_VERSION_3, + protection, + FRAME_TYPE_SINGLE, + kControl, + FRAME_DATA_SINGLE, + session_id, + total_data_size, + message_id, + &data[0])); + + using RawFordMessageToMobile = protocol_handler::impl::RawFordMessageToMobile; + using Handler = protocol_handler::impl::ToMobileQueue::Handler; + + auto message = + std::make_shared<RawFordMessageToMobile>(ptr, is_final_message); + auto raw_message = ptr->serializePacket(); + + auto handler = std::static_pointer_cast<Handler>(protocol_handler_impl); + auto transport_manager_listener = + std::static_pointer_cast<TransportManagerListener>(protocol_handler_impl); + + EXPECT_CALL(session_observer_mock, + ProtocolVersionUsed(connection_id, session_id, An<uint8_t&>())) + .WillRepeatedly(Return(false)); + + EXPECT_CALL(session_observer_mock, + PairFromKey(raw_message->connection_key(), _, _)) + .WillRepeatedly( + DoAll(SetArgPointee<1>(connection_id), SetArgPointee<2>(session_id))); + + EXPECT_CALL(transport_manager_mock, SendMessageToDevice(_)) + .WillOnce(Return(E_SUCCESS)); + + EXPECT_CALL(session_observer_mock, OnFinalMessageCallback(connection_id)); + EXPECT_CALL(transport_manager_mock, Disconnect(connection_id)); + + handler->Handle(*message); + // Put the message to list of connections ready to close + transport_manager_listener->OnTMMessageSend(raw_message); + // Processing the list of connections ready to close + transport_manager_listener->OnTMMessageSend(raw_message); +} + TEST_F(ProtocolHandlerImplTest, SendEndServicePrivate_NoConnection_MessageNotSent) { // Expect check connection with ProtocolVersionUsed @@ -3954,7 +4004,7 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_DisallowedBySettings) { bson_object_initialize_default(&bson_nack_params); // NAK reason param std::string reason = "Service type: " + std::to_string(service_type) + - " disallowed by settings"; + " disallowed by settings."; bson_object_put_string(&bson_nack_params, protocol_handler::strings::reason, const_cast<char*>(reason.c_str())); diff --git a/src/components/resumption/src/last_state_impl.cc b/src/components/resumption/src/last_state_impl.cc index f34d793c49..185535c50d 100644 --- a/src/components/resumption/src/last_state_impl.cc +++ b/src/components/resumption/src/last_state_impl.cc @@ -81,9 +81,8 @@ void LastStateImpl::SaveToFileSystem() { const std::vector<uint8_t> char_vector_pdata(styled_string.begin(), styled_string.end()); DCHECK(file_system::CreateDirectoryRecursively(app_storage_folder_)); - SDL_LOG_INFO( - - "LastState::SaveToFileSystem " << app_info_storage_ << styled_string); + SDL_LOG_INFO("LastState::SaveToFileSystem " << app_info_storage_ + << styled_string); DCHECK(file_system::Write(app_info_storage_, char_vector_pdata)); } diff --git a/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h b/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h index 80e11994f1..9d2fb81b49 100644 --- a/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h +++ b/src/components/rpc_base/include/rpc_base/rpc_base_json_inl.h @@ -94,7 +94,7 @@ inline const Json::Value* ValueMember(const Json::Value* value, if (value && value->isObject() && value->isMember(member_name)) { return &(*value)[member_name]; } - return NULL; + return nullptr; } template <class T> diff --git a/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h b/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h index ae0866705a..f170ef90a7 100644 --- a/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h +++ b/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h @@ -39,7 +39,6 @@ class CryptoManagerSettingsImpl : public CryptoManagerSettings { } SDL_LOG_ERROR( - "Unknown protocol: " << profile_.security_manager_protocol_name()); return static_cast<security_manager::Protocol>(-1); } diff --git a/src/components/security_manager/src/crypto_manager_impl.cc b/src/components/security_manager/src/crypto_manager_impl.cc index 9ee820b19d..b4b4d01485 100644 --- a/src/components/security_manager/src/crypto_manager_impl.cc +++ b/src/components/security_manager/src/crypto_manager_impl.cc @@ -154,9 +154,8 @@ bool CryptoManagerImpl::Init() { } SDL_LOG_DEBUG("Peer verification " << (get_settings().verify_peer() ? "enabled" : "disabled")); - SDL_LOG_DEBUG( - - "CA certificate file is \"" << get_settings().ca_cert_path() << '"'); + SDL_LOG_DEBUG("CA certificate file is \"" << get_settings().ca_cert_path() + << '"'); #if OPENSSL_VERSION_NUMBER < CONST_SSL_METHOD_MINIMAL_VERSION SSL_METHOD* method; @@ -338,10 +337,16 @@ bool CryptoManagerImpl::IsCertificateUpdateRequired( const double seconds = difftime(certificates_time, system_time); - SDL_LOG_DEBUG( - "Certificate UTC time: " << asctime(gmtime(&certificates_time))); + const size_t maxsize = 40; + char certificate_utc_time[maxsize]; + std::strftime( + certificate_utc_time, maxsize, "%c", gmtime(&certificates_time)); + SDL_LOG_DEBUG("Certificate UTC time: " << certificate_utc_time); + + char host_utc_time[maxsize]; + std::strftime(host_utc_time, maxsize, "%c", gmtime(&system_time)); + SDL_LOG_DEBUG("Host UTC time: " << host_utc_time); - SDL_LOG_DEBUG("Host UTC time: " << asctime(gmtime(&system_time))); SDL_LOG_DEBUG("Seconds before expiration: " << seconds); if (seconds < 0) { SDL_LOG_WARN("Certificate is already expired."); @@ -381,9 +386,8 @@ bool CryptoManagerImpl::SaveCertificateData( UNUSED(cert_guard); if (1 != BIO_reset(bio_cert)) { - SDL_LOG_WARN( - - "Unabled to reset BIO in order to read private key, " << LastError()); + SDL_LOG_WARN("Unabled to reset BIO in order to read private key, " + << LastError()); } EVP_PKEY* pkey = NULL; diff --git a/src/components/security_manager/src/security_manager_impl.cc b/src/components/security_manager/src/security_manager_impl.cc index 50a58e0486..1bf10c4f7c 100644 --- a/src/components/security_manager/src/security_manager_impl.cc +++ b/src/components/security_manager/src/security_manager_impl.cc @@ -516,9 +516,8 @@ bool SecurityManagerImpl::ProcessHandshakeData( const uint32_t seqNumber = inMessage->get_header().seq_number; const uint32_t connection_key = inMessage->get_connection_key(); - SDL_LOG_DEBUG( - - "Received " << inMessage->get_data_size() << " bytes handshake data "); + SDL_LOG_DEBUG("Received " << inMessage->get_data_size() + << " bytes handshake data "); if (!inMessage->get_data_size()) { const std::string error_text("SendHandshakeData: null arguments size."); diff --git a/src/components/security_manager/test/security_query_matcher.cc b/src/components/security_manager/test/security_query_matcher.cc index 1bf22bf8cd..b9a4f83b10 100644 --- a/src/components/security_manager/test/security_query_matcher.cc +++ b/src/components/security_manager/test/security_query_matcher.cc @@ -90,15 +90,12 @@ MATCHER_P(InternalErrorWithErrId, } // namespace security_manager_test } // namespace components } // namespace test - /* - * Matcher for checking QueryHeader equal in GTests - */ -::testing::AssertionResult QueryHeader_EQ( - const char* m_expr, - const char* n_expr, - const ::security_manager::SecurityQuery::QueryHeader& q1, - const ::security_manager::SecurityQuery::QueryHeader& q2); +#ifdef BUILD_TESTS +/* + * Matcher for checking QueryHeader equal in GTests + */ +// cppcheck-suppress unusedFunction //Used in unit tests ::testing::AssertionResult QueryHeader_EQ( const char* m_expr, const char* n_expr, @@ -121,3 +118,4 @@ MATCHER_P(InternalErrorWithErrId, << ", seq_number_2=" << q2.seq_number; return ::testing::AssertionSuccess(); } +#endif // BUILD_TESTS diff --git a/src/components/smart_objects/src/object_schema_item.cc b/src/components/smart_objects/src/object_schema_item.cc index 7e5c49bae0..920d548c48 100644 --- a/src/components/smart_objects/src/object_schema_item.cc +++ b/src/components/smart_objects/src/object_schema_item.cc @@ -146,7 +146,7 @@ errors::eType CObjectSchemaItem::validate( } const SmartObject& field = object.getElement(key); - errors::eType result = errors::OK; + errors::eType result; // Check if MessageVersion matches schema version if (correct_member) { result = diff --git a/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc b/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc index 555239c489..1ce383e44d 100644 --- a/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc +++ b/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc @@ -270,367 +270,279 @@ class SmartObjectConvertionTimeTest : public ::testing::Test { return CSmartSchema(CObjectSchemaItem::create(rootMembersMap)); } - // Create SmartObjectSchema for test object - CSmartSchema initObjectSchema() { - std::set<TestType::eType> resultCode_allowedEnumSubsetValues; - resultCode_allowedEnumSubsetValues.insert( - TestType::APPLICATION_NOT_REGISTERED); - resultCode_allowedEnumSubsetValues.insert(TestType::SUCCESS); - resultCode_allowedEnumSubsetValues.insert( - TestType::TOO_MANY_PENDING_REQUESTS); - resultCode_allowedEnumSubsetValues.insert(TestType::REJECTED); - resultCode_allowedEnumSubsetValues.insert(TestType::INVALID_DATA); - resultCode_allowedEnumSubsetValues.insert(TestType::OUT_OF_MEMORY); - resultCode_allowedEnumSubsetValues.insert(TestType::ABORTED); - resultCode_allowedEnumSubsetValues.insert(TestType::USER_DISALLOWED); - resultCode_allowedEnumSubsetValues.insert(TestType::GENERIC_ERROR); - resultCode_allowedEnumSubsetValues.insert(TestType::DISALLOWED); - - std::set<FunctionIdTest::eType> functionId_allowedEnumSubsetValues; - functionId_allowedEnumSubsetValues.insert( - FunctionIdTest::RegisterAppInterface); - functionId_allowedEnumSubsetValues.insert( - FunctionIdTest::UnregisterAppInterface); - functionId_allowedEnumSubsetValues.insert( - FunctionIdTest::SetGlobalProperties); - - std::set<MessageTypeTest::eType> messageType_allowedEnumSubsetValues; - messageType_allowedEnumSubsetValues.insert(MessageTypeTest::request); - messageType_allowedEnumSubsetValues.insert(MessageTypeTest::response); - messageType_allowedEnumSubsetValues.insert(MessageTypeTest::notification); - - ISchemaItemPtr success_SchemaItem = - CBoolSchemaItem::create(TSchemaItemParameter<bool>()); - - ISchemaItemPtr resultCode_SchemaItem = - TEnumSchemaItem<TestType::eType>::create( - resultCode_allowedEnumSubsetValues, - TSchemaItemParameter<TestType::eType>()); - - ISchemaItemPtr info_SchemaItem = - CStringSchemaItem::create(TSchemaItemParameter<size_t>(0), - TSchemaItemParameter<size_t>(1000), - TSchemaItemParameter<std::string>()); - - ISchemaItemPtr tryAgainTime_SchemaItem = - TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(0), - TSchemaItemParameter<int>(2000000000), - TSchemaItemParameter<int>()); - - std::map<std::string, SMember> schemaMembersMap; - - schemaMembersMap["success"] = SMember(success_SchemaItem, true); - schemaMembersMap["resultCode"] = SMember(resultCode_SchemaItem, true); - schemaMembersMap["info"] = SMember(info_SchemaItem, false); - schemaMembersMap["tryAgainTime"] = SMember(tryAgainTime_SchemaItem, true); - - std::map<std::string, SMember> paramsMembersMap; - paramsMembersMap - [ns_smart_device_link::ns_json_handler::strings::S_FUNCTION_ID] = - SMember(TEnumSchemaItem<FunctionIdTest::eType>::create( - functionId_allowedEnumSubsetValues), - true); - paramsMembersMap - [ns_smart_device_link::ns_json_handler::strings::S_MESSAGE_TYPE] = - SMember(TEnumSchemaItem<MessageTypeTest::eType>::create( - messageType_allowedEnumSubsetValues), - true); - paramsMembersMap - [ns_smart_device_link::ns_json_handler::strings::S_CORRELATION_ID] = - SMember(TNumberSchemaItem<int>::create(), true); - paramsMembersMap - [ns_smart_device_link::ns_json_handler::strings::S_PROTOCOL_VERSION] = - SMember( - TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1), - TSchemaItemParameter<int>(2)), - true); - paramsMembersMap - [ns_smart_device_link::ns_json_handler::strings::S_PROTOCOL_TYPE] = - SMember(TNumberSchemaItem<int>::create(), true); - - std::map<std::string, SMember> rootMembersMap; - rootMembersMap - [ns_smart_device_link::ns_json_handler::strings::S_MSG_PARAMS] = - SMember(CObjectSchemaItem::create(schemaMembersMap), true); - rootMembersMap[ns_smart_device_link::ns_json_handler::strings::S_PARAMS] = - SMember(CObjectSchemaItem::create(paramsMembersMap), true); - return CSmartSchema(CObjectSchemaItem::create(rootMembersMap)); + TEST_F(SmartObjectConvertionTimeTest, test_int_object_convertion) { + SmartObject srcObj, dstObj; + CSmartSchema schema = initObjectSchema(); + + srcObj.setSchema(schema); + dstObj.setSchema(schema); + + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1; + srcObj[S_MSG_PARAMS]["value"] = 5; + + printf("\n INT value.\n"); + calculateConvertionTime(srcObj, dstObj); } -}; -TEST_F(SmartObjectConvertionTimeTest, test_int_object_convertion) { - SmartObject srcObj, dstObj; - CSmartSchema schema = initObjectSchema(); + TEST_F(SmartObjectConvertionTimeTest, test_double_object_convertion) { + SmartObject srcObj, dstObj; + CSmartSchema schema = initObjectSchema(); + + srcObj.setSchema(schema); + dstObj.setSchema(schema); + + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["value1"] = 3.1415926; + srcObj[S_MSG_PARAMS]["value2"] = 32.6; + srcObj[S_MSG_PARAMS]["value3"] = 33.945; + srcObj[S_MSG_PARAMS]["value4"] = -12.5487698; + srcObj[S_MSG_PARAMS]["value5"] = 0.61287346; + + printf("\n Double value.\n"); + calculateConvertionTime(srcObj, dstObj); + } - srcObj.setSchema(schema); - dstObj.setSchema(schema); + TEST_F(SmartObjectConvertionTimeTest, test_some_object_convertion) { + SmartObject srcObj, dstObj; + CSmartSchema schema = initObjectSchema(); + + srcObj.setSchema(schema); + dstObj.setSchema(schema); + + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["appId"] = "APP ID"; + srcObj[S_MSG_PARAMS]["appName"] = "APP NAME"; + srcObj[S_MSG_PARAMS]["appType"][0] = "SYSTEM"; + srcObj[S_MSG_PARAMS]["appType"][1] = "COMMUNICATION"; + srcObj[S_MSG_PARAMS]["hmiDisplayLanguageDesired"] = "RU-RU"; + srcObj[S_MSG_PARAMS]["isMediaApplication"] = true; + srcObj[S_MSG_PARAMS]["languageDesired"] = "EN-US"; + srcObj[S_MSG_PARAMS]["ngnMediaScreenAppName"] = "SCREEN NAME"; + srcObj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"] = 2; + srcObj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"] = 10; + srcObj[S_MSG_PARAMS]["syncMsgVersion"]["patchVersion"] = 5; + + srcObj[S_MSG_PARAMS]["ttsName"][0]["text"] = "ABC"; + srcObj[S_MSG_PARAMS]["ttsName"][0]["type"] = "TEXT"; + srcObj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym1"; + srcObj[S_MSG_PARAMS]["vrSynonyms"][1] = "Synonym2"; + srcObj[S_MSG_PARAMS]["null"] = SmartObject(); + srcObj[S_MSG_PARAMS]["double"] = -0.1234; + + printf("\n Random object.\n"); + calculateConvertionTime(srcObj, dstObj); + } - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1; - srcObj[S_MSG_PARAMS]["value"] = 5; + TEST_F(SmartObjectConvertionTimeTest, test_map_object_convertion) { + SmartObject srcObj, dstObj, mapObj, innerObj; + CSmartSchema schema = initObjectSchema(); + + srcObj.setSchema(schema); + dstObj.setSchema(schema); + + // First iteration + mapObj["request"]["name"] = "My Request"; + mapObj["request"]["id"] = 123; + mapObj["response"]["name"] = "My Response"; + mapObj["response"]["id"] = 456; + mapObj["we"]["need"]["to"]["go"]["deeper"] = true; + + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["value"] = mapObj; + + printf("\n MAP object.\n"); + calculateConvertionTime(srcObj, dstObj); + + // Second iteration + innerObj = mapObj; + mapObj["request"]["value"] = innerObj; + mapObj["response"]["value"] = innerObj; + mapObj["we"]["need"]["to"]["go"]["deeper"]["value"] = innerObj; + srcObj[S_MSG_PARAMS]["value"] = mapObj; + + printf("\n Complex MAP object.\n"); + calculateConvertionTime(srcObj, dstObj); + + // Third iteration + innerObj = mapObj; + mapObj["request"]["value"] = innerObj; + mapObj["response"]["value"] = innerObj; + mapObj["we"]["need"]["to"]["go"]["deeper"]["value"] = innerObj; + srcObj[S_MSG_PARAMS]["value"] = mapObj; + + printf("\n Very Complex MAP object.\n"); + calculateConvertionTime(srcObj, dstObj); + + // Last iteration + innerObj = mapObj; + mapObj["request"]["value"] = innerObj; + mapObj["response"]["value"] = innerObj; + mapObj["we"]["need"]["to"]["go"]["deeper"]["value"] = innerObj; + srcObj[S_MSG_PARAMS]["value"] = mapObj; + + printf("\n Very Very Complex MAP object.\n"); + calculateConvertionTime(srcObj, dstObj); + } - printf("\n INT value.\n"); - calculateConvertionTime(srcObj, dstObj); -} + TEST_F(SmartObjectConvertionTimeTest, test_array_convertion) { + SmartObject srcObj, dstObj, arrayObj, innerObj; + CSmartSchema schema = initObjectSchema(); + int arraySize = 10; -TEST_F(SmartObjectConvertionTimeTest, test_double_object_convertion) { - SmartObject srcObj, dstObj; - CSmartSchema schema = initObjectSchema(); - - srcObj.setSchema(schema); - dstObj.setSchema(schema); - - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["value1"] = 3.1415926; - srcObj[S_MSG_PARAMS]["value2"] = 32.6; - srcObj[S_MSG_PARAMS]["value3"] = 33.945; - srcObj[S_MSG_PARAMS]["value4"] = -12.5487698; - srcObj[S_MSG_PARAMS]["value5"] = 0.61287346; - - printf("\n Double value.\n"); - calculateConvertionTime(srcObj, dstObj); -} + srcObj.setSchema(schema); + dstObj.setSchema(schema); -TEST_F(SmartObjectConvertionTimeTest, test_some_object_convertion) { - SmartObject srcObj, dstObj; - CSmartSchema schema = initObjectSchema(); - - srcObj.setSchema(schema); - dstObj.setSchema(schema); - - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["appId"] = "APP ID"; - srcObj[S_MSG_PARAMS]["appName"] = "APP NAME"; - srcObj[S_MSG_PARAMS]["appType"][0] = "SYSTEM"; - srcObj[S_MSG_PARAMS]["appType"][1] = "COMMUNICATION"; - srcObj[S_MSG_PARAMS]["hmiDisplayLanguageDesired"] = "RU-RU"; - srcObj[S_MSG_PARAMS]["isMediaApplication"] = true; - srcObj[S_MSG_PARAMS]["languageDesired"] = "EN-US"; - srcObj[S_MSG_PARAMS]["ngnMediaScreenAppName"] = "SCREEN NAME"; - srcObj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"] = 2; - srcObj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"] = 10; - srcObj[S_MSG_PARAMS]["syncMsgVersion"]["patchVersion"] = 5; - - srcObj[S_MSG_PARAMS]["ttsName"][0]["text"] = "ABC"; - srcObj[S_MSG_PARAMS]["ttsName"][0]["type"] = "TEXT"; - srcObj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym1"; - srcObj[S_MSG_PARAMS]["vrSynonyms"][1] = "Synonym2"; - srcObj[S_MSG_PARAMS]["null"] = SmartObject(); - srcObj[S_MSG_PARAMS]["double"] = -0.1234; - - printf("\n Random object.\n"); - calculateConvertionTime(srcObj, dstObj); -} + // First iteration + for (int i = 0; i < arraySize; i++) { + arrayObj[i] = rand(); + } -TEST_F(SmartObjectConvertionTimeTest, test_map_object_convertion) { - SmartObject srcObj, dstObj, mapObj, innerObj; - CSmartSchema schema = initObjectSchema(); - - srcObj.setSchema(schema); - dstObj.setSchema(schema); - - // First iteration - mapObj["request"]["name"] = "My Request"; - mapObj["request"]["id"] = 123; - mapObj["response"]["name"] = "My Response"; - mapObj["response"]["id"] = 456; - mapObj["we"]["need"]["to"]["go"]["deeper"] = true; - - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["value"] = mapObj; - - printf("\n MAP object.\n"); - calculateConvertionTime(srcObj, dstObj); - - // Second iteration - innerObj = mapObj; - mapObj["request"]["value"] = innerObj; - mapObj["response"]["value"] = innerObj; - mapObj["we"]["need"]["to"]["go"]["deeper"]["value"] = innerObj; - srcObj[S_MSG_PARAMS]["value"] = mapObj; - - printf("\n Complex MAP object.\n"); - calculateConvertionTime(srcObj, dstObj); - - // Third iteration - innerObj = mapObj; - mapObj["request"]["value"] = innerObj; - mapObj["response"]["value"] = innerObj; - mapObj["we"]["need"]["to"]["go"]["deeper"]["value"] = innerObj; - srcObj[S_MSG_PARAMS]["value"] = mapObj; - - printf("\n Very Complex MAP object.\n"); - calculateConvertionTime(srcObj, dstObj); - - // Last iteration - innerObj = mapObj; - mapObj["request"]["value"] = innerObj; - mapObj["response"]["value"] = innerObj; - mapObj["we"]["need"]["to"]["go"]["deeper"]["value"] = innerObj; - srcObj[S_MSG_PARAMS]["value"] = mapObj; - - printf("\n Very Very Complex MAP object.\n"); - calculateConvertionTime(srcObj, dstObj); -} + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["array"] = arrayObj; + + printf("\n Array object [%d].\n", arraySize); + calculateConvertionTime(srcObj, dstObj); + + // Second iteration + printf("\n Array object [%d x %d].\n", arraySize, arraySize); + innerObj = arrayObj; + for (int i = 0; i < arraySize; i++) { + arrayObj[i] = innerObj; + } -TEST_F(SmartObjectConvertionTimeTest, test_array_convertion) { - SmartObject srcObj, dstObj, arrayObj, innerObj; - CSmartSchema schema = initObjectSchema(); - int arraySize = 10; + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["array"] = arrayObj; - srcObj.setSchema(schema); - dstObj.setSchema(schema); + calculateConvertionTime(srcObj, dstObj); - // First iteration - for (int i = 0; i < arraySize; i++) { - arrayObj[i] = rand(); - } + // Third iteration + printf( + "\n Array object [%d x %d x %d].\n", arraySize, arraySize, arraySize); + innerObj = arrayObj; + for (int i = 0; i < arraySize; i++) { + arrayObj[i] = innerObj; + } - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["array"] = arrayObj; - - printf("\n Array object [%d].\n", arraySize); - calculateConvertionTime(srcObj, dstObj); - - // Second iteration - printf("\n Array object [%d x %d].\n", arraySize, arraySize); - innerObj = arrayObj; - for (int i = 0; i < arraySize; i++) { - arrayObj[i] = innerObj; - } + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["array"] = arrayObj; + + calculateConvertionTime(srcObj, dstObj); + + // Fourth iteration + printf("\n Array object [%d x %d x %d x %d].\n", + arraySize, + arraySize, + arraySize, + arraySize); + innerObj = arrayObj; + for (int i = 0; i < arraySize; i++) { + arrayObj[i] = innerObj; + } - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["array"] = arrayObj; + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["array"] = arrayObj; + + calculateConvertionTime(srcObj, dstObj); + + // Last iteration + printf("\n Array object [%d x %d x %d x %d x %d].\n", + arraySize, + arraySize, + arraySize, + arraySize, + arraySize); + innerObj = arrayObj; + for (int i = 0; i < arraySize; i++) { + arrayObj[i] = innerObj; + } - calculateConvertionTime(srcObj, dstObj); + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["array"] = arrayObj; - // Third iteration - printf("\n Array object [%d x %d x %d].\n", arraySize, arraySize, arraySize); - innerObj = arrayObj; - for (int i = 0; i < arraySize; i++) { - arrayObj[i] = innerObj; + calculateConvertionTime(srcObj, dstObj); } - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["array"] = arrayObj; - - calculateConvertionTime(srcObj, dstObj); - - // Fourth iteration - printf("\n Array object [%d x %d x %d x %d].\n", - arraySize, - arraySize, - arraySize, - arraySize); - innerObj = arrayObj; - for (int i = 0; i < arraySize; i++) { - arrayObj[i] = innerObj; + TEST_F(SmartObjectConvertionTimeTest, test_object_with_enum_convertion) { + SmartObject srcObj, dstObj; + CSmartSchema schema = initObjectSchema(); + + srcObj.setSchema(schema); + dstObj.setSchema(schema); + + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["success"] = true; + srcObj[S_MSG_PARAMS]["resultCode"] = 2; + srcObj[S_MSG_PARAMS]["info"] = "Some string"; + srcObj[S_MSG_PARAMS]["tryAgainTime"] = 322; + srcObj.setSchema(schema); + + printf("\n Object with enum.\n"); + calculateConvertionTime(srcObj, dstObj); } - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["array"] = arrayObj; - - calculateConvertionTime(srcObj, dstObj); - - // Last iteration - printf("\n Array object [%d x %d x %d x %d x %d].\n", - arraySize, - arraySize, - arraySize, - arraySize, - arraySize); - innerObj = arrayObj; - for (int i = 0; i < arraySize; i++) { - arrayObj[i] = innerObj; + TEST_F(SmartObjectConvertionTimeTest, test_object_without_enum_convertion) { + SmartObject srcObj, dstObj; + CSmartSchema schema = initObjectSchema(); + + srcObj.setSchema(schema); + dstObj.setSchema(schema); + + srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; + srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; + srcObj[S_PARAMS][S_CORRELATION_ID] = 13; + srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; + srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; + srcObj[S_MSG_PARAMS]["success"] = true; + srcObj[S_MSG_PARAMS]["resultCode"] = 2; + srcObj[S_MSG_PARAMS]["info"] = "Some string"; + srcObj[S_MSG_PARAMS]["tryAgainTime"] = 322; + + printf("\n Object without enum.\n"); + calculateConvertionTime(srcObj, dstObj); } - - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["array"] = arrayObj; - - calculateConvertionTime(srcObj, dstObj); -} - -TEST_F(SmartObjectConvertionTimeTest, test_object_with_enum_convertion) { - SmartObject srcObj, dstObj; - CSmartSchema schema = initObjectSchema(); - - srcObj.setSchema(schema); - dstObj.setSchema(schema); - - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["success"] = true; - srcObj[S_MSG_PARAMS]["resultCode"] = 2; - srcObj[S_MSG_PARAMS]["info"] = "Some string"; - srcObj[S_MSG_PARAMS]["tryAgainTime"] = 322; - srcObj.setSchema(schema); - - printf("\n Object with enum.\n"); - calculateConvertionTime(srcObj, dstObj); -} - -TEST_F(SmartObjectConvertionTimeTest, test_object_without_enum_convertion) { - SmartObject srcObj, dstObj; - CSmartSchema schema = initObjectSchema(); - - srcObj.setSchema(schema); - dstObj.setSchema(schema); - - srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request; - srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::RegisterAppInterface; - srcObj[S_PARAMS][S_CORRELATION_ID] = 13; - srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0; - srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2; - srcObj[S_MSG_PARAMS]["success"] = true; - srcObj[S_MSG_PARAMS]["resultCode"] = 2; - srcObj[S_MSG_PARAMS]["info"] = "Some string"; - srcObj[S_MSG_PARAMS]["tryAgainTime"] = 322; - - printf("\n Object without enum.\n"); - calculateConvertionTime(srcObj, dstObj); -} - +}; } // namespace smart_object_test } // namespace components -} // namespace test namespace ns_smart_device_link { namespace ns_smart_objects { diff --git a/src/components/telemetry_monitor/src/protocol_handler_observer.cc b/src/components/telemetry_monitor/src/protocol_handler_observer.cc index 7752e6fb94..9a89973e82 100644 --- a/src/components/telemetry_monitor/src/protocol_handler_observer.cc +++ b/src/components/telemetry_monitor/src/protocol_handler_observer.cc @@ -50,7 +50,6 @@ void ProtocolHandlerObserver::StartMessageProcess( } if (time_starts.find(message_id) != time_starts.end()) { SDL_LOG_DEBUG( - "Already waiting for stop processing for Message ID: " << message_id); return; } diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h index 9eea8389e6..30ecf1a277 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h @@ -37,6 +37,9 @@ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_CLIENT_LISTENER_H_ #include "transport_manager/transport_adapter/client_connection_listener.h" + +#include <atomic> + #include "utils/lock.h" #include "utils/threads/thread_delegate.h" @@ -149,8 +152,8 @@ class TcpClientListener : public ClientConnectionListener { bool started_; threads::Thread* thread_; int socket_; - bool thread_stop_requested_; - bool remove_devices_on_terminate_; + std::atomic_bool thread_stop_requested_; + std::atomic_bool remove_devices_on_terminate_; int pipe_fds_[2]; NetworkInterfaceListener* interface_listener_; const std::string designated_interface_; diff --git a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h index 0fb9c599c7..4d0fa70f70 100644 --- a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h +++ b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h @@ -86,7 +86,7 @@ class UsbConnection : public Connection { std::list<protocol_handler::RawMessagePtr> out_messages_; protocol_handler::RawMessagePtr current_out_message_; - sync_primitives::Lock out_messages_mutex_; + sync_primitives::RecursiveLock out_messages_mutex_; size_t bytes_sent_; bool disconnecting_; bool waiting_in_transfer_cancel_; diff --git a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h index 9c16b49df6..eabb902379 100644 --- a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h +++ b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h @@ -37,6 +37,7 @@ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_USB_LIBUSB_USB_HANDLER_H_ #include <libusb-1.0/libusb.h> +#include <atomic> #include "transport_manager/transport_adapter/transport_adapter.h" #include "transport_manager/usb/libusb/platform_usb_device.h" @@ -71,6 +72,11 @@ class UsbHandler { void SubmitControlTransfer(ControlTransferSequenceState* sequence_state); friend void UsbTransferSequenceCallback(libusb_transfer* transfer); + void RequestStopThread(); + void DeregisterHotplugCallbacks(); + void JoinAndDeleteThread(); + void InvokeLibusbExit(); + private: class UsbHandlerDelegate : public threads::ThreadDelegate { public: @@ -82,7 +88,7 @@ class UsbHandler { UsbHandler* handler_; }; - bool shutdown_requested_; + std::atomic<bool> shutdown_requested_; threads::Thread* thread_; friend class UsbDeviceListener; diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device.cc index 91f561a7d9..5e19e32ea3 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device.cc @@ -69,7 +69,6 @@ bool BluetoothDevice::GetRfcommChannel(const ApplicationHandle app_handle, std::find(rfcomm_channels_.begin(), rfcomm_channels_.end(), channel); if (it == rfcomm_channels_.end()) { SDL_LOG_TRACE( - "exit with FALSE. Condition: channel not found in RfcommChannelVector"); return false; } diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc index b527bf1ef0..87012c0690 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc @@ -92,9 +92,8 @@ bool BluetoothSocketConnection::Establish(ConnectError** error) { do { rfcomm_socket = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); if (-1 == rfcomm_socket) { - SDL_LOG_ERROR_WITH_ERRNO( - - "Failed to create RFCOMM socket for device " << device_handle()); + SDL_LOG_ERROR_WITH_ERRNO("Failed to create RFCOMM socket for device " + << device_handle()); *error = new ConnectError(); SDL_LOG_TRACE("exit with FALSE"); return false; @@ -117,7 +116,6 @@ bool BluetoothSocketConnection::Establish(ConnectError** error) { SDL_LOG_INFO("rfcomm Connect attempts finished"); if (0 != connect_status) { SDL_LOG_DEBUG( - "Failed to Connect to remote device " << BluetoothDevice::GetUniqueDeviceId(remoteSocketAddress.rc_bdaddr) << " for session " << this); diff --git a/src/components/transport_manager/src/cloud/cloud_websocket_connection_factory.cc b/src/components/transport_manager/src/cloud/cloud_websocket_connection_factory.cc index a5d25c56c1..27e14b4d33 100644 --- a/src/components/transport_manager/src/cloud/cloud_websocket_connection_factory.cc +++ b/src/components/transport_manager/src/cloud/cloud_websocket_connection_factory.cc @@ -67,7 +67,6 @@ TransportAdapter::Error CloudWebsocketConnectionFactory::CreateConnection( TransportAdapter::Error error = ws_connection->Start(); if (TransportAdapter::OK != error) { SDL_LOG_ERROR( - "Cloud Websocket connection::Start() failed with error: " << error); } return error; diff --git a/src/components/transport_manager/src/cloud/websocket_client_connection.cc b/src/components/transport_manager/src/cloud/websocket_client_connection.cc index f6b791f886..b190e73cb6 100644 --- a/src/components/transport_manager/src/cloud/websocket_client_connection.cc +++ b/src/components/transport_manager/src/cloud/websocket_client_connection.cc @@ -95,7 +95,6 @@ TransportAdapter::Error WebsocketClientConnection::Start() { SDL_LOG_DEBUG( "Cloud app authentication token: " << cloud_properties.auth_token); SDL_LOG_DEBUG( - "Cloud app transport type: " << cloud_properties.cloud_transport_type); SDL_LOG_DEBUG("Cloud app hybrid app preference: " << cloud_properties.hybrid_app_preference); @@ -163,9 +162,8 @@ TransportAdapter::Error WebsocketClientConnection::Start() { #endif // ENABLE_SECURITY if (ec) { std::string str_err = "ErrorMessage: " + ec.message(); - SDL_LOG_ERROR( - - "Could not complete handshake with host/port: " << host << ":" << port); + SDL_LOG_ERROR("Could not complete handshake with host/port: " << host << ":" + << port); SDL_LOG_ERROR(str_err); return TransportAdapter::FAIL; } @@ -202,9 +200,8 @@ TransportAdapter::Error WebsocketClientConnection::Start() { boost::asio::post(io_pool_, [&]() { ioc_.run(); }); - SDL_LOG_DEBUG( - - "Successfully started websocket connection @: " << host << ":" << port); + SDL_LOG_DEBUG("Successfully started websocket connection @: " << host << ":" + << port); return TransportAdapter::OK; } @@ -248,7 +245,6 @@ void WebsocketClientConnection::OnRead(boost::system::error_code ec, Shutdown(); return; } - std::string data_str = boost::beast::buffers_to_string(buffer_.data()); ssize_t size = (ssize_t)buffer_.size(); const uint8_t* data = boost::asio::buffer_cast<const uint8_t*>( diff --git a/src/components/transport_manager/src/tcp/platform_specific/linux/platform_specific_network_interface_listener.cc b/src/components/transport_manager/src/tcp/platform_specific/linux/platform_specific_network_interface_listener.cc index 8da69b5f6b..96ea5df917 100644 --- a/src/components/transport_manager/src/tcp/platform_specific/linux/platform_specific_network_interface_listener.cc +++ b/src/components/transport_manager/src/tcp/platform_specific/linux/platform_specific_network_interface_listener.cc @@ -417,17 +417,15 @@ bool PlatformSpecificNetworkInterfaceListener::UpdateStatus( switch (type) { case RTM_NEWLINK: { const std::string& ifname = GetInterfaceName(it->if_index); - SDL_LOG_DEBUG( - - "netlink event: interface " << ifname << " created or updated"); + SDL_LOG_DEBUG("netlink event: interface " << ifname + << " created or updated"); status.SetName(ifname); status.SetFlags(it->flags); break; } case RTM_DELLINK: - SDL_LOG_DEBUG( - - "netlink event: interface " << status.GetName() << " removed"); + SDL_LOG_DEBUG("netlink event: interface " << status.GetName() + << " removed"); status_table_.erase(it->if_index); break; case RTM_NEWADDR: { diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc index 0812cd39c9..6aaec5d659 100644 --- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc +++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc @@ -97,7 +97,7 @@ TcpClientListener::TcpClientListener(TransportAdapterController* controller, TransportAdapter::Error TcpClientListener::Init() { SDL_LOG_AUTO_TRACE(); - thread_stop_requested_ = false; + thread_stop_requested_.store(false); if (!IsListeningOnSpecificInterface()) { // Network interface is not specified. We will listen on all interfaces @@ -163,9 +163,13 @@ TcpClientListener::~TcpClientListener() { void SetKeepaliveOptions(const int fd) { SDL_LOG_AUTO_TRACE(); SDL_LOG_DEBUG("fd: " << fd); + // cppcheck-suppress unreadVariable int yes = 1; + // cppcheck-suppress unreadVariable int keepidle = 3; // 3 seconds to disconnection detecting + // cppcheck-suppress unreadVariable int keepcnt = 5; + // cppcheck-suppress unreadVariable int keepintvl = 1; #ifdef __linux__ int user_timeout = 7000; // milliseconds @@ -248,7 +252,6 @@ void TcpClientListener::Loop() { if (ret < 0) { if (errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) { SDL_LOG_WARN( - "Failed to read from pipe, aborting TCP server socket loop."); break; } @@ -343,7 +346,7 @@ void TcpClientListener::StopLoop() { return; } - thread_stop_requested_ = true; + thread_stop_requested_.store(true); char dummy[1] = {0}; int ret = write(pipe_fds_[1], dummy, sizeof(dummy)); @@ -459,7 +462,7 @@ TransportAdapter::Error TcpClientListener::StartListeningThread() { } } - thread_stop_requested_ = false; + thread_stop_requested_.store(false); if (!thread_->Start()) { return TransportAdapter::FAIL; @@ -493,9 +496,8 @@ void TcpClientListener::OnIPAddressUpdated(const std::string ipv4_addr, if (IsListeningOnSpecificInterface()) { if (!current_ip_address_.empty()) { // the server socket is running, terminate it - SDL_LOG_DEBUG( - - "Stopping current TCP server socket on " << designated_interface_); + SDL_LOG_DEBUG("Stopping current TCP server socket on " + << designated_interface_); StopOnNetworkInterface(); } if (!ipv4_addr.empty()) { @@ -538,7 +540,7 @@ bool TcpClientListener::StartOnNetworkInterface() { } } - remove_devices_on_terminate_ = true; + remove_devices_on_terminate_.store(true); if (TransportAdapter::OK != StartListeningThread()) { SDL_LOG_WARN("Failed to start TCP client listener"); @@ -564,7 +566,7 @@ bool TcpClientListener::StopOnNetworkInterface() { socket_ = -1; } - remove_devices_on_terminate_ = false; + remove_devices_on_terminate_.store(false); SDL_LOG_INFO("TCP server socket on " << designated_interface_ << " stopped"); diff --git a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc index 42da741611..5b02c3907e 100644 --- a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc +++ b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc @@ -52,9 +52,8 @@ TransportAdapter::Error TcpConnectionFactory::Init() { TransportAdapter::Error TcpConnectionFactory::CreateConnection( const DeviceUID& device_uid, const ApplicationHandle& app_handle) { SDL_LOG_AUTO_TRACE(); - SDL_LOG_DEBUG( - - "DeviceUID: " << &device_uid << ", ApplicationHandle: " << &app_handle); + SDL_LOG_DEBUG("DeviceUID: " << &device_uid + << ", ApplicationHandle: " << &app_handle); std::shared_ptr<TcpServerOriginatedSocketConnection> connection = std::make_shared<TcpServerOriginatedSocketConnection>( device_uid, app_handle, controller_); diff --git a/src/components/transport_manager/src/tcp/tcp_device.cc b/src/components/transport_manager/src/tcp/tcp_device.cc index bccafd934f..6d0b87ea6c 100644 --- a/src/components/transport_manager/src/tcp/tcp_device.cc +++ b/src/components/transport_manager/src/tcp/tcp_device.cc @@ -56,9 +56,8 @@ TcpDevice::TcpDevice(const in_addr_t& in_addr, , last_handle_(0) { SDL_LOG_AUTO_TRACE(); SDL_LOG_DEBUG("Device created with transport switch emulation support."); - SDL_LOG_DEBUG( - - "Device parameters: " << device_uid << " / " << transport_switch_id); + SDL_LOG_DEBUG("Device parameters: " << device_uid << " / " + << transport_switch_id); } #endif // ENABLE_IAP2EMULATION @@ -69,7 +68,6 @@ bool TcpDevice::IsSameAs(const Device* other) const { if (other_tcp_device && other_tcp_device->in_addr_ == in_addr_) { SDL_LOG_TRACE( - "exit with TRUE. Condition: other_tcp_device->in_addr_ == in_addr_"); return true; } else { diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index 7d0eda9773..447aa6c8ff 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -104,16 +104,14 @@ TransportAdapterImpl::~TransportAdapterImpl() { SDL_LOG_DEBUG("device_scanner_ deleted."); } if (server_connection_factory_) { - SDL_LOG_DEBUG( - - "Deleting server_connection_factory " << server_connection_factory_); + SDL_LOG_DEBUG("Deleting server_connection_factory " + << server_connection_factory_); delete server_connection_factory_; SDL_LOG_DEBUG("server_connection_factory deleted."); } if (client_connection_listener_) { - SDL_LOG_DEBUG( - - "Deleting client_connection_listener_ " << client_connection_listener_); + SDL_LOG_DEBUG("Deleting client_connection_listener_ " + << client_connection_listener_); delete client_connection_listener_; SDL_LOG_DEBUG("client_connection_listener_ deleted."); } @@ -200,9 +198,8 @@ TransportAdapter::Error TransportAdapterImpl::SearchDevices() { TransportAdapter::Error TransportAdapterImpl::Connect( const DeviceUID& device_id, const ApplicationHandle& app_handle) { - SDL_LOG_TRACE( - - "enter. DeviceUID " << device_id << " ApplicationHandle " << app_handle); + SDL_LOG_TRACE("enter. DeviceUID " << device_id << " ApplicationHandle " + << app_handle); if (server_connection_factory_ == 0) { SDL_LOG_TRACE("exit with NOT_SUPPORTED"); return NOT_SUPPORTED; @@ -342,9 +339,8 @@ void TransportAdapterImpl::ConnectionStatusUpdated(DeviceSptr device, TransportAdapter::Error TransportAdapterImpl::Disconnect( const DeviceUID& device_id, const ApplicationHandle& app_handle) { - SDL_LOG_TRACE( - - "enter. device_id: " << &device_id << ", device_id: " << &device_id); + SDL_LOG_TRACE("enter. device_id: " << &device_id + << ", device_id: " << &device_id); if (!initialised_) { SDL_LOG_TRACE("exit with BAD_STATE"); return BAD_STATE; @@ -558,13 +554,13 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { bool device_found = false; devices_mutex_.Acquire(); - for (DeviceMap::iterator it = devices_.begin(); it != devices_.end(); - ++it) { - DeviceSptr existing_device = it->second; + for (DeviceMap::iterator iter = devices_.begin(); iter != devices_.end(); + ++iter) { + DeviceSptr existing_device = iter->second; if (device->IsSameAs(existing_device.get())) { existing_device->set_keep_on_disconnect(true); device_found = true; - SDL_LOG_DEBUG("device found. DeviceSptr" << it->second); + SDL_LOG_DEBUG("device found. DeviceSptr" << iter->second); break; } } @@ -745,9 +741,8 @@ void TransportAdapterImpl::DisconnectDone(const DeviceUID& device_handle, SDL_LOG_AUTO_TRACE(); const DeviceUID device_uid = device_handle; const ApplicationHandle app_uid = app_handle; - SDL_LOG_TRACE( - - "enter. device_id: " << &device_uid << ", app_handle: " << &app_uid); + SDL_LOG_TRACE("enter. device_id: " << &device_uid + << ", app_handle: " << &app_uid); DeviceSptr device = FindDevice(device_handle); if (!device) { SDL_LOG_WARN("Device: uid " << &device_uid << " not found"); @@ -867,9 +862,8 @@ void TransportAdapterImpl::DeviceSwitched(const DeviceUID& device_handle) { ConnectionSPtr TransportAdapterImpl::FindPendingConnection( const DeviceUID& device_id, const ApplicationHandle& app_handle) const { - SDL_LOG_TRACE( - - "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); + SDL_LOG_TRACE("enter. device_id: " << &device_id + << ", app_handle: " << &app_handle); ConnectionSPtr connection; connections_lock_.AcquireForReading(); ConnectionMap::const_iterator it = @@ -930,9 +924,8 @@ void TransportAdapterImpl::ConnectPending(const DeviceUID& device_id, void TransportAdapterImpl::ConnectDone(const DeviceUID& device_id, const ApplicationHandle& app_handle) { - SDL_LOG_TRACE( - - "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); + SDL_LOG_TRACE("enter. device_id: " << &device_id + << ", app_handle: " << &app_handle); connections_lock_.AcquireForReading(); ConnectionMap::iterator it_conn = connections_.find(std::make_pair(device_id, app_handle)); @@ -1184,9 +1177,8 @@ bool TransportAdapterImpl::ToBeAutoDisconnected(DeviceSptr device) const { ConnectionSPtr TransportAdapterImpl::FindEstablishedConnection( const DeviceUID& device_id, const ApplicationHandle& app_handle) const { - SDL_LOG_TRACE( - - "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); + SDL_LOG_TRACE("enter. device_id: " << &device_id + << ", app_handle: " << &app_handle); ConnectionSPtr connection; connections_lock_.AcquireForReading(); ConnectionMap::const_iterator it = diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index a0d019cd69..ee6398db44 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -190,7 +190,6 @@ int TransportManagerImpl::ConnectDevice(const DeviceHandle device_handle) { if (!this->is_initialized_) { SDL_LOG_ERROR("TransportManager is not initialized."); SDL_LOG_TRACE( - "exit with E_TM_IS_NOT_INITIALIZED. Condition: !this->is_initialized_"); return E_TM_IS_NOT_INITIALIZED; } @@ -234,7 +233,6 @@ int TransportManagerImpl::DisconnectDevice(const DeviceHandle device_handle) { if (!this->is_initialized_) { SDL_LOG_ERROR("TransportManager is not initialized."); SDL_LOG_TRACE( - "exit with E_TM_IS_NOT_INITIALIZED. Condition: !this->is_initialized_"); return E_TM_IS_NOT_INITIALIZED; } @@ -259,7 +257,6 @@ int TransportManagerImpl::Disconnect(const ConnectionUID cid) { if (!this->is_initialized_) { SDL_LOG_ERROR("TransportManager is not initialized."); SDL_LOG_TRACE( - "exit with E_TM_IS_NOT_INITIALIZED. Condition: !this->is_initialized_"); return E_TM_IS_NOT_INITIALIZED; } @@ -317,7 +314,6 @@ int TransportManagerImpl::DisconnectForce(const ConnectionUID cid) { const ConnectionInternal* connection = GetConnection(cid); if (NULL == connection) { SDL_LOG_ERROR( - "TransportManagerImpl::DisconnectForce: Connection does not exist."); SDL_LOG_TRACE("exit with E_INVALID_HANDLE. Condition: NULL == connection"); return E_INVALID_HANDLE; @@ -411,7 +407,6 @@ int TransportManagerImpl::SendMessageToDevice( if (connection->shutdown_) { SDL_LOG_ERROR( - "TransportManagerImpl::Disconnect: Connection is to shut down."); SDL_LOG_TRACE( "exit with E_CONNECTION_IS_TO_SHUTDOWN. Condition: " @@ -522,7 +517,6 @@ int TransportManagerImpl::SearchDevices() { if (!this->is_initialized_) { SDL_LOG_ERROR("TM is not initialized"); SDL_LOG_TRACE( - "exit with E_TM_IS_NOT_INITIALIZED. Condition: !this->is_initialized_"); return E_TM_IS_NOT_INITIALIZED; } @@ -1005,9 +999,8 @@ bool TransportManagerImpl::UpdateDeviceMapping( item = device_to_adapter_map_.begin(); } - SDL_LOG_DEBUG( - - "After cleanup. Device map size is " << device_to_adapter_map_.size()); + SDL_LOG_DEBUG("After cleanup. Device map size is " + << device_to_adapter_map_.size()); for (DeviceList::const_iterator it = adapter_device_list.begin(); it != adapter_device_list.end(); @@ -1031,9 +1024,8 @@ bool TransportManagerImpl::UpdateDeviceMapping( RaiseEvent(&TransportManagerListener::OnDeviceFound, info); } - SDL_LOG_DEBUG( - - "After update. Device map size is " << device_to_adapter_map_.size()); + SDL_LOG_DEBUG("After update. Device map size is " + << device_to_adapter_map_.size()); return true; } @@ -1386,7 +1378,8 @@ void TransportManagerImpl::Handle(::protocol_handler::RawMessagePtr msg) { } TransportAdapter* transport_adapter = connection->transport_adapter; - if (NULL == transport_adapter) { + + if (nullptr == transport_adapter) { std::string error_text = "Transport adapter is not found"; SDL_LOG_ERROR(error_text); RaiseEvent(&TransportManagerListener::OnTMMessageSendFailed, diff --git a/src/components/transport_manager/src/usb/libusb/usb_connection.cc b/src/components/transport_manager/src/usb/libusb/usb_connection.cc index fbe217f243..278a1b1f05 100644 --- a/src/components/transport_manager/src/usb/libusb/usb_connection.cc +++ b/src/components/transport_manager/src/usb/libusb/usb_connection.cc @@ -108,10 +108,8 @@ bool UsbConnection::PostInTransfer() { const int libusb_ret = libusb_submit_transfer(in_transfer_); if (LIBUSB_SUCCESS != libusb_ret) { SDL_LOG_ERROR( - "libusb_submit_transfer failed: " << libusb_error_name(libusb_ret)); SDL_LOG_TRACE( - "exit with FALSE. Condition: LIBUSB_SUCCESS != libusb_submit_transfer"); return false; } @@ -192,7 +190,6 @@ TransportAdapter::Error UsbConnection::PostOutTransfer() { const int libusb_ret = libusb_submit_transfer(out_transfer_); if (LIBUSB_SUCCESS != libusb_ret) { SDL_LOG_ERROR( - "libusb_submit_transfer failed: " << libusb_error_name(libusb_ret)); SDL_LOG_TRACE("exit with TransportAdapter::FAIL. Condition: " << "LIBUSB_SUCCESS != libusb_fill_bulk_transfer"); @@ -211,7 +208,6 @@ void UsbConnection::OnOutTransfer(libusb_transfer* transfer) { bytes_sent_ += transfer->actual_length; if (current_out_message_->data_size() == bytes_sent_) { SDL_LOG_DEBUG( - "USB out transfer, data sent: " << current_out_message_.get()); controller_->DataSendDone( device_uid_, app_handle_, current_out_message_); @@ -219,7 +215,6 @@ void UsbConnection::OnOutTransfer(libusb_transfer* transfer) { } } else { SDL_LOG_ERROR( - "USB out transfer failed: " << libusb_error_name(transfer->status)); controller_->DataSendFailed( device_uid_, app_handle_, current_out_message_, DataSendError()); diff --git a/src/components/transport_manager/src/usb/libusb/usb_handler.cc b/src/components/transport_manager/src/usb/libusb/usb_handler.cc index c8973dfcc1..3b459eb0af 100644 --- a/src/components/transport_manager/src/usb/libusb/usb_handler.cc +++ b/src/components/transport_manager/src/usb/libusb/usb_handler.cc @@ -89,8 +89,27 @@ UsbHandler::UsbHandler() } UsbHandler::~UsbHandler() { - shutdown_requested_ = true; - SDL_LOG_INFO("UsbHandler thread finished"); + SDL_LOG_AUTO_TRACE(); + + // Notify Thread to stop on next iteration... + RequestStopThread(); + + // ... and unregister hotplug callbacks in order to wake + // libusb_handle_events() + DeregisterHotplugCallbacks(); + + // Now it is safe to join the Thread and free up resources + JoinAndDeleteThread(); + InvokeLibusbExit(); +} + +void UsbHandler::RequestStopThread() { + SDL_LOG_AUTO_TRACE(); + shutdown_requested_.store(true); +} + +void UsbHandler::DeregisterHotplugCallbacks() { + SDL_LOG_AUTO_TRACE(); if (libusb_context_) { // The libusb_hotplug_deregister_callback() wakes up blocking call of @@ -99,10 +118,20 @@ UsbHandler::~UsbHandler() { arrived_callback_handle_); libusb_hotplug_deregister_callback(libusb_context_, left_callback_handle_); } +} + +void UsbHandler::JoinAndDeleteThread() { + SDL_LOG_AUTO_TRACE(); + // Let thread finish on its own thread_->Stop(threads::Thread::kThreadSoftStop); delete thread_->GetDelegate(); threads::DeleteThread(thread_); + SDL_LOG_INFO("UsbHandler thread finished"); +} + +void UsbHandler::InvokeLibusbExit() { + SDL_LOG_AUTO_TRACE(); if (libusb_context_) { libusb_exit(libusb_context_); @@ -134,7 +163,6 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) { libusb_ret = libusb_get_configuration(device_handle_libusb, &configuration); if (LIBUSB_SUCCESS != libusb_ret) { SDL_LOG_INFO( - "libusb_get_configuration failed: " << libusb_error_name(libusb_ret)); SDL_LOG_TRACE("exit. Condition: LIBUSB_SUCCESS != libusb_ret"); return; @@ -145,7 +173,6 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) { libusb_set_configuration(device_handle_libusb, kUsbConfiguration); if (LIBUSB_SUCCESS != libusb_ret) { SDL_LOG_INFO( - "libusb_set_configuration failed: " << libusb_error_name(libusb_ret)); SDL_LOG_TRACE("exit. Condition: LIBUSB_SUCCESS != libusb_ret"); return; @@ -155,7 +182,6 @@ void UsbHandler::DeviceArrived(libusb_device* device_libusb) { libusb_ret = libusb_claim_interface(device_handle_libusb, 0); if (LIBUSB_SUCCESS != libusb_ret) { SDL_LOG_INFO( - "libusb_claim_interface failed: " << libusb_error_name(libusb_ret)); CloseDeviceHandle(device_handle_libusb); SDL_LOG_TRACE("exit. Condition: LIBUSB_SUCCESS != libusb_ret"); @@ -420,7 +446,6 @@ void UsbHandler::SubmitControlTransfer( const int libusb_ret = libusb_submit_transfer(libusb_transfer); if (LIBUSB_SUCCESS != libusb_ret) { SDL_LOG_ERROR( - "libusb_submit_transfer failed: " << libusb_error_name(libusb_ret)); libusb_free_transfer(libusb_transfer); sequence_state->Finish(); diff --git a/src/components/transport_manager/src/usb/qnx/usb_handler.cc b/src/components/transport_manager/src/usb/qnx/usb_handler.cc index 441fc8b664..2381daa15a 100644 --- a/src/components/transport_manager/src/usb/qnx/usb_handler.cc +++ b/src/components/transport_manager/src/usb/qnx/usb_handler.cc @@ -76,11 +76,6 @@ UsbHandler::~UsbHandler() { } } -bool operator==(const usbd_device_instance_t& a, - const usbd_device_instance_t& b) { - return a.path == b.path && a.devno == b.devno; -} - void UsbHandler::DeviceArrived(usbd_connection* connection, usbd_device_instance_t* instance) { for (Devices::const_iterator it = devices_.begin(); it != devices_.end(); diff --git a/src/components/transport_manager/src/usb/usb_device_scanner.cc b/src/components/transport_manager/src/usb/usb_device_scanner.cc index b0749728a6..e2e2fecd6e 100644 --- a/src/components/transport_manager/src/usb/usb_device_scanner.cc +++ b/src/components/transport_manager/src/usb/usb_device_scanner.cc @@ -47,7 +47,7 @@ SDL_CREATE_LOG_VARIABLE("TransportManager") class AoaInitSequence : public UsbControlTransferSequence { public: AoaInitSequence(); - AoaInitSequence(const TransportManagerSettings& settings); + explicit AoaInitSequence(const TransportManagerSettings& settings); virtual ~AoaInitSequence() {} private: diff --git a/src/components/transport_manager/test/include/transport_manager/raw_message_matcher.h b/src/components/transport_manager/test/include/transport_manager/raw_message_matcher.h index 2ee699096f..5aedfd58aa 100644 --- a/src/components/transport_manager/test/include/transport_manager/raw_message_matcher.h +++ b/src/components/transport_manager/test/include/transport_manager/raw_message_matcher.h @@ -55,7 +55,8 @@ class RawMessageMatcher : public MatcherInterface<RawMessagePtr> { public: explicit RawMessageMatcher(RawMessagePtr ptr); - virtual bool MatchAndExplain(const RawMessagePtr ptr, + DEPRECATED + virtual bool MatchAndExplain(const RawMessagePtr msg, MatchResultListener* listener) const; virtual void DescribeTo(std::ostream* os) const; virtual void DescribeNegationTo(std::ostream* os) const; diff --git a/src/components/transport_manager/test/network_interface_listener_test.cc b/src/components/transport_manager/test/network_interface_listener_test.cc index c6e007b62a..b2d9cbb51e 100644 --- a/src/components/transport_manager/test/network_interface_listener_test.cc +++ b/src/components/transport_manager/test/network_interface_listener_test.cc @@ -30,24 +30,10 @@ class NetworkInterfaceListenerTest : public ::testing::Test { virtual ~NetworkInterfaceListenerTest() {} protected: - struct InterfaceEntry { - const char* name; - const char* ipv4_address; - const char* ipv6_address; - unsigned int flags; - }; - void Deinit() { delete interface_listener_impl_; } - void SleepFor(long msec) const { - if (msec > 0) { - struct timespec ts = {0, msec * 1000 * 1000}; - nanosleep(&ts, NULL); - } - } - NetworkInterfaceListenerImpl* interface_listener_impl_; MockTcpClientListener mock_tcp_client_listener_; }; diff --git a/src/components/transport_manager/test/raw_message_matcher.cc b/src/components/transport_manager/test/raw_message_matcher.cc index 61d73a9253..48e0908f9a 100644 --- a/src/components/transport_manager/test/raw_message_matcher.cc +++ b/src/components/transport_manager/test/raw_message_matcher.cc @@ -38,6 +38,7 @@ namespace transport_manager_test { RawMessageMatcher::RawMessageMatcher(RawMessagePtr ptr) : ptr_(ptr) {} +// cppcheck-suppress unusedFunction bool RawMessageMatcher::MatchAndExplain(const RawMessagePtr msg, MatchResultListener* listener) const { if (msg->data_size() != ptr_->data_size()) { diff --git a/src/components/transport_manager/test/websocket_client_connection_test.cc b/src/components/transport_manager/test/websocket_client_connection_test.cc index b9aa6f7c7e..2eab434d1a 100644 --- a/src/components/transport_manager/test/websocket_client_connection_test.cc +++ b/src/components/transport_manager/test/websocket_client_connection_test.cc @@ -121,7 +121,7 @@ class WebsocketConnectionTest : public ::testing::Test { std::shared_ptr<websocket::WSSSession> wss_session; WebsocketClient ws_client; std::string kHost = "127.0.0.1"; - uint16_t kPort = 8080; + uint16_t kPort = 48080; std::string kPath = "/folder/file.html/"; std::string kQuery = "?eventId=2345&eventName='Test'&expectedResult=true"; std::string kFragment = "#section_1"; diff --git a/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc b/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc index 88525ad29d..6c2ff12bfd 100644 --- a/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc +++ b/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc @@ -105,7 +105,6 @@ bool WSSampleClient<WS>::Connect(tcp::resolver::results_type& results) { boost::system::error_code ec; boost::asio::connect(ws_->next_layer(), results.begin(), results.end(), ec); if (ec) { - std::string str_err = "ErrorMessage: " + ec.message(); return false; } return true; @@ -116,7 +115,6 @@ bool WSSampleClient<WSS>::Connect(tcp::resolver::results_type& results) { boost::system::error_code ec; boost::asio::connect(ws_->lowest_layer(), results.begin(), results.end(), ec); if (ec) { - std::string str_err = "ErrorMessage: " + ec.message(); return false; } return true; @@ -128,7 +126,6 @@ bool WSSampleClient<WS>::Handshake(const std::string& host, boost::system::error_code ec; ws_->handshake(host, target, ec); if (ec) { - std::string str_err = "ErrorMessage: " + ec.message(); return false; } return true; @@ -156,7 +153,6 @@ bool WSSampleClient<WSS>::Handshake(const std::string& host, ws_->handshake(host, target, ec); if (ec) { - std::string str_err = "ErrorMessage: " + ec.message(); return false; } diff --git a/src/components/utils/src/date_time.cc b/src/components/utils/src/date_time.cc index cea35a977e..389f973837 100644 --- a/src/components/utils/src/date_time.cc +++ b/src/components/utils/src/date_time.cc @@ -46,9 +46,7 @@ namespace date_time { TimeDuration getCurrentTime() { return bpt::microsec_clock::local_time() - bpt::from_time_t(0); } -TimeDuration TimeDurationZero() { - return TimeDuration(0, 0, 0, 0); -} + int64_t getSecs(const TimeDuration& t) { return t.total_seconds(); } @@ -61,13 +59,22 @@ int64_t getuSecs(const TimeDuration& t) { return t.total_microseconds(); } +#ifdef BUILD_TESTS +// cppcheck-suppress unusedFunction //Used in unit tests +TimeDuration TimeDurationZero() { + return TimeDuration(0, 0, 0, 0); +} + +// cppcheck-suppress unusedFunction //Used in unit tests int64_t get_just_mSecs(const TimeDuration& t) { return t.total_milliseconds() % MILLISECONDS_IN_SECOND; } +// cppcheck-suppress unusedFunction //Used in unit tests int64_t get_just_uSecs(const TimeDuration& t) { return t.total_microseconds() % MICROSECONDS_IN_SECOND; } +#endif // BUILD_TESTS int64_t calculateTimeSpan(const TimeDuration& sinceTime) { return calculateTimeDiff(getCurrentTime(), sinceTime); diff --git a/src/components/utils/src/file_system.cc b/src/components/utils/src/file_system.cc index e5c98183ac..f0c838a7f9 100644 --- a/src/components/utils/src/file_system.cc +++ b/src/components/utils/src/file_system.cc @@ -56,8 +56,7 @@ using boost::system::error_code; uint64_t file_system::GetAvailableDiskSpace(const std::string& path) { SDL_LOG_AUTO_TRACE(); error_code ec; - fs::space_info si = {0, 0, 0}; - si = fs::space(path, ec); + fs::space_info si = fs::space(path, ec); if (ec) { // If something went wrong, assume no free space @@ -74,9 +73,8 @@ uint64_t file_system::FileSize(const std::string& path) { const uint64_t fsize = static_cast<uint64_t>(fs::file_size(path, ec)); if (ec) { - SDL_LOG_ERROR_WITH_ERRNO( - - "Unable to get file size: '" << path << "', reason: " << ec.message()); + SDL_LOG_ERROR_WITH_ERRNO("Unable to get file size: '" + << path << "', reason: " << ec.message()); return 0; } return fsize; @@ -174,9 +172,8 @@ bool file_system::IsDirectory(const std::string& name) { bool file_system::DirectoryExists(const std::string& name) { SDL_LOG_AUTO_TRACE(); const bool exists = FileExists(name) && IsDirectory(name); - SDL_LOG_DEBUG( - - "Directory '" << name << "' " << (exists ? "exists" : "NOT exists")); + SDL_LOG_DEBUG("Directory '" << name << "' " + << (exists ? "exists" : "NOT exists")); return exists; } @@ -305,10 +302,9 @@ void file_system::remove_directory_content(const std::string& directory_name) { while (dir_iter != end) { fs::remove_all(dir_iter->path(), ec); if (ec) { - SDL_LOG_ERROR_WITH_ERRNO( - - "Unable to remove file: " << dir_iter->path().string() << " reason " - << ec.message()); + SDL_LOG_ERROR_WITH_ERRNO("Unable to remove file: " + << dir_iter->path().string() << " reason " + << ec.message()); } dir_iter.increment(ec); if (ec) { @@ -325,7 +321,6 @@ bool file_system::RemoveDirectory(const std::string& directory_name, // Make sure the directory exists if (!DirectoryExists(directory_name) && IsAccessible(directory_name, W_OK)) { SDL_LOG_WARN( - "Unable to remove directory either doesn't exist or is not accessible"); return false; } @@ -466,11 +461,10 @@ bool file_system::ReadFile(const std::string& name, std::string& result) { const std::string file_system::ConvertPathForURL(const std::string& path) { SDL_LOG_AUTO_TRACE(); const std::string reserved_symbols = "!#$&'()*+,:;=?@[] "; - size_t pos = std::string::npos; std::string converted_path; for (const auto symbol : path) { - pos = reserved_symbols.find_first_of(symbol); + size_t pos = reserved_symbols.find_first_of(symbol); if (pos != std::string::npos) { const size_t size = 100; char percent_value[size]; @@ -519,9 +513,8 @@ bool file_system::CopyFile(const std::string& src, const std::string& dst) { error_code ec; fs::copy_file(src, dst, ec); if (ec) { - SDL_LOG_ERROR_WITH_ERRNO( - - "Unable to copy file: '" << src << "', reason: " << ec.message()); + SDL_LOG_ERROR_WITH_ERRNO("Unable to copy file: '" + << src << "', reason: " << ec.message()); // something failed return false; } diff --git a/src/components/utils/src/threads/thread_validator.cc b/src/components/utils/src/threads/thread_validator.cc index 218137127b..c59054ae11 100644 --- a/src/components/utils/src/threads/thread_validator.cc +++ b/src/components/utils/src/threads/thread_validator.cc @@ -46,13 +46,12 @@ SingleThreadSimpleValidator::~SingleThreadSimpleValidator() {} void SingleThreadSimpleValidator::AssertRunningOnCreationThread() const { PlatformThreadHandle current_id = Thread::CurrentId(); if (creation_thread_id_ != current_id) { - SDL_LOG_ERROR( - - "Single-threaded object created at thread " - << creation_thread_id_ << " is accessed from thread " << current_id + SDL_LOG_ERROR("Single-threaded object created at thread " + << creation_thread_id_ << " is accessed from thread " + << current_id #ifdef BACKTRACE_SUPPORT - << "\n" - << utils::Backtrace() + << "\n" + << utils::Backtrace() #endif ); } diff --git a/tools/rpc_spec b/tools/rpc_spec -Subproject 0d7185781f4dd1a316137a052e1126cdb6e3f47 +Subproject 762489ca140f246923e8bb8f54e96364e9d0101 |