diff options
author | JackLivio <jack@livio.io> | 2020-02-17 13:45:52 -0500 |
---|---|---|
committer | JackLivio <jack@livio.io> | 2020-02-17 13:45:52 -0500 |
commit | 610c3d8458a12a07955f0a39ade724216d4eae5e (patch) | |
tree | 2025ccb85697071d378d89d144f922b60434e79f | |
parent | b28a10d21f08d78a733a37b51242a206a65a707b (diff) | |
parent | ece258838a44a5461d718c5eeae380ad11a3769b (diff) | |
download | sdl_core-610c3d8458a12a07955f0a39ade724216d4eae5e.tar.gz |
Merge remote-tracking branch 'origin/develop' into fix/hash_id_rejected_params
100 files changed, 1399 insertions, 625 deletions
diff --git a/src/appMain/life_cycle_impl.cc b/src/appMain/life_cycle_impl.cc index a7786e302b..4c2d1e88ac 100644 --- a/src/appMain/life_cycle_impl.cc +++ b/src/appMain/life_cycle_impl.cc @@ -34,8 +34,8 @@ #include "application_manager/system_time/system_time_handler_impl.h" #include "config_profile/profile.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "utils/signals.h" - #ifdef ENABLE_SECURITY #include "application_manager/policies/policy_handler.h" #include "security_manager/crypto_manager_impl.h" @@ -67,7 +67,6 @@ LifeCycleImpl::LifeCycleImpl(const profile::Profile& profile) , hmi_handler_(NULL) , hmi_message_adapter_(NULL) , media_manager_(NULL) - , last_state_(NULL) #ifdef TELEMETRY_MONITOR , telemetry_monitor_(NULL) #endif // TELEMETRY_MONITOR @@ -80,9 +79,12 @@ LifeCycleImpl::LifeCycleImpl(const profile::Profile& profile) bool LifeCycleImpl::StartComponents() { LOG4CXX_AUTO_TRACE(logger_); - DCHECK(!last_state_); - last_state_ = new resumption::LastStateImpl(profile_.app_storage_folder(), - profile_.app_info_storage()); + DCHECK(!last_state_wrapper_); + + auto last_state = std::make_shared<resumption::LastStateImpl>( + profile_.app_storage_folder(), profile_.app_info_storage()); + last_state_wrapper_ = + std::make_shared<resumption::LastStateWrapperImpl>(last_state); DCHECK(!transport_manager_); transport_manager_ = new transport_manager::TransportManagerDefault( @@ -120,7 +122,7 @@ bool LifeCycleImpl::StartComponents() { media_manager_ = new media_manager::MediaManagerImpl(*app_manager_, profile_); app_manager_->set_connection_handler(connection_handler_); app_manager_->AddPolicyObserver(protocol_handler_); - if (!app_manager_->Init(*last_state_, media_manager_)) { + if (!app_manager_->Init(last_state_wrapper_, media_manager_)) { LOG4CXX_ERROR(logger_, "Application manager init failed."); return false; } @@ -171,7 +173,8 @@ bool LifeCycleImpl::StartComponents() { // It's important to initialise TM after setting up listener chain // [TM -> CH -> AM], otherwise some events from TM could arrive at nowhere app_manager_->set_protocol_handler(protocol_handler_); - if (transport_manager::E_SUCCESS != transport_manager_->Init(*last_state_)) { + if (transport_manager::E_SUCCESS != + transport_manager_->Init(last_state_wrapper_)) { LOG4CXX_ERROR(logger_, "Transport manager init failed."); return false; } @@ -319,10 +322,8 @@ void LifeCycleImpl::StopComponents() { delete connection_handler_; connection_handler_ = NULL; - LOG4CXX_INFO(logger_, "Destroying Last State"); - DCHECK(last_state_); - delete last_state_; - last_state_ = NULL; + LOG4CXX_INFO(logger_, "Destroying Last State."); + last_state_wrapper_.reset(); LOG4CXX_INFO(logger_, "Destroying Application Manager."); DCHECK(app_manager_); diff --git a/src/appMain/life_cycle_impl.h b/src/appMain/life_cycle_impl.h index 5bddf6bff9..4a2e41b52f 100644 --- a/src/appMain/life_cycle_impl.h +++ b/src/appMain/life_cycle_impl.h @@ -95,7 +95,7 @@ class LifeCycleImpl : public LifeCycle { hmi_message_handler::HMIMessageHandlerImpl* hmi_handler_; hmi_message_handler::HMIMessageAdapter* hmi_message_adapter_; media_manager::MediaManagerImpl* media_manager_; - resumption::LastState* last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; #ifdef TELEMETRY_MONITOR telemetry_monitor::TelemetryMonitor* telemetry_monitor_; #endif // TELEMETRY_MONITOR diff --git a/src/components/application_manager/include/application_manager/app_launch/app_launch_data_json.h b/src/components/application_manager/include/application_manager/app_launch/app_launch_data_json.h index 9463a349d9..9e60183960 100644 --- a/src/components/application_manager/include/application_manager/app_launch/app_launch_data_json.h +++ b/src/components/application_manager/include/application_manager/app_launch/app_launch_data_json.h @@ -35,8 +35,7 @@ #include <memory> #include "application_manager/app_launch/app_launch_data_impl.h" -#include "resumption/last_state.h" -#include "smart_objects/smart_object.h" +#include "resumption/last_state_wrapper.h" #include "utils/lock.h" #include "utils/macro.h" @@ -53,7 +52,12 @@ class AppLaunchDataJson : public AppLaunchDataImpl { * @brief Constructor of AppLaunchDataJson object */ AppLaunchDataJson(const AppLaunchSettings& settings, + resumption::LastStateWrapperPtr last_state_wrapper); + + DEPRECATED + AppLaunchDataJson(const AppLaunchSettings& settings, resumption::LastState& last_state); + /** * @brief allows to destroy AppLaunchDataJson object */ @@ -88,9 +92,15 @@ class AppLaunchDataJson : public AppLaunchDataImpl { * @param app_data - searching filled in object * @param founded_index - referenceto index of founded record * in case it wasn't found it'll be -1 + * @param dictionary - data dictionary where all necessary info stored * @return pointer to json list object */ Json::Value& GetApplicationListAndIndex(const ApplicationData& app_data, + int32_t& found_index, + Json::Value& dictionary) const; + + DEPRECATED + Json::Value& GetApplicationListAndIndex(const ApplicationData& app_data, int32_t& founded_index) const; private: @@ -117,27 +127,22 @@ class AppLaunchDataJson : public AppLaunchDataImpl { const std::string& dev_mac) const OVERRIDE; /** - * @return pointer to LastState functionality - */ - resumption::LastState& last_state() const { - return last_state_; - } - - /** * @brief delete record with oldest timestamp * @return true in success cases and false othrewise */ bool DeleteOldestAppData(); /** + * @param dictionary - data dictionary where all necessary info stored * @return pointer to AppLaunch data block in Json file */ - Json::Value& GetSavedApplicationDataList() const; + Json::Value& GetSavedApplicationDataList(Json::Value& dictionary) const; /** + * @param dictionary - data dictionary where all necessary info stored * @return pointer to AppLaunch records block in Json file */ - Json::Value& GetApplicationData() const; + Json::Value& GetApplicationData(Json::Value& dictionary) const; /** * @brief lock to protected common data @@ -147,7 +152,7 @@ class AppLaunchDataJson : public AppLaunchDataImpl { /** * @brief ponter to Last State object */ - resumption::LastState& last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; DISALLOW_COPY_AND_ASSIGN(AppLaunchDataJson); }; diff --git a/src/components/application_manager/include/application_manager/app_service_manager.h b/src/components/application_manager/include/application_manager/app_service_manager.h index 5080748f17..d26598c1e9 100644 --- a/src/components/application_manager/include/application_manager/app_service_manager.h +++ b/src/components/application_manager/include/application_manager/app_service_manager.h @@ -36,11 +36,9 @@ #include "application_manager/application.h" #include "application_manager/rpc_passing_handler.h" #include "interfaces/MOBILE_API.h" +#include "resumption/last_state_wrapper.h" #include "smart_objects/smart_object.h" - -namespace resumption { -class LastState; -} +#include "utils/macro.h" namespace application_manager { @@ -65,7 +63,10 @@ class AppServiceManager { * @param app_manager */ AppServiceManager(ApplicationManager& app_manager, - resumption::LastState& last_state); + resumption::LastStateWrapperPtr last_state); + + DEPRECATED AppServiceManager(ApplicationManager& app_manager, + resumption::LastState& last_state); /** * @brief Class destructor @@ -221,7 +222,7 @@ class AppServiceManager { private: ApplicationManager& app_manager_; - resumption::LastState& last_state_; + resumption::LastStateWrapperPtr last_state_; sync_primitives::RecursiveLock published_services_lock_; std::map<std::string, AppService> published_services_; 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 7eb2d43d84..ab7cf95139 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 @@ -158,10 +158,14 @@ class ApplicationManagerImpl const policy::PolicySettings& policy_settings); ~ApplicationManagerImpl(); + DEPRECATED + bool Init(resumption::LastState&, + media_manager::MediaManager* media_manager) OVERRIDE; + /** * Inits application manager */ - bool Init(resumption::LastState& last_state, + bool Init(resumption::LastStateWrapperPtr last_state_wrapper, media_manager::MediaManager* media_manager) OVERRIDE; /** 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 2c4212c888..b7f41ca297 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 @@ -41,10 +41,6 @@ #include "smart_objects/smart_object.h" #include "utils/macro.h" -namespace resumption { -class LastState; -} // namespace resumption - namespace application_manager { class ApplicationManager; @@ -514,6 +510,9 @@ class HMICapabilitiesImpl : public HMICapabilities { const smart_objects::SmartObject* seat_location_capability() const OVERRIDE; + void Init(resumption::LastStateWrapperPtr last_state_wrapper) OVERRIDE; + + DEPRECATED void Init(resumption::LastState* last_state) OVERRIDE; /* diff --git a/src/components/application_manager/include/application_manager/hmi_language_handler.h b/src/components/application_manager/include/application_manager/hmi_language_handler.h index edf0759114..2ef034450d 100644 --- a/src/components/application_manager/include/application_manager/hmi_language_handler.h +++ b/src/components/application_manager/include/application_manager/hmi_language_handler.h @@ -35,12 +35,10 @@ #include "application_manager/event_engine/event_observer.h" #include "interfaces/HMI_API.h" +#include "resumption/last_state_wrapper.h" #include "smart_objects/smart_object.h" #include "utils/lock.h" -namespace resumption { -class LastState; -} namespace application_manager { class ApplicationManager; @@ -97,7 +95,11 @@ class HMILanguageHandler : public event_engine::EventObserver { void set_default_capabilities_languages(hmi_apis::Common_Language::eType ui, hmi_apis::Common_Language::eType vr, hmi_apis::Common_Language::eType tts); - void Init(resumption::LastState* value); + + DEPRECATED + void Init(resumption::LastState*); + + void Init(resumption::LastStateWrapperPtr value); /** * @brief Removes application from container after @@ -179,7 +181,7 @@ class HMILanguageHandler : public event_engine::EventObserver { * @brief Indicates if current TTS language has been received from HMI */ bool is_tts_language_received_; - resumption::LastState* last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; ApplicationManager& application_manager_; }; diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h index 3af87a0c9e..88f91d14fc 100644 --- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h +++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h @@ -43,10 +43,6 @@ namespace policy { class PolicyHandlerInterface; } -namespace resumption { -class LastState; -} - namespace application_manager { class CommandFactory; @@ -88,7 +84,15 @@ class RPCPlugin { rpc_service::RPCService& rpc_service, HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, + resumption::LastStateWrapperPtr last_state) = 0; + + DEPRECATED + virtual bool Init(ApplicationManager& app_manager, + rpc_service::RPCService& rpc_service, + HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, resumption::LastState& last_state) = 0; + /** * @brief IsAbleToProcess check if plugin is able to process function * @param function_id RPC identifier diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h index 5495c44e05..004d6418f5 100644 --- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h +++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin_manager_impl.h @@ -37,12 +37,9 @@ #include "application_manager/plugin_manager/rpc_plugin_manager.h" #include "application_manager/policies/policy_handler_interface.h" #include "application_manager/rpc_service.h" +#include "resumption/last_state_wrapper.h" #include "utils/optional.h" -namespace resumption { -class LastState; -} - namespace application_manager { namespace plugin_manager { @@ -60,6 +57,13 @@ class RPCPluginManagerImpl : public RPCPluginManager { rpc_service::RPCService& rpc_service, HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, + resumption::LastStateWrapperPtr last_state); + + DEPRECATED + RPCPluginManagerImpl(ApplicationManager& app_manager, + rpc_service::RPCService& rpc_service, + HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, resumption::LastState& last_state); uint32_t LoadPlugins(const std::string& plugins_path) OVERRIDE; @@ -76,7 +80,7 @@ class RPCPluginManagerImpl : public RPCPluginManager { rpc_service::RPCService& rpc_service_; HMICapabilities& hmi_capabilities_; policy::PolicyHandlerInterface& policy_handler_; - resumption::LastState& last_state_; + resumption::LastStateWrapperPtr last_state_; // RPCPluginManager interface public: 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 78366ea96a..e572eaec39 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 @@ -47,8 +47,6 @@ namespace app_mngr = application_manager; namespace resumption { -class LastState; - /** * @brief Contains logic for storage/restore data of applications. */ @@ -272,12 +270,15 @@ class ResumeCtrl { */ virtual void RemoveFromResumption(uint32_t app_id) = 0; + DEPRECATED + virtual bool Init(resumption::LastState& last_state) = 0; + /** * @brief Initialization data for Resume controller * @return true if initialization is success otherwise * returns false */ - virtual bool Init(LastState& last_state) = 0; + virtual bool Init(resumption::LastStateWrapperPtr last_state_wrapper) = 0; /** * @brief Notify resume controller about new application 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 f0d5dc39e4..3ac59b9f88 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 @@ -52,8 +52,6 @@ namespace resumption { -class LastState; - /** * @brief Contains logic for storage/restore data of applications. */ @@ -286,12 +284,14 @@ class ResumeCtrlImpl : public ResumeCtrl, */ void RemoveFromResumption(uint32_t app_id) OVERRIDE; + DEPRECATED bool Init(resumption::LastState& last_state) FINAL; + /** * @brief Initialization data for Resume controller * @return true if initialization is success otherwise * returns false */ - bool Init(LastState& last_state) OVERRIDE; + bool Init(resumption::LastStateWrapperPtr last_state_wrapper) FINAL; /** * @brief Notify resume controller about new application diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data.h b/src/components/application_manager/include/application_manager/resumption/resumption_data.h index d1dada345c..69fc5437de 100644 --- a/src/components/application_manager/include/application_manager/resumption/resumption_data.h +++ b/src/components/application_manager/include/application_manager/resumption/resumption_data.h @@ -305,7 +305,6 @@ class ResumptionData { ++first; } } - mutable sync_primitives::RecursiveLock resumption_lock_; const application_manager::ApplicationManager& application_manager_; }; } // namespace resumption diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h b/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h index 2b5a1fdcc9..a667dbf8e2 100644 --- a/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h +++ b/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h @@ -838,6 +838,7 @@ class ResumptionDataDB : public ResumptionData { DISALLOW_COPY_AND_ASSIGN(ResumptionDataDB); utils::dbms::SQLDatabase* db_; + mutable sync_primitives::RecursiveLock resumption_lock_; }; } // namespace resumption diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data_json.h b/src/components/application_manager/include/application_manager/resumption/resumption_data_json.h index e2418fd033..2394fe00dc 100644 --- a/src/components/application_manager/include/application_manager/resumption/resumption_data_json.h +++ b/src/components/application_manager/include/application_manager/resumption/resumption_data_json.h @@ -35,7 +35,7 @@ #include "application_manager/resumption/resumption_data.h" #include "json/json.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" namespace resumption { @@ -49,7 +49,12 @@ class ResumptionDataJson : public ResumptionData { * @brief Constructor of ResumptionDataJson */ ResumptionDataJson( - LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, + const application_manager::ApplicationManager& application_manager); + + DEPRECATED + ResumptionDataJson( + LastState&, const application_manager::ApplicationManager& application_manager); /** @@ -175,9 +180,8 @@ class ResumptionDataJson : public ResumptionData { */ void Persist() OVERRIDE; - resumption::LastState& last_state() const { - return last_state_; - } + DEPRECATED + resumption::LastState& last_state() const; private: /** @@ -185,22 +189,26 @@ class ResumptionDataJson : public ResumptionData { * or adds the new one. * @param policy_app_id application id. * @param device_id unique id of device. + * @param dictionary - data dictionary where all necessary info stored * @return the reference to the record in applications array. */ Json::Value& GetFromSavedOrAppend(const std::string& policy_app_id, - const std::string& device_id) const; + const std::string& device_id, + Json::Value& dictionary) const; /** * @brief Get applications for resumption of LastState + * @param dictionary - data dictionary where all necessary info stored * @return applications for resumption of LastState */ - Json::Value& GetSavedApplications() const; + Json::Value& GetSavedApplications(Json::Value& dictionary) const; /** * @brief Get Resumption section of LastState + * @param dictionary - data dictionary where all necessary info stored * @return Resumption section of LastState in Json */ - Json::Value& GetResumptionData() const; + Json::Value& GetResumptionData(Json::Value& dictionary) const; /** * @brief GetObjectIndex allows to obtain specified object index from @@ -214,15 +222,17 @@ class ResumptionDataJson : public ResumptionData { /** * @brief Set applications for resumption to LastState + * @param dictionary - data dictionary where all necessary info stored * @parems apps_json applications to write in LastState */ - void SetSavedApplication(Json::Value& apps_json); + void SetSavedApplication(Json::Value& apps_json, Json::Value& dictionary); /** * @brief Setup IgnOff time to LastState + * @param dictionary - data dictionary where all necessary info stored * @param ign_off_time - igition off time */ - void SetLastIgnOffTime(time_t ign_off_time); + void SetLastIgnOffTime(time_t ign_off_time, Json::Value& dictionary); /* * @brief Return true if application resumption data is valid, @@ -231,7 +241,7 @@ class ResumptionDataJson : public ResumptionData { */ bool IsResumptionDataValid(uint32_t index) const; - LastState& last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; DISALLOW_COPY_AND_ASSIGN(ResumptionDataJson); }; } // 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 000569e450..c6121f5d1d 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 @@ -152,13 +152,14 @@ class StateControllerImpl : public event_engine::EventObserver, template <typename UnaryFunction> void ForEachApplication(UnaryFunction func) const { - DataAccessor<ApplicationSet> accessor = app_mngr_.applications(); - ApplicationSet::iterator it = accessor.GetData().begin(); - for (; it != accessor.GetData().end(); ++it) { - ApplicationConstSharedPtr const_app = *it; - if (const_app) { - func(app_mngr_.application(const_app->app_id())); - } + ApplicationSet applications; + { + DataAccessor<ApplicationSet> accessor = app_mngr_.applications(); + applications = accessor.GetData(); + } + + for (const auto& app : applications) { + func(app); } } diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h index 1765c1e7fa..5d85237899 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/app_service_rpc_plugin.h @@ -36,7 +36,6 @@ #include "application_manager/command_factory.h" namespace app_service_rpc_plugin { -// class AppServiceAppExtension; namespace app_mngr = application_manager; namespace plugins = application_manager::plugin_manager; @@ -48,7 +47,14 @@ class AppServiceRpcPlugin : public plugins::RPCPlugin { app_mngr::rpc_service::RPCService& rpc_service, app_mngr::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, - resumption::LastState& last_state) OVERRIDE; + resumption::LastStateWrapperPtr last_state) OVERRIDE; + + DEPRECATED + bool Init(app_mngr::ApplicationManager& application_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, + resumption::LastState& last_state); bool IsAbleToProcess( const int32_t function_id, 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 0e739522d9..1c3a9c77c5 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 @@ -50,7 +50,19 @@ bool AppServiceRpcPlugin::Init( application_manager::rpc_service::RPCService& rpc_service, application_manager::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, - resumption::LastState& last_state) { + resumption::LastStateWrapperPtr last_state) { + UNUSED(last_state); + application_manager_ = &app_manager; + command_factory_.reset(new app_service_rpc_plugin::AppServiceCommandFactory( + app_manager, rpc_service, hmi_capabilities, policy_handler)); + return true; +} + +bool AppServiceRpcPlugin::Init(app_mngr::ApplicationManager& app_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, + resumption::LastState& last_state) { UNUSED(last_state); application_manager_ = &app_manager; command_factory_.reset(new app_service_rpc_plugin::AppServiceCommandFactory( diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/commands/mobile/on_app_service_data_notification_test.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/commands/mobile/on_app_service_data_notification_test.cc index 3e88d4eaf3..6949a3aff0 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/commands/mobile/on_app_service_data_notification_test.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/test/commands/mobile/on_app_service_data_notification_test.cc @@ -41,6 +41,7 @@ #include "gtest/gtest.h" #include "interfaces/MOBILE_API.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" namespace am = application_manager; using am::ApplicationSet; @@ -80,7 +81,9 @@ class OnAppServiceDataNotificationTest app_service_plugin_, *mock_app_)) , apps_lock_(std::make_shared<sync_primitives::Lock>()) , apps_da_(apps_, apps_lock_) - , last_state_("app_storage_folder", "app_info_storage") + , last_state_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage"))) , app_service_manager_(app_mngr_, last_state_) { ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); ON_CALL(*mock_app_, is_remote_control_supported()) @@ -109,7 +112,7 @@ class OnAppServiceDataNotificationTest application_manager::ApplicationSet apps_; const std::shared_ptr<sync_primitives::Lock> apps_lock_; DataAccessor<application_manager::ApplicationSet> apps_da_; - resumption::LastStateImpl last_state_; + resumption::LastStateWrapperPtr last_state_; MockAppServiceManager app_service_manager_; }; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager.h index cde7928a14..c8b99cc724 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager.h @@ -70,7 +70,7 @@ class RCConsentManager { virtual rc_rpc_plugin::rc_rpc_types::ModuleConsent GetModuleConsent( const std::string& app_id, const std::string& mac_address, - const rc_rpc_types::ModuleUid& module_id) const = 0; + const rc_rpc_types::ModuleUid& module_id) = 0; /** * @brief Remove modules consents from LastState if they exist diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager_impl.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager_impl.h index b3c6a0b129..5cbc4b977e 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager_impl.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_consent_manager_impl.h @@ -34,7 +34,7 @@ #define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_RC_RPC_PLUGIN_INCLUDE_RC_CONSENT_MANAGER_IMPL_H #include "rc_consent_manager.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "utils/lock.h" namespace Json { @@ -46,6 +46,12 @@ namespace rc_rpc_plugin { class RCConsentManagerImpl : public RCConsentManager { public: RCConsentManagerImpl( + resumption::LastStateWrapperPtr last_state, + application_manager::ApplicationManager& application_manager, + const uint32_t period_of_consent_expired); + + DEPRECATED + RCConsentManagerImpl( resumption::LastState& last_state, application_manager::ApplicationManager& application_manager, const uint32_t period_of_consent_expired); @@ -58,7 +64,7 @@ class RCConsentManagerImpl : public RCConsentManager { rc_rpc_types::ModuleConsent GetModuleConsent( const std::string& app_id, const std::string& mac_address, - const rc_rpc_types::ModuleUid& module_id) const OVERRIDE; + const rc_rpc_types::ModuleUid& module_id) OVERRIDE; void RemoveExpiredConsents() OVERRIDE; @@ -111,7 +117,7 @@ class RCConsentManagerImpl : public RCConsentManager { * In case the section is absent, will be appended a new empty section. * @return Remote Control section of LastState in Json */ - Json::Value& GetRemoteControlDataOrAppend() const; + Json::Value& GetRemoteControlDataOrAppend(Json::Value& last_state_data); /** * @brief Gets Device applications section for specified device mac adress @@ -119,8 +125,8 @@ class RCConsentManagerImpl : public RCConsentManager { * @param mac_aress Device MAC adress * @return Device applications section of LastState in Json */ - Json::Value& GetDeviceApplicationsOrAppend( - const std::string& mac_address) const; + Json::Value& GetDeviceApplicationsOrAppend(const std::string& mac_address, + Json::Value& last_state_data); /** * @brief Get AppConsentsList section of LastState for specified application. @@ -130,7 +136,8 @@ class RCConsentManagerImpl : public RCConsentManager { * @return AppConsentsList of LastState in Json */ Json::Value& GetAppConsentsListOrAppend(const std::string& policy_app_id, - const std::string& mac_address) const; + const std::string& mac_address, + Json::Value& last_state_data); /** * @brief Get Application consents section of Remote Control section of @@ -138,7 +145,7 @@ class RCConsentManagerImpl : public RCConsentManager { * is absent, will be created a new empty section * @return AppConsents section of RemoteControl section of LastState in Jason */ - Json::Value& GetAppsConsentsOrAppend() const; + Json::Value& GetAppsConsentsOrAppend(Json::Value& last_state_data); /** * @brief Get all module resource consents for specified application and @@ -149,14 +156,14 @@ class RCConsentManagerImpl : public RCConsentManager { * acquiring resource * @param module_type Module type with consents */ - Json::Value& GetModuleTypeConsentsOrAppend( - const std::string& policy_app_id, - const std::string& mac_address, - const std::string& module_type) const; + Json::Value& GetModuleTypeConsentsOrAppend(const std::string& policy_app_id, + const std::string& mac_address, + const std::string& module_type, + Json::Value& last_state_data); private: application_manager::ApplicationManager& app_manager_; - resumption::LastState& last_state_; + resumption::LastStateWrapperPtr last_state_; const uint32_t period_of_consent_expired_; mutable sync_primitives::Lock dictionary_control_lock_; mutable sync_primitives::Lock remote_control_lock_; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h index 1225feb67f..e12bd88e58 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_rpc_plugin.h @@ -43,10 +43,6 @@ #include "rc_rpc_plugin/rc_consent_manager.h" #include "rc_rpc_plugin/resource_allocation_manager.h" -namespace resumption { -class LastState; -} - namespace rc_rpc_plugin { namespace plugins = application_manager::plugin_manager; namespace app_mngr = application_manager; @@ -65,6 +61,13 @@ class RCRPCPlugin : public plugins::RPCPlugin { app_mngr::rpc_service::RPCService& rpc_service, app_mngr::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, + resumption::LastStateWrapperPtr last_state) OVERRIDE; + + DEPRECATED + bool Init(app_mngr::ApplicationManager& app_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, resumption::LastState& last_state) OVERRIDE; /** * @param int32_t command id diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_consent_manager_impl.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_consent_manager_impl.cc index acaa6ce86c..1d7db181eb 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_consent_manager_impl.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_consent_manager_impl.cc @@ -48,7 +48,7 @@ namespace app_mngr = application_manager; CREATE_LOGGERPTR_GLOBAL(logger_, "RCConsentManager") RCConsentManagerImpl::RCConsentManagerImpl( - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state, application_manager::ApplicationManager& application_manager, const uint32_t period_of_consent_expired) : app_manager_(application_manager) @@ -64,20 +64,31 @@ void RCConsentManagerImpl::SaveModuleConsents( for (const auto& consent : module_consents) { std::string module_type = consent.module_id.first; - auto& app_module_consents = - GetModuleTypeConsentsOrAppend(policy_app_id, mac_address, module_type); + auto last_state_accessor = last_state_->get_accessor(); + auto last_state_dictionary = last_state_accessor.GetData().dictionary(); + + auto& app_module_consents = GetModuleTypeConsentsOrAppend( + policy_app_id, mac_address, module_type, last_state_dictionary); SaveAppModuleConsent(app_module_consents, consent); + + last_state_accessor.GetMutableData().set_dictionary(last_state_dictionary); } } rc_rpc_types::ModuleConsent RCConsentManagerImpl::GetModuleConsent( const std::string& app_id, const std::string& mac_address, - const rc_rpc_types::ModuleUid& module_id) const { + const rc_rpc_types::ModuleUid& module_id) { sync_primitives::AutoLock autolock(module_consents_lock_); - auto& module_consents = - GetModuleTypeConsentsOrAppend(app_id, mac_address, module_id.first); + auto last_state_accessor = last_state_->get_accessor(); + auto last_state_dictionary = last_state_accessor.GetData().dictionary(); + + auto& module_consents = GetModuleTypeConsentsOrAppend( + app_id, mac_address, module_id.first, last_state_dictionary); + + last_state_accessor.GetMutableData().set_dictionary(last_state_dictionary); + if (module_consents.empty()) { LOG4CXX_DEBUG( logger_, @@ -102,23 +113,35 @@ rc_rpc_types::ModuleConsent RCConsentManagerImpl::GetModuleConsent( void RCConsentManagerImpl::RemoveExpiredConsents() { LOG4CXX_AUTO_TRACE(logger_); - auto& remote_control = GetRemoteControlDataOrAppend(); + + auto last_state_accessor = last_state_->get_accessor(); + auto last_state_dictionary = last_state_accessor.GetData().dictionary(); + + auto& remote_control = GetRemoteControlDataOrAppend(last_state_dictionary); if (remote_control.empty()) { + last_state_accessor.GetMutableData().set_dictionary(last_state_dictionary); return; } - auto& devices = GetAppsConsentsOrAppend(); + auto& devices = GetAppsConsentsOrAppend(last_state_dictionary); sync_primitives::AutoLock autolock(device_applications_lock_); for (auto& device_item : devices) { RemoveDeviceExpiredConsents(device_item); } + + last_state_accessor.GetMutableData().set_dictionary(last_state_dictionary); } void RCConsentManagerImpl::RemoveAllConsents() { - auto& remote_control = GetRemoteControlDataOrAppend(); + auto last_state_accessor = last_state_->get_accessor(); + auto last_state_dictionary = last_state_accessor.GetData().dictionary(); + + auto& remote_control = GetRemoteControlDataOrAppend(last_state_dictionary); remote_control.removeMember(message_params::kAppConsents); + + last_state_accessor.GetMutableData().set_dictionary(last_state_dictionary); } rc_rpc_types::ModuleConsentState RCConsentManagerImpl::CheckModuleConsentState( @@ -203,17 +226,17 @@ void RCConsentManagerImpl::RemoveModuleExpiredConsents( } } -Json::Value& RCConsentManagerImpl::GetRemoteControlDataOrAppend() const { - Json::Value& dictionary = last_state_.get_dictionary(); - +Json::Value& RCConsentManagerImpl::GetRemoteControlDataOrAppend( + Json::Value& last_state_data) { sync_primitives::AutoLock autolock(dictionary_control_lock_); - if (!dictionary.isMember(app_mngr::strings::remote_control)) { - dictionary[app_mngr::strings::remote_control] = + if (!last_state_data.isMember(app_mngr::strings::remote_control)) { + last_state_data[app_mngr::strings::remote_control] = Json::Value(Json::objectValue); LOG4CXX_DEBUG(logger_, "remote_control section is missed"); } - Json::Value& remote_control = dictionary[app_mngr::strings::remote_control]; + Json::Value& remote_control = + last_state_data[app_mngr::strings::remote_control]; if (!remote_control.isObject()) { LOG4CXX_ERROR(logger_, "remote_control type INVALID rewrite"); @@ -223,10 +246,10 @@ Json::Value& RCConsentManagerImpl::GetRemoteControlDataOrAppend() const { } Json::Value& RCConsentManagerImpl::GetDeviceApplicationsOrAppend( - const std::string& mac_address) const { + const std::string& mac_address, Json::Value& last_state_data) { sync_primitives::AutoLock autolock(device_applications_lock_); - auto& apps_consents = GetAppsConsentsOrAppend(); + auto& apps_consents = GetAppsConsentsOrAppend(last_state_data); if (!apps_consents.isArray()) { LOG4CXX_DEBUG(logger_, "applications_consents type INVALID rewrite"); @@ -257,8 +280,11 @@ Json::Value& RCConsentManagerImpl::GetDeviceApplicationsOrAppend( } Json::Value& RCConsentManagerImpl::GetAppConsentsListOrAppend( - const std::string& policy_app_id, const std::string& mac_address) const { - auto& device_applications = GetDeviceApplicationsOrAppend(mac_address); + const std::string& policy_app_id, + const std::string& mac_address, + Json::Value& last_state_data) { + auto& device_applications = + GetDeviceApplicationsOrAppend(mac_address, last_state_data); sync_primitives::AutoLock autolock(applications_lock_); if (!device_applications.isArray()) { @@ -291,8 +317,9 @@ Json::Value& RCConsentManagerImpl::GetAppConsentsListOrAppend( [message_params::kAppConsentList]; } -Json::Value& RCConsentManagerImpl::GetAppsConsentsOrAppend() const { - Json::Value& remote_control = GetRemoteControlDataOrAppend(); +Json::Value& RCConsentManagerImpl::GetAppsConsentsOrAppend( + Json::Value& last_state_data) { + Json::Value& remote_control = GetRemoteControlDataOrAppend(last_state_data); sync_primitives::AutoLock autolock(remote_control_lock_); if (!remote_control.isMember(message_params::kAppConsents)) { @@ -312,12 +339,13 @@ Json::Value& RCConsentManagerImpl::GetAppsConsentsOrAppend() const { Json::Value& RCConsentManagerImpl::GetModuleTypeConsentsOrAppend( const std::string& policy_app_id, const std::string& mac_address, - const std::string& module_type) const { - auto& app_consnets_list = - GetAppConsentsListOrAppend(policy_app_id, mac_address); + const std::string& module_type, + Json::Value& last_state_data) { + auto& app_consents_list = + GetAppConsentsListOrAppend(policy_app_id, mac_address, last_state_data); sync_primitives::AutoLock autolock(app_consents_lock_); - for (auto& module_consents : app_consnets_list) { + for (auto& module_consents : app_consents_list) { const bool module_exists = module_consents.isMember(message_params::kModuleType); @@ -338,10 +366,10 @@ Json::Value& RCConsentManagerImpl::GetModuleTypeConsentsOrAppend( consent_item[message_params::kModuleType] = module_type; consent_item[message_params::kModuleConsents] = Json::Value(Json::arrayValue); - app_consnets_list.append(consent_item); + app_consents_list.append(consent_item); // Returns last (appended) object - return app_consnets_list[app_consnets_list.size() - 1] + return app_consents_list[app_consents_list.size() - 1] [message_params::kModuleConsents]; } 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 4e43cff58d..c2aa639fda 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 @@ -52,7 +52,7 @@ bool RCRPCPlugin::Init( application_manager::rpc_service::RPCService& rpc_service, application_manager::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, - resumption::LastState& last_state) { + resumption::LastStateWrapperPtr last_state) { rc_consent_manager_.reset(new rc_rpc_plugin::RCConsentManagerImpl( last_state, app_manager, @@ -83,6 +83,14 @@ bool RCRPCPlugin::Init( return true; } +bool RCRPCPlugin::Init(application_manager::ApplicationManager&, + application_manager::rpc_service::RPCService&, + application_manager::HMICapabilities&, + policy::PolicyHandlerInterface&, + resumption::LastState&) { + return false; +} + bool RCRPCPlugin::IsAbleToProcess( const int32_t function_id, const application_manager::commands::Command::CommandSource diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_consent_manager.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_consent_manager.h index 147da9ed55..a89202b5f5 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_consent_manager.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_consent_manager.h @@ -46,11 +46,11 @@ class MockRCConsentManager : public rc_rpc_plugin::RCConsentManager { void(const std::string&, const std::string&, const rc_rpc_plugin::rc_rpc_types::ModuleIdConsentVector&)); - MOCK_CONST_METHOD3(GetModuleConsent, - rc_rpc_plugin::rc_rpc_types::ModuleConsent( - const std::string&, - const std::string&, - const rc_rpc_plugin::rc_rpc_types::ModuleUid&)); + MOCK_METHOD3(GetModuleConsent, + rc_rpc_plugin::rc_rpc_types::ModuleConsent( + const std::string&, + const std::string&, + const rc_rpc_plugin::rc_rpc_types::ModuleUid&)); MOCK_METHOD0(RemoveExpiredConsents, void()); MOCK_METHOD0(RemoveAllConsents, void()); }; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/rc_consent_manager_impl_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/rc_consent_manager_impl_test.cc index b4d826719a..a2e9f6d83b 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/rc_consent_manager_impl_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/rc_consent_manager_impl_test.cc @@ -40,8 +40,8 @@ #include "application_manager/mock_application_manager_settings.h" #include "rc_rpc_plugin/rc_consent_manager_impl.h" -#include "resumption/last_state.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "utils/date_time.h" #include "utils/file_system.h" @@ -76,10 +76,11 @@ class RCConsentManagerImplTest : public ::testing::Test { public: RCConsentManagerImplTest() : current_date_(0u) - , last_state_(new resumption::LastStateImpl(kAppTestStorageFolder, - kAppTestInfoStorage)) + , last_state_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>(kAppTestStorageFolder, + kAppTestInfoStorage))) , rc_consent_manager_(new rc_rpc_plugin::RCConsentManagerImpl( - *last_state_, mock_app_mngr_, kPeriodOfConsentExpired)) {} + last_state_, mock_app_mngr_, kPeriodOfConsentExpired)) {} void SetUp() OVERRIDE { current_date_ = std::time(0); @@ -102,14 +103,20 @@ class RCConsentManagerImplTest : public ::testing::Test { file_system::RemoveDirectory(kAppTestStorageFolder); } - last_state_->get_dictionary().clear(); + auto last_state_accessor = last_state_->get_accessor(); + last_state_accessor.GetMutableData().set_dictionary(Json::Value()); + } + + void SaveStateToFileSystem() { + auto last_state_accessor = last_state_->get_accessor(); + last_state_accessor.GetMutableData().SaveToFileSystem(); } protected: time_t current_date_; NiceMock<MockApplicationManagerSettings> mock_app_mnrg_settings_; NiceMock<MockApplicationManager> mock_app_mngr_; - std::unique_ptr<resumption::LastState> last_state_; + resumption::LastStateWrapperPtr last_state_; std::unique_ptr<rc_rpc_plugin::RCConsentManagerImpl> rc_consent_manager_; }; @@ -129,7 +136,7 @@ TEST_F(RCConsentManagerImplTest, SaveAndGetModuleConsents_SUCCESS) { rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress1, module_consents); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); auto radio_consent = rc_consent_manager_->GetModuleConsent( kPolicyApp1Id, kMacAddress1, {kRadioModule, radio_moduleId}); @@ -160,7 +167,7 @@ TEST_F(RCConsentManagerImplTest, ModuleId_NOT_EXISTS) { rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress1, module_consents); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); ModuleConsent consent = rc_consent_manager_->GetModuleConsent( kPolicyApp1Id, kMacAddress1, unknown_module); @@ -197,7 +204,7 @@ TEST_F(RCConsentManagerImplTest, ConsentIsExpired) { module_consent_not_expired}; rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress1, module_consents); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); // All consents, which consent has been saved more than 30 days, will be // removed. @@ -238,7 +245,7 @@ TEST_F(RCConsentManagerImplTest, rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress2, module_consents_app2); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); // Module consents for same app ids and different device_id (mac_adress) will // haven't been replaced each other @@ -280,12 +287,12 @@ TEST_F(RCConsentManagerImplTest, rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress1, module_consents_app1); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress1, module_consents_app2); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); // Module consents for same app ids and same device_id (mac_adress) will // have been replaced each other @@ -318,7 +325,7 @@ TEST_F(RCConsentManagerImplTest, RemoveAllModuleConsents_SUCCESS) { rc_consent_manager_->SaveModuleConsents( kPolicyApp1Id, kMacAddress2, module_consents_app2); - last_state_->SaveStateToFileSystem(); + SaveStateToFileSystem(); rc_consent_manager_->RemoveAllConsents(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h index 91298f4883..9c770279ab 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_rpc_plugin.h @@ -48,6 +48,13 @@ class SDLRPCPlugin : public plugins::RPCPlugin { app_mngr::rpc_service::RPCService& rpc_service, app_mngr::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, + resumption::LastStateWrapperPtr last_state) OVERRIDE; + + DEPRECATED + bool Init(app_mngr::ApplicationManager& app_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, resumption::LastState& last_state) OVERRIDE; bool IsAbleToProcess( 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 35d3fbe2f6..2a1261f643 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 @@ -45,7 +45,19 @@ bool SDLRPCPlugin::Init(app_mngr::ApplicationManager& app_manager, app_mngr::rpc_service::RPCService& rpc_service, app_mngr::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, - resumption::LastState& last_state) { + resumption::LastStateWrapperPtr last_state) { + UNUSED(last_state); + command_factory_.reset(new sdl_rpc_plugin::SDLCommandFactory( + app_manager, rpc_service, hmi_capabilities, policy_handler)); + return true; +} + +bool SDLRPCPlugin::Init( + application_manager::ApplicationManager& app_manager, + application_manager::rpc_service::RPCService& rpc_service, + application_manager::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, + resumption::LastState& last_state) { UNUSED(last_state); command_factory_.reset(new sdl_rpc_plugin::SDLCommandFactory( app_manager, rpc_service, hmi_capabilities, policy_handler)); 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 f0f68af298..80336b6967 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 @@ -49,6 +49,13 @@ class VehicleInfoPlugin : public plugins::RPCPlugin { app_mngr::rpc_service::RPCService& rpc_service, app_mngr::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, + resumption::LastStateWrapperPtr last_state) OVERRIDE; + + DEPRECATED + bool Init(app_mngr::ApplicationManager& application_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, resumption::LastState& last_state) OVERRIDE; bool IsAbleToProcess( 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 3017b6712f..3e8ef6b29d 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 @@ -53,7 +53,7 @@ bool VehicleInfoPlugin::Init( application_manager::rpc_service::RPCService& rpc_service, application_manager::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, - resumption::LastState& last_state) { + resumption::LastStateWrapperPtr last_state) { UNUSED(last_state); application_manager_ = &app_manager; custom_vehicle_data_manager_.reset( @@ -67,6 +67,25 @@ bool VehicleInfoPlugin::Init( return true; } +bool VehicleInfoPlugin::Init( + application_manager::ApplicationManager& application_manager, + application_manager::rpc_service::RPCService& rpc_service, + application_manager::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, + resumption::LastState& last_state) { + UNUSED(last_state); + application_manager_ = &application_manager; + custom_vehicle_data_manager_.reset( + new CustomVehicleDataManagerImpl(policy_handler, rpc_service)); + command_factory_.reset(new vehicle_info_plugin::VehicleInfoCommandFactory( + application_manager, + rpc_service, + hmi_capabilities, + policy_handler, + *(custom_vehicle_data_manager_.get()))); + return true; +} + bool VehicleInfoPlugin::IsAbleToProcess( const int32_t function_id, const commands::Command::CommandSource source) { return command_factory_->IsAbleToProcess(function_id, source); diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt index 95d49f9a20..a8193c17f0 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/CMakeLists.txt @@ -37,6 +37,7 @@ include_directories( ${COMPONENTS_DIR}/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/commands ${COMPONENTS_DIR}/application_manager/test/include/ ${COMPONENTS_DIR}/include/test/application_manager/ + ${COMPONENTS_DIR}/resumption/include/resumption/ ) set(COMMANDS_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/commands) @@ -53,6 +54,7 @@ file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/vehicle_data_item_schema_test.cc ${COMPONENTS_DIR}/application_manager/src/message.cc ${COMPONENTS_DIR}/application_manager/src/event_engine/* + ${COMPONENTS_DIR}/resumption/src/last_state_wrapper_impl.cc ) set(LIBRARIES diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/unsubscribe_vehicle_request_test.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/unsubscribe_vehicle_request_test.cc index 3a200ff282..450bb5ac26 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/unsubscribe_vehicle_request_test.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/unsubscribe_vehicle_request_test.cc @@ -39,6 +39,7 @@ #include "application_manager/mock_application_manager.h" #include "application_manager/mock_message_helper.h" #include "mobile/unsubscribe_vehicle_data_request.h" +#include "resumption/last_state_wrapper_impl.h" #include "resumption/mock_last_state.h" #include "vehicle_info_plugin/commands/vi_command_request_test.h" #include "vehicle_info_plugin/vehicle_info_app_extension.h" @@ -78,7 +79,9 @@ class UnsubscribeVehicleRequestTest , vi_app_extension_ptr_( std::make_shared<vehicle_info_plugin::VehicleInfoAppExtension>( vi_plugin_, *mock_app_)) - , app_set_lock_ptr_(std::make_shared<sync_primitives::Lock>()) {} + , app_set_lock_ptr_(std::make_shared<sync_primitives::Lock>()) + , mock_last_state_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption_test::MockLastState>())) {} protected: void UnsubscribeSuccessfully(); @@ -107,7 +110,7 @@ class UnsubscribeVehicleRequestTest std::shared_ptr<sync_primitives::Lock> app_set_lock_ptr_; vehicle_info_plugin::VehicleInfoPlugin vi_plugin_; application_manager_test::MockRPCHandler mock_rpc_handler_; - resumption_test::MockLastState mock_last_state_; + resumption::LastStateWrapperPtr mock_last_state_; }; TEST_F(UnsubscribeVehicleRequestTest, Run_AppNotRegistered_UNSUCCESS) { diff --git a/src/components/application_manager/src/app_launch/app_launch_data_json.cc b/src/components/application_manager/src/app_launch/app_launch_data_json.cc index 984997e424..86d585f215 100644 --- a/src/components/application_manager/src/app_launch/app_launch_data_json.cc +++ b/src/components/application_manager/src/app_launch/app_launch_data_json.cc @@ -32,26 +32,27 @@ #include "application_manager/app_launch/app_launch_data_json.h" #include <algorithm> #include "application_manager/smart_object_keys.h" -#include "smart_objects/smart_object.h" - #include "json/json.h" +#include "smart_objects/smart_object.h" #include "utils/date_time.h" namespace app_launch { CREATE_LOGGERPTR_GLOBAL(logger_, "AppLaunch") -AppLaunchDataJson::AppLaunchDataJson(const AppLaunchSettings& settings, - resumption::LastState& last_state) - : AppLaunchDataImpl(settings), last_state_(last_state) {} +AppLaunchDataJson::AppLaunchDataJson( + const AppLaunchSettings& settings, + resumption::LastStateWrapperPtr last_state_wrapper) + : AppLaunchDataImpl(settings), last_state_wrapper_(last_state_wrapper) {} AppLaunchDataJson::~AppLaunchDataJson() {} -Json::Value& AppLaunchDataJson::GetSavedApplicationDataList() const { +Json::Value& AppLaunchDataJson::GetSavedApplicationDataList( + Json::Value& dictionary) const { using namespace application_manager; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - Json::Value& app_launch = GetApplicationData(); + Json::Value& app_launch = GetApplicationData(dictionary); if (!app_launch.isMember(strings::app_launch_list)) { app_launch[strings::app_launch_list] = Json::Value(Json::arrayValue); LOG4CXX_WARN(logger_, "app_list section is missed"); @@ -64,11 +65,11 @@ Json::Value& AppLaunchDataJson::GetSavedApplicationDataList() const { return app_launch_list; } -Json::Value& AppLaunchDataJson::GetApplicationData() const { +Json::Value& AppLaunchDataJson::GetApplicationData( + Json::Value& dictionary) const { using namespace application_manager; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - Json::Value& dictionary = last_state().get_dictionary(); if (!dictionary.isMember(strings::app_launch)) { dictionary[strings::app_launch] = Json::Value(Json::objectValue); LOG4CXX_WARN(logger_, "app_launch section is missed"); @@ -82,12 +83,14 @@ Json::Value& AppLaunchDataJson::GetApplicationData() const { } Json::Value& AppLaunchDataJson::GetApplicationListAndIndex( - const ApplicationData& app_data, int32_t& founded_index) const { + const ApplicationData& app_data, + int32_t& found_index, + Json::Value& dictionary) const { using namespace application_manager; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - Json::Value& apps_list = GetSavedApplicationDataList(); + Json::Value& apps_list = GetSavedApplicationDataList(dictionary); const Json::ArrayIndex size = apps_list.size(); for (Json::ArrayIndex idx = 0; idx != size; ++idx) { @@ -103,7 +106,7 @@ Json::Value& AppLaunchDataJson::GetApplicationListAndIndex( if (deviceID == app_data.device_mac_ && bundleID == app_data.bundle_id_ && appID == app_data.mobile_app_id_) { - founded_index = idx; + found_index = idx; } } } @@ -116,7 +119,11 @@ bool AppLaunchDataJson::IsAppDataAlreadyExisted( LOG4CXX_AUTO_TRACE(logger_); int32_t index = NotFound; - GetApplicationListAndIndex(app_data, index); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + GetApplicationListAndIndex(app_data, index, dictionary); + accessor.GetMutableData().set_dictionary(dictionary); return index == NotFound ? false : true; } @@ -127,7 +134,10 @@ bool AppLaunchDataJson::RefreshAppSessionTime(const ApplicationData& app_data) { bool retVal = false; int32_t index = NotFound; - Json::Value& json_data_list = GetApplicationListAndIndex(app_data, index); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& json_data_list = + GetApplicationListAndIndex(app_data, index, dictionary); if (index != NotFound) { if (json_data_list.empty() == false) { json_data_list[index][strings::app_launch_last_session] = @@ -135,6 +145,7 @@ bool AppLaunchDataJson::RefreshAppSessionTime(const ApplicationData& app_data) { retVal = true; } } + accessor.GetMutableData().set_dictionary(dictionary); return retVal; } @@ -144,20 +155,22 @@ bool AppLaunchDataJson::AddNewAppData(const ApplicationData& app_data) { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); Json::Value& json_app_data = - GetSavedApplicationDataList().append(Json::Value()); + GetSavedApplicationDataList(dictionary).append(Json::Value()); json_app_data[strings::device_id] = app_data.device_mac_; json_app_data[strings::app_id] = app_data.mobile_app_id_; json_app_data[strings::bundle_id] = app_data.bundle_id_; json_app_data[strings::app_launch_last_session] = static_cast<Json::Value::UInt64>(getSecs(getCurrentTime())); + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG(logger_, "New application data saved. Detatils device_id: " << app_data.device_mac_ << ", app_id: " << app_data.mobile_app_id_ << ", bundle_id: " << app_data.bundle_id_ << "."); - return true; } @@ -167,7 +180,9 @@ std::vector<ApplicationDataPtr> AppLaunchDataJson::GetAppDataByDevMac( LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); std::vector<ApplicationDataPtr> dev_apps; - const Json::Value& apps_list = GetSavedApplicationDataList(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& apps_list = GetSavedApplicationDataList(dictionary); const Json::ArrayIndex size = apps_list.size(); for (Json::ArrayIndex idx = 0; idx != size; ++idx) { @@ -187,15 +202,16 @@ std::vector<ApplicationDataPtr> AppLaunchDataJson::GetAppDataByDevMac( } } } - + accessor.GetMutableData().set_dictionary(dictionary); return dev_apps; } bool AppLaunchDataJson::Clear() { LOG4CXX_AUTO_TRACE(logger_); - - GetSavedApplicationDataList().clear(); - + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + GetSavedApplicationDataList(dictionary).clear(); + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG(logger_, "Application launch JSON section successfully cleared."); @@ -204,9 +220,10 @@ bool AppLaunchDataJson::Clear() { uint32_t AppLaunchDataJson::GetCurentNumberOfAppData() const { LOG4CXX_AUTO_TRACE(logger_); - - uint32_t list_size = GetSavedApplicationDataList().size(); - + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const uint32_t list_size = GetSavedApplicationDataList(dictionary).size(); + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG(logger_, "Successfully was gotten app_launch list. Size: " << list_size); @@ -219,7 +236,9 @@ bool AppLaunchDataJson::DeleteOldestAppData() { sync_primitives::AutoLock autolock(app_launch_json_lock_); std::vector<uint64_t> temp_array; std::vector<Json::Value> temp_json_list; - Json::Value& apps_list = GetSavedApplicationDataList(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& apps_list = GetSavedApplicationDataList(dictionary); const Json::ArrayIndex size = apps_list.size(); // Search oldest record in Json @@ -241,9 +260,7 @@ bool AppLaunchDataJson::DeleteOldestAppData() { // Copy in temporary vector Json list without oldest record int32_t i = 0; - for (Json::Value::iterator it = GetSavedApplicationDataList().begin(); - it != GetSavedApplicationDataList().end(); - ++it, i++) { + for (auto it = apps_list.begin(); it != apps_list.end(); ++it, i++) { if ((*it).isMember(strings::device_id) && (*it).isMember(strings::bundle_id) && (*it).isMember(strings::app_id) && (*it).isMember(strings::app_launch_last_session)) { @@ -255,15 +272,13 @@ bool AppLaunchDataJson::DeleteOldestAppData() { } // Clear Json list - GetSavedApplicationDataList().clear(); + GetSavedApplicationDataList(dictionary).clear(); // Copy to Json new list without oldest one - for (std::vector<Json::Value>::iterator it = temp_json_list.begin(); - it != temp_json_list.end(); - ++it) { - GetSavedApplicationDataList().append((*it)); + for (const auto& item : temp_json_list) { + GetSavedApplicationDataList(dictionary).append(item); } - + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG( logger_, "Oldest application launch data had been successfully deleted."); @@ -272,8 +287,7 @@ bool AppLaunchDataJson::DeleteOldestAppData() { bool AppLaunchDataJson::Persist() { LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(app_launch_json_lock_); - last_state().SaveStateToFileSystem(); + last_state_wrapper_->get_accessor().GetMutableData().SaveToFileSystem(); return true; } diff --git a/src/components/application_manager/src/app_service_manager.cc b/src/components/application_manager/src/app_service_manager.cc index afcc7ae1dd..3e7b4b99fe 100644 --- a/src/components/application_manager/src/app_service_manager.cc +++ b/src/components/application_manager/src/app_service_manager.cc @@ -53,7 +53,7 @@ const char* kAppServiceSection = "AppServices"; const char* kDefaults = "defaults"; AppServiceManager::AppServiceManager(ApplicationManager& app_manager, - resumption::LastState& last_state) + resumption::LastStateWrapperPtr last_state) : app_manager_(app_manager) , last_state_(last_state) , rpc_passing_handler_(*this, app_manager_) {} @@ -139,13 +139,14 @@ smart_objects::SmartObject AppServiceManager::PublishAppService( std::string default_app_id = DefaultServiceByType(service_type); if (default_app_id.empty() && !mobile_service) { auto embedded_services = app_manager_.get_settings().embedded_services(); - for (auto it = embedded_services.begin(); it != embedded_services.end(); - ++it) { - if (*it == service_type) { - Json::Value& dictionary = last_state_.get_dictionary(); + for (const auto& embedded_service : embedded_services) { + if (embedded_service == service_type) { + auto last_state_accessor = last_state_->get_accessor(); + Json::Value dictionary = last_state_accessor.GetData().dictionary(); dictionary[kAppServiceSection][kDefaults][service_type] = kEmbeddedService; default_app_id = kEmbeddedService; + last_state_accessor.GetMutableData().set_dictionary(dictionary); } } } @@ -340,9 +341,11 @@ bool AppServiceManager::SetDefaultService(const std::string service_id) { } service.default_service = true; - Json::Value& dictionary = last_state_.get_dictionary(); + auto last_state_accessor = last_state_->get_accessor(); + Json::Value dictionary = last_state_accessor.GetData().dictionary(); dictionary[kAppServiceSection][kDefaults][service_type] = GetPolicyAppID(service); + last_state_accessor.GetMutableData().set_dictionary(dictionary); return true; } @@ -365,8 +368,11 @@ bool AppServiceManager::RemoveDefaultService(const std::string service_id) { std::string service_type = service.record[strings::service_manifest][strings::service_type] .asString(); - Json::Value& dictionary = last_state_.get_dictionary(); + + auto last_state_accessor = last_state_->get_accessor(); + Json::Value dictionary = last_state_accessor.GetData().dictionary(); dictionary[kAppServiceSection][kDefaults].removeMember(service_type); + last_state_accessor.GetMutableData().set_dictionary(dictionary); return true; } @@ -547,7 +553,9 @@ AppService* AppServiceManager::FindServiceByName(std::string name) { std::string AppServiceManager::DefaultServiceByType( const std::string service_type) { LOG4CXX_AUTO_TRACE(logger_); - Json::Value& dictionary = last_state_.get_dictionary(); + + auto last_state_accessor = last_state_->get_accessor(); + Json::Value dictionary = last_state_accessor.GetData().dictionary(); if (dictionary[kAppServiceSection][kDefaults].isMember(service_type)) { return dictionary[kAppServiceSection][kDefaults][service_type].asString(); } diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index f44a63d5d6..11d038fee2 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -645,23 +645,27 @@ void ApplicationImpl::WakeUpStreaming( sync_primitives::AutoLock lock(streaming_stop_lock_); if (ServiceType::kMobileNav == service_type) { - sync_primitives::AutoLock lock(video_streaming_suspended_lock_); - if (video_streaming_suspended_) { - application_manager_.OnAppStreaming(app_id(), service_type, true); - application_manager_.ProcessOnDataStreamingNotification( - service_type, app_id(), true); - video_streaming_suspended_ = false; + { // reduce the range of video_streaming_suspended_lock_ + sync_primitives::AutoLock lock(video_streaming_suspended_lock_); + if (video_streaming_suspended_) { + application_manager_.OnAppStreaming(app_id(), service_type, true); + 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); } else if (ServiceType::kAudio == service_type) { - sync_primitives::AutoLock lock(audio_streaming_suspended_lock_); - if (audio_streaming_suspended_) { - application_manager_.OnAppStreaming(app_id(), service_type, true); - application_manager_.ProcessOnDataStreamingNotification( - service_type, app_id(), true); - audio_streaming_suspended_ = false; + { // reduce the range of audio_streaming_suspended_lock_ + sync_primitives::AutoLock lock(audio_streaming_suspended_lock_); + if (audio_streaming_suspended_) { + application_manager_.OnAppStreaming(app_id(), service_type, true); + 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, diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index b727f6d621..7d7e2b30df 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -2365,11 +2365,21 @@ void ApplicationManagerImpl::RemoveHMIFakeParameters( (*message)[jhs::S_PARAMS][jhs::S_FUNCTION_ID] = mobile_function_id; } -bool ApplicationManagerImpl::Init(resumption::LastState& last_state, - media_manager::MediaManager* media_manager) { +bool ApplicationManagerImpl::Init(resumption::LastState&, + media_manager::MediaManager*) { + return false; +} + +bool ApplicationManagerImpl::Init( + resumption::LastStateWrapperPtr last_state_wrapper, + media_manager::MediaManager* media_manager) { LOG4CXX_TRACE(logger_, "Init application manager"); - plugin_manager_.reset(new plugin_manager::RPCPluginManagerImpl( - *this, *rpc_service_, *hmi_capabilities_, *policy_handler_, last_state)); + plugin_manager_.reset( + new plugin_manager::RPCPluginManagerImpl(*this, + *rpc_service_, + *hmi_capabilities_, + *policy_handler_, + last_state_wrapper)); if (!plugin_manager_->LoadPlugins(get_settings().plugins_folder())) { LOG4CXX_ERROR(logger_, "Plugins are not loaded"); return false; @@ -2379,11 +2389,11 @@ bool ApplicationManagerImpl::Init(resumption::LastState& last_state, !IsReadWriteAllowed(app_storage_folder, TYPE_STORAGE)) { return false; } - if (!resume_controller().Init(last_state)) { + if (!resume_controller().Init(last_state_wrapper)) { LOG4CXX_ERROR(logger_, "Problem with initialization of resume controller"); return false; } - hmi_capabilities_->Init(&last_state); + hmi_capabilities_->Init(last_state_wrapper); if (!(file_system::IsWritingAllowed(app_storage_folder) && file_system::IsReadingAllowed(app_storage_folder))) { @@ -2425,13 +2435,13 @@ bool ApplicationManagerImpl::Init(resumption::LastState& last_state, app_launch_dto_.reset(new app_launch::AppLaunchDataDB(settings_)); } else { app_launch_dto_.reset( - new app_launch::AppLaunchDataJson(settings_, last_state)); + new app_launch::AppLaunchDataJson(settings_, last_state_wrapper)); } app_launch_ctrl_.reset(new app_launch::AppLaunchCtrlImpl( *app_launch_dto_.get(), *this, settings_)); app_service_manager_.reset( - new application_manager::AppServiceManager(*this, last_state)); + new application_manager::AppServiceManager(*this, last_state_wrapper)); auto on_app_policy_updated = [](plugin_manager::RPCPlugin& plugin) { plugin.OnPolicyEvent(plugin_manager::kApplicationPolicyUpdated); diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index c66a8b9905..6a0fbf78e3 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -736,8 +736,9 @@ void HMICapabilitiesImpl::set_seat_location_capability( new smart_objects::SmartObject(seat_location_capability); } -void HMICapabilitiesImpl::Init(resumption::LastState* last_state) { - hmi_language_handler_.Init(last_state); +void HMICapabilitiesImpl::Init( + resumption::LastStateWrapperPtr last_state_wrapper) { + hmi_language_handler_.Init(last_state_wrapper); if (false == load_capabilities_from_file()) { LOG4CXX_ERROR(logger_, "file hmi_capabilities.json was not loaded"); } else { @@ -747,6 +748,8 @@ void HMICapabilitiesImpl::Init(resumption::LastState* last_state) { ui_language_, vr_language_, tts_language_); } +void HMICapabilitiesImpl::Init(resumption::LastState*) {} + bool HMICapabilitiesImpl::is_ui_cooperating() const { return is_ui_cooperating_; } diff --git a/src/components/application_manager/src/hmi_language_handler.cc b/src/components/application_manager/src/hmi_language_handler.cc index e206633ae2..46231c4596 100644 --- a/src/components/application_manager/src/hmi_language_handler.cc +++ b/src/components/application_manager/src/hmi_language_handler.cc @@ -35,7 +35,7 @@ #include "application_manager/hmi_capabilities.h" #include "application_manager/message_helper.h" #include "application_manager/rpc_service.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "smart_objects/smart_object.h" #include "utils/helpers.h" @@ -81,9 +81,10 @@ void HMILanguageHandler::set_language_for( LOG4CXX_DEBUG( logger_, "Setting language " << language << " for interface " << interface); - Json::Value& dictionary = last_state_->get_dictionary(); - dictionary[LanguagesKey][key] = language; - return; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + dictionary[LanguagesKey][key] = static_cast<int32_t>(language); + accessor.GetMutableData().set_dictionary(dictionary); } hmi_apis::Common_Language::eType HMILanguageHandler::get_language_for( @@ -107,7 +108,8 @@ hmi_apis::Common_Language::eType HMILanguageHandler::get_language_for( return Common_Language::INVALID_ENUM; } - const Json::Value& dictionary = last_state_->get_dictionary(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); if (dictionary.isMember(LanguagesKey)) { if (dictionary[LanguagesKey].isMember(key)) { Common_Language::eType language = static_cast<Common_Language::eType>( @@ -342,8 +344,8 @@ void HMILanguageHandler::CheckApplication(const Apps::value_type app) { } } -void HMILanguageHandler::Init(resumption::LastState* value) { - last_state_ = value; +void HMILanguageHandler::Init(resumption::LastStateWrapperPtr value) { + last_state_wrapper_ = value; persisted_ui_language_ = get_language_for(INTERFACE_UI); persisted_vr_language_ = get_language_for(INTERFACE_VR); persisted_tts_language_ = get_language_for(INTERFACE_TTS); diff --git a/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc b/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc index 0c7ec9838b..9214a30513 100644 --- a/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc +++ b/src/components/application_manager/src/plugin_manager/rpc_plugin_manager_impl.cc @@ -13,7 +13,7 @@ RPCPluginManagerImpl::RPCPluginManagerImpl( rpc_service::RPCService& rpc_service, HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, - resumption::LastState& last_state) + resumption::LastStateWrapperPtr last_state) : app_manager_(app_manager) , rpc_service_(rpc_service) , hmi_capabilities_(hmi_capabilities) diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 64e15d7134..b70fcfef86 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -426,8 +426,8 @@ bool PolicyHandler::ClearUserConsent() { uint32_t PolicyHandler::GetAppIdForSending() const { LOG4CXX_AUTO_TRACE(logger_); POLICY_LIB_CHECK(0); - const ApplicationSet& accessor = - application_manager_.applications().GetData(); + // fix ApplicationSet access crash + const ApplicationSet accessor = application_manager_.applications().GetData(); HMILevelPredicate has_none_level(mobile_api::HMILevel::HMI_NONE); Applications apps_without_none_level; 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 d5490c8730..486cb76369 100644 --- a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc +++ b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc @@ -91,7 +91,7 @@ bool ResumeCtrlImpl::get_resumption_active() const { } #endif // BUILD_TESTS -bool ResumeCtrlImpl::Init(resumption::LastState& last_state) { +bool ResumeCtrlImpl::Init(resumption::LastStateWrapperPtr last_state_wrapper) { bool use_db = application_manager_.get_settings().use_db_for_resumption(); if (use_db) { resumption_storage_.reset( @@ -120,7 +120,7 @@ bool ResumeCtrlImpl::Init(resumption::LastState& last_state) { } } else { resumption_storage_.reset( - new ResumptionDataJson(last_state, application_manager_)); + new ResumptionDataJson(last_state_wrapper, application_manager_)); if (!resumption_storage_->Init()) { LOG4CXX_DEBUG(logger_, "Resumption storage initialisation failed"); return false; @@ -377,6 +377,10 @@ void ResumeCtrlImpl::RemoveFromResumption(uint32_t app_id) { queue_lock_.Release(); } +bool ResumeCtrlImpl::Init(LastState&) { + return false; +} + bool ResumeCtrlImpl::SetAppHMIState( ApplicationSharedPtr application, const mobile_apis::HMILevel::eType hmi_level, diff --git a/src/components/application_manager/src/resumption/resumption_data_json.cc b/src/components/application_manager/src/resumption/resumption_data_json.cc index 5da47d31ce..3623c18b90 100644 --- a/src/components/application_manager/src/resumption/resumption_data_json.cc +++ b/src/components/application_manager/src/resumption/resumption_data_json.cc @@ -46,9 +46,10 @@ namespace formatters = ns_smart_device_link::ns_json_handler::formatters; CREATE_LOGGERPTR_GLOBAL(logger_, "Resumption") ResumptionDataJson::ResumptionDataJson( - LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const application_manager::ApplicationManager& application_manager) - : ResumptionData(application_manager), last_state_(last_state) {} + : ResumptionData(application_manager) + , last_state_wrapper_(last_state_wrapper) {} void ResumptionDataJson::SaveApplication( app_mngr::ApplicationSharedPtr application) { @@ -69,9 +70,11 @@ void ResumptionDataJson::SaveApplication( const bool is_subscribed_for_way_points = application_manager_.IsAppSubscribedForWayPoints(application); - sync_primitives::AutoLock autolock(resumption_lock_); Json::Value tmp; - Json::Value& json_app = GetFromSavedOrAppend(policy_app_id, device_mac); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& json_app = + GetFromSavedOrAppend(policy_app_id, device_mac, dictionary); json_app[strings::device_id] = device_mac; json_app[strings::app_id] = policy_app_id; @@ -106,18 +109,21 @@ void ResumptionDataJson::SaveApplication( json_app[strings::time_stamp] = time_stamp; json_app[strings::subscribed_for_way_points] = is_subscribed_for_way_points; + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG(logger_, "SaveApplication : " << json_app.toStyledString()); } bool ResumptionDataJson::IsHMIApplicationIdExist(uint32_t hmi_app_id) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - for (Json::Value::iterator it = GetSavedApplications().begin(); - it != GetSavedApplications().end(); - ++it) { - if ((*it).isMember(strings::hmi_app_id)) { - if ((*it)[strings::hmi_app_id].asUInt() == hmi_app_id) { + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& saved_apps = GetSavedApplications(dictionary); + + for (const auto& saved_app : saved_apps) { + if (saved_app.isMember(strings::hmi_app_id)) { + if (saved_app[strings::hmi_app_id].asUInt() == hmi_app_id) { return true; } } @@ -129,7 +135,7 @@ uint32_t ResumptionDataJson::GetHMIApplicationID( const std::string& policy_app_id, const std::string& device_id) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + uint32_t hmi_app_id = 0; const int idx = GetObjectIndex(policy_app_id, device_id); @@ -137,8 +143,9 @@ uint32_t ResumptionDataJson::GetHMIApplicationID( LOG4CXX_WARN(logger_, "Application not saved"); return hmi_app_id; } - - const Json::Value& json_app = GetSavedApplications()[idx]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& json_app = GetSavedApplications(dictionary)[idx]; if (json_app.isMember(strings::app_id) && json_app.isMember(strings::device_id)) { hmi_app_id = json_app[strings::hmi_app_id].asUInt(); @@ -150,47 +157,51 @@ uint32_t ResumptionDataJson::GetHMIApplicationID( void ResumptionDataJson::IncrementIgnOffCount() { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + Json::Value to_save = Json::arrayValue; - for (Json::Value::iterator it = GetSavedApplications().begin(); - it != GetSavedApplications().end(); - ++it) { - if ((*it).isMember(strings::ign_off_count)) { - Json::Value& ign_off_count = (*it)[strings::ign_off_count]; + Json::Value dictionary; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + dictionary = accessor.GetData().dictionary(); + Json::Value& saved_apps = GetSavedApplications(dictionary); + for (auto& json_app : saved_apps) { + if (json_app.isMember(strings::ign_off_count)) { + Json::Value& ign_off_count = json_app[strings::ign_off_count]; const uint32_t counter_value = ign_off_count.asUInt(); ign_off_count = counter_value + 1; } else { LOG4CXX_WARN(logger_, "Unknown key among saved applications"); - Json::Value& ign_off_count = (*it)[strings::ign_off_count]; + Json::Value& ign_off_count = json_app[strings::ign_off_count]; ign_off_count = 1; } - to_save.append(*it); + to_save.append(json_app); } - SetSavedApplication(to_save); - SetLastIgnOffTime(time(NULL)); - LOG4CXX_DEBUG(logger_, GetResumptionData().toStyledString()); + SetSavedApplication(to_save, dictionary); + SetLastIgnOffTime(time(nullptr), dictionary); + accessor.GetMutableData().set_dictionary(dictionary); + LOG4CXX_DEBUG(logger_, GetResumptionData(dictionary).toStyledString()); } void ResumptionDataJson::DecrementIgnOffCount() { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - for (Json::Value::iterator it = GetSavedApplications().begin(); - it != GetSavedApplications().end(); - ++it) { - if ((*it).isMember(strings::ign_off_count)) { - const uint32_t ign_off_count = (*it)[strings::ign_off_count].asUInt(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& saved_apps = GetSavedApplications(dictionary); + for (auto& saved_app : saved_apps) { + if (saved_app.isMember(strings::ign_off_count)) { + const uint32_t ign_off_count = saved_app[strings::ign_off_count].asUInt(); if (0 == ign_off_count) { LOG4CXX_WARN(logger_, "Application has not been suspended"); } else { - (*it)[strings::ign_off_count] = ign_off_count - 1; + saved_app[strings::ign_off_count] = ign_off_count - 1; } } else { LOG4CXX_WARN(logger_, "Unknown key among saved applications"); - (*it)[strings::ign_off_count] = 0; + saved_app[strings::ign_off_count] = 0; } } + accessor.GetMutableData().set_dictionary(dictionary); } bool ResumptionDataJson::GetHashId(const std::string& policy_app_id, @@ -198,14 +209,16 @@ bool ResumptionDataJson::GetHashId(const std::string& policy_app_id, std::string& hash_id) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + const int idx = GetObjectIndex(policy_app_id, device_id); if (-1 == idx) { LOG4CXX_WARN(logger_, "Application not saved"); return false; } - const Json::Value& json_app = GetSavedApplications()[idx]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& json_app = GetSavedApplications(dictionary)[idx]; LOG4CXX_DEBUG(logger_, "Saved_application_data: " << json_app.toStyledString()); if (json_app.isMember(strings::hash_id) && @@ -223,12 +236,14 @@ bool ResumptionDataJson::GetSavedApplication( smart_objects::SmartObject& saved_app) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + const int idx = GetObjectIndex(policy_app_id, device_id); if (-1 == idx) { return false; } - const Json::Value& json_saved_app = GetSavedApplications()[idx]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& json_saved_app = GetSavedApplications(dictionary)[idx]; formatters::CFormatterJsonBase::jsonValueToObj(json_saved_app, saved_app); return true; @@ -238,46 +253,50 @@ bool ResumptionDataJson::RemoveApplicationFromSaved( const std::string& policy_app_id, const std::string& device_id) { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + bool result = false; std::vector<Json::Value> temp; - for (Json::Value::iterator it = GetSavedApplications().begin(); - it != GetSavedApplications().end(); - ++it) { - if ((*it).isMember(strings::app_id) && (*it).isMember(strings::device_id)) { - const std::string& saved_policy_app_id = - (*it)[strings::app_id].asString(); - const std::string& saved_device_id = (*it)[strings::device_id].asString(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& saved_apps = GetSavedApplications(dictionary); + for (auto& app : saved_apps) { + if (app.isMember(strings::app_id) && app.isMember(strings::device_id)) { + const std::string& saved_policy_app_id = app[strings::app_id].asString(); + const std::string& saved_device_id = app[strings::device_id].asString(); if (saved_policy_app_id == policy_app_id && saved_device_id == device_id) { result = true; } else { - temp.push_back((*it)); + temp.push_back(app); } } } if (false == result) { LOG4CXX_TRACE(logger_, "EXIT result: " << (result ? "true" : "false")); + accessor.GetMutableData().set_dictionary(dictionary); return result; } - GetSavedApplications().clear(); - for (std::vector<Json::Value>::iterator it = temp.begin(); it != temp.end(); - ++it) { - GetSavedApplications().append((*it)); + GetSavedApplications(dictionary).clear(); + for (auto& app : temp) { + GetSavedApplications(dictionary).append(app); } LOG4CXX_TRACE(logger_, "EXIT result: " << (result ? "true" : "false")); + accessor.GetMutableData().set_dictionary(dictionary); return result; } uint32_t ResumptionDataJson::GetIgnOffTime() const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& resumption = GetResumptionData(); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& resumption = GetResumptionData(dictionary); if (!resumption.isMember(strings::last_ign_off_time)) { resumption[strings::last_ign_off_time] = 0; + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_WARN(logger_, "last_save_time section is missed"); } return resumption[strings::last_ign_off_time].asUInt(); @@ -286,8 +305,10 @@ uint32_t ResumptionDataJson::GetIgnOffTime() const { uint32_t ResumptionDataJson::GetGlobalIgnOnCounter() const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& resumption = GetResumptionData(); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& resumption = GetResumptionData(dictionary); if (resumption.isMember(strings::global_ign_on_counter)) { const uint32_t global_ign_on_counter = resumption[strings::global_ign_on_counter].asUInt(); @@ -300,8 +321,10 @@ uint32_t ResumptionDataJson::GetGlobalIgnOnCounter() const { void ResumptionDataJson::IncrementGlobalIgnOnCounter() { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& resumption = GetResumptionData(); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& resumption = GetResumptionData(dictionary); if (resumption.isMember(strings::global_ign_on_counter)) { const uint32_t global_ign_on_counter = resumption[strings::global_ign_on_counter].asUInt(); @@ -315,64 +338,71 @@ void ResumptionDataJson::IncrementGlobalIgnOnCounter() { } else { resumption[strings::global_ign_on_counter] = 1; } - last_state().SaveStateToFileSystem(); + accessor.GetMutableData().set_dictionary(dictionary); + accessor.GetMutableData().SaveToFileSystem(); } void ResumptionDataJson::ResetGlobalIgnOnCount() { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& resumption = GetResumptionData(); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& resumption = GetResumptionData(dictionary); resumption[strings::global_ign_on_counter] = 0; + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG(logger_, "Global IGN ON counter resetting"); } ssize_t ResumptionDataJson::IsApplicationSaved( const std::string& policy_app_id, const std::string& device_id) const { LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + return GetObjectIndex(policy_app_id, device_id); } Json::Value& ResumptionDataJson::GetFromSavedOrAppend( - const std::string& policy_app_id, const std::string& device_id) const { + const std::string& policy_app_id, + const std::string& device_id, + Json::Value& dictionary) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - for (Json::Value::iterator it = GetSavedApplications().begin(); - it != GetSavedApplications().end(); - ++it) { - if (device_id == (*it)[strings::device_id].asString() && - policy_app_id == (*it)[strings::app_id].asString()) { - return *it; + + Json::Value& saved_apps = GetSavedApplications(dictionary); + for (auto& saved_app : saved_apps) { + if (device_id == saved_app[strings::device_id].asString() && + policy_app_id == saved_app[strings::app_id].asString()) { + return saved_app; } } - return GetSavedApplications().append(Json::Value()); + return GetSavedApplications(dictionary).append(Json::Value()); } void ResumptionDataJson::GetDataForLoadResumeData( smart_objects::SmartObject& saved_data) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + smart_objects::SmartObject so_array_data(smart_objects::SmartType_Array); int i = 0; - for (Json::Value::iterator it = GetSavedApplications().begin(); - it != GetSavedApplications().end(); - ++it) { - if (((*it).isMember(strings::hmi_level)) && - ((*it).isMember(strings::ign_off_count)) && - ((*it).isMember(strings::time_stamp)) && - ((*it).isMember(strings::app_id)) && - ((*it).isMember(strings::device_id))) { + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& saved_apps = GetSavedApplications(dictionary); + + for (auto& saved_app : saved_apps) { + if ((saved_app.isMember(strings::hmi_level)) && + (saved_app.isMember(strings::ign_off_count)) && + (saved_app.isMember(strings::time_stamp)) && + (saved_app.isMember(strings::app_id)) && + (saved_app.isMember(strings::device_id))) { smart_objects::SmartObject so(smart_objects::SmartType_Map); - so[strings::hmi_level] = (*it)[strings::hmi_level].asInt(); - so[strings::ign_off_count] = (*it)[strings::ign_off_count].asInt(); - so[strings::time_stamp] = (*it)[strings::time_stamp].asUInt(); - so[strings::app_id] = (*it)[strings::app_id].asString(); - so[strings::device_id] = (*it)[strings::device_id].asString(); + so[strings::hmi_level] = saved_app[strings::hmi_level].asInt(); + so[strings::ign_off_count] = saved_app[strings::ign_off_count].asInt(); + so[strings::time_stamp] = saved_app[strings::time_stamp].asUInt(); + so[strings::app_id] = saved_app[strings::app_id].asString(); + so[strings::device_id] = saved_app[strings::device_id].asString(); so_array_data[i++] = so; } } @@ -397,14 +427,18 @@ void ResumptionDataJson::UpdateHmiLevel( << policy_app_id << " device_id = " << device_id); return; } - GetSavedApplications()[idx][strings::hmi_level] = hmi_level; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + GetSavedApplications(dictionary)[idx][strings::hmi_level] = hmi_level; + accessor.GetMutableData().set_dictionary(dictionary); } -Json::Value& ResumptionDataJson::GetSavedApplications() const { +Json::Value& ResumptionDataJson::GetSavedApplications( + Json::Value& dictionary) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& resumption = GetResumptionData(); + + Json::Value& resumption = GetResumptionData(dictionary); if (!resumption.isMember(strings::resume_app_list)) { resumption[strings::resume_app_list] = Json::Value(Json::arrayValue); LOG4CXX_WARN(logger_, "app_list section is missed"); @@ -417,11 +451,11 @@ Json::Value& ResumptionDataJson::GetSavedApplications() const { return resume_app_list; } -Json::Value& ResumptionDataJson::GetResumptionData() const { +Json::Value& ResumptionDataJson::GetResumptionData( + Json::Value& dictionary) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& dictionary = last_state().get_dictionary(); + if (!dictionary.isMember(strings::resumption)) { dictionary[strings::resumption] = Json::Value(Json::objectValue); LOG4CXX_WARN(logger_, "resumption section is missed"); @@ -438,8 +472,10 @@ ssize_t ResumptionDataJson::GetObjectIndex(const std::string& policy_app_id, const std::string& device_id) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - const Json::Value& apps = GetSavedApplications(); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& apps = GetSavedApplications(dictionary); const Json::ArrayIndex size = apps.size(); Json::ArrayIndex idx = 0; for (; idx != size; ++idx) { @@ -460,8 +496,10 @@ ssize_t ResumptionDataJson::GetObjectIndex(const std::string& policy_app_id, bool ResumptionDataJson::IsResumptionDataValid(uint32_t index) const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - const Json::Value& json_app = GetSavedApplications()[index]; + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& json_app = GetSavedApplications(dictionary)[index]; if (!json_app.isMember(strings::app_id) || !json_app.isMember(strings::ign_off_count) || !json_app.isMember(strings::hmi_level) || @@ -481,19 +519,21 @@ bool ResumptionDataJson::IsResumptionDataValid(uint32_t index) const { return true; } -void ResumptionDataJson::SetSavedApplication(Json::Value& apps_json) { +void ResumptionDataJson::SetSavedApplication(Json::Value& apps_json, + Json::Value& dictionary) { LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& app_list = GetSavedApplications(); + + Json::Value& app_list = GetSavedApplications(dictionary); app_list = apps_json; } -void ResumptionDataJson::SetLastIgnOffTime(time_t ign_off_time) { +void ResumptionDataJson::SetLastIgnOffTime(time_t ign_off_time, + Json::Value& dictionary) { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock autolock(resumption_lock_); + LOG4CXX_WARN(logger_, "ign_off_time = " << ign_off_time); - Json::Value& resumption = GetResumptionData(); + Json::Value& resumption = GetResumptionData(dictionary); resumption[strings::last_ign_off_time] = static_cast<uint32_t>(ign_off_time); } @@ -506,8 +546,11 @@ bool ResumptionDataJson::DropAppDataResumption(const std::string& device_id, const std::string& app_id) { LOG4CXX_AUTO_TRACE(logger_); using namespace app_mngr; - sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& application = GetFromSavedOrAppend(app_id, device_id); + + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& application = + GetFromSavedOrAppend(app_id, device_id, dictionary); if (application.isNull()) { LOG4CXX_DEBUG(logger_, "Application " << app_id << " with device_id " << device_id @@ -521,6 +564,7 @@ bool ResumptionDataJson::DropAppDataResumption(const std::string& device_id, application[strings::application_subscriptions].clear(); application[strings::application_files].clear(); application.removeMember(strings::grammar_id); + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_DEBUG(logger_, "Resumption data for application " << app_id << " with device_id " << device_id @@ -529,10 +573,11 @@ bool ResumptionDataJson::DropAppDataResumption(const std::string& device_id, } void ResumptionDataJson::Persist() { - // We lock the resumption data because SaveStateToFileSystem accesses - // the same dictionary that we use here in ResumptionDataJson - sync_primitives::AutoLock autolock(resumption_lock_); - last_state().SaveStateToFileSystem(); + last_state_wrapper_->get_accessor().GetMutableData().SaveToFileSystem(); +} + +LastState& ResumptionDataJson::last_state() const { + return last_state_wrapper_->get_accessor().GetMutableData(); } } // namespace resumption diff --git a/src/components/application_manager/src/state_controller_impl.cc b/src/components/application_manager/src/state_controller_impl.cc index 1bf4c2bf66..b07a5bcc13 100644 --- a/src/components/application_manager/src/state_controller_impl.cc +++ b/src/components/application_manager/src/state_controller_impl.cc @@ -976,6 +976,7 @@ int64_t StateControllerImpl::RequestHMIStateChange( void StateControllerImpl::ApplyPostponedStateForApp(ApplicationSharedPtr app) { LOG4CXX_AUTO_TRACE(logger_); + DCHECK_OR_RETURN_VOID(app); const WindowIds window_ids = app->GetWindowIds(); for (const auto& window_id : window_ids) { diff --git a/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc b/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc index 12a375685e..f7bd636a66 100644 --- a/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc +++ b/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc @@ -39,6 +39,7 @@ #include "gtest/gtest.h" #include "json/json.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "smart_objects/smart_object.h" #include "utils/date_time.h" #include "utils/file_system.h" @@ -66,8 +67,9 @@ class AppLaunchDataJsonTest : public ::testing::Test { private: virtual void SetUp() { ::file_system::DeleteFile(kAppStorageFile); - test_last_state_ = std::unique_ptr<resumption::LastState>( - new resumption::LastStateImpl(kAppStorageFolder, kAppInfoStorage)); + last_state_wrapper_ = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>(kAppStorageFolder, + kAppInfoStorage)); ASSERT_TRUE(::file_system::CreateFile(kAppStorageFile)); NiceMock<app_launch_test::MockAppLaunchSettings> mock_app_launch_settings_; @@ -75,7 +77,7 @@ class AppLaunchDataJsonTest : public ::testing::Test { .WillByDefault(Return(15u)); res_json_.reset( - new AppLaunchDataJson(mock_app_launch_settings_, *test_last_state_)); + new AppLaunchDataJson(mock_app_launch_settings_, last_state_wrapper_)); } public: @@ -101,7 +103,7 @@ class AppLaunchDataJsonTest : public ::testing::Test { void GetApplicationData_EXPECT_FALSE(const ApplicationData& in_data); std::string AddCounter(const std::string& inp, int32_t val); - std::unique_ptr<resumption::LastState> test_last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; std::unique_ptr<AppLaunchDataJson> res_json_; void SetTimestamp(const ApplicationData& in_data, date_time::TimeDuration& timestamp); @@ -133,9 +135,11 @@ date_time::TimeDuration AppLaunchDataJsonTest::GetApplicationData_EXPECT_TRUE( const ApplicationData& in_data, ApplicationData& out_data) { uint32_t sizeBeforeGetting = res_json()->GetCurentNumberOfAppData(); + Json::Value dictionary = + last_state_wrapper_->get_accessor().GetData().dictionary(); int32_t index = NotFound; Json::Value& json_data_list = - res_json()->GetApplicationListAndIndex(in_data, index); + res_json()->GetApplicationListAndIndex(in_data, index, dictionary); EXPECT_FALSE(index == NotFound); uint32_t sizeAfterGetting = res_json()->GetCurentNumberOfAppData(); @@ -150,7 +154,8 @@ date_time::TimeDuration AppLaunchDataJsonTest::GetApplicationData_EXPECT_TRUE( // time stamp date_time::TimeDuration tmVal = date_time::seconds( json_data_list[index][am::strings::app_launch_last_session].asUInt64()); - + last_state_wrapper_->get_accessor().GetMutableData().set_dictionary( + dictionary); return tmVal; } @@ -158,12 +163,15 @@ void AppLaunchDataJsonTest::GetApplicationData_EXPECT_FALSE( const ApplicationData& in_data) { uint32_t sizeBeforeGetting = res_json()->GetCurentNumberOfAppData(); + Json::Value dictionary = + last_state_wrapper_->get_accessor().GetData().dictionary(); int32_t index = NotFound; - res_json()->GetApplicationListAndIndex(in_data, index); + res_json()->GetApplicationListAndIndex(in_data, index, dictionary); EXPECT_TRUE(index == NotFound); uint32_t sizeAfterGetting = res_json()->GetCurentNumberOfAppData(); - + last_state_wrapper_->get_accessor().GetMutableData().set_dictionary( + dictionary); EXPECT_EQ(sizeBeforeGetting, sizeAfterGetting); } @@ -172,8 +180,10 @@ void AppLaunchDataJsonTest::SetTimestamp(const ApplicationData& in_data, uint32_t sizeBeforeGetting = res_json()->GetCurentNumberOfAppData(); int32_t index = NotFound; + Json::Value dictionary = + last_state_wrapper_->get_accessor().GetData().dictionary(); Json::Value& json_data_list = - res_json()->GetApplicationListAndIndex(in_data, index); + res_json()->GetApplicationListAndIndex(in_data, index, dictionary); EXPECT_FALSE(index == NotFound); uint32_t sizeAfterGetting = res_json()->GetCurentNumberOfAppData(); @@ -184,6 +194,8 @@ void AppLaunchDataJsonTest::SetTimestamp(const ApplicationData& in_data, // time stamp json_data_list[index][am::strings::app_launch_last_session] = static_cast<Json::Value::UInt64>(date_time::getSecs(timestamp)); + last_state_wrapper_->get_accessor().GetMutableData().set_dictionary( + dictionary); } std::string AppLaunchDataJsonTest::AddCounter(const std::string& inp, diff --git a/src/components/application_manager/test/app_service_manager_test.cc b/src/components/application_manager/test/app_service_manager_test.cc index daabdeedf4..c2e48c3eda 100644 --- a/src/components/application_manager/test/app_service_manager_test.cc +++ b/src/components/application_manager/test/app_service_manager_test.cc @@ -38,6 +38,7 @@ #include "application_manager/mock_application_manager_settings.h" #include "application_manager/mock_message_helper.h" #include "application_manager/smart_object_keys.h" +#include "resumption/last_state_wrapper_impl.h" #include "resumption/mock_last_state.h" #include "smart_objects/smart_object.h" @@ -85,7 +86,10 @@ class AppServiceManagerTest : public testing::Test { AppServiceManagerTest() : mock_app_ptr_(new MockApplication) , mock_app_ptr2_(new MockApplication) - , app_service_manager_(mock_app_manager_, mock_last_state_) + , mock_last_state_(std::make_shared<resumption_test::MockLastState>()) + , last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( + mock_last_state_)) + , app_service_manager_(mock_app_manager_, last_state_wrapper_) , mock_message_helper_( application_manager::MockMessageHelper::message_helper_mock()) { Mock::VerifyAndClearExpectations(mock_message_helper_); @@ -105,7 +109,7 @@ class AppServiceManagerTest : public testing::Test { .WillByDefault(Return(kPolicyAppId)); ON_CALL(*mock_app_ptr2_, policy_app_id()) .WillByDefault(Return(kPolicyAppId2)); - ON_CALL(mock_last_state_, get_dictionary()).WillByDefault(ReturnRef(dict_)); + ON_CALL(*mock_last_state_, dictionary()).WillByDefault(Return(dict_)); auto app_ptr = std::static_pointer_cast<am::Application>(mock_app_ptr_); auto app_ptr2 = std::static_pointer_cast<am::Application>(mock_app_ptr2_); ON_CALL(mock_app_manager_, application(kConnectionKey)) @@ -134,8 +138,7 @@ class AppServiceManagerTest : public testing::Test { GenerateMediaManifest(true, service_name); Json::Value empty_json; - EXPECT_CALL(mock_last_state_, get_dictionary()) - .WillOnce(ReturnRef(empty_json)); + EXPECT_CALL(*mock_last_state_, dictionary()).WillOnce(Return(empty_json)); EXPECT_CALL(*mock_message_helper_, BroadcastCapabilityUpdate( @@ -201,7 +204,8 @@ class AppServiceManagerTest : public testing::Test { std::shared_ptr<MockApplication> mock_app_ptr_; std::shared_ptr<MockApplication> mock_app_ptr2_; MockApplicationManager mock_app_manager_; - resumption_test::MockLastState mock_last_state_; + std::shared_ptr<resumption_test::MockLastState> mock_last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; MockApplicationManagerSettings mock_settings_; application_manager::AppServiceManager app_service_manager_; application_manager::MockMessageHelper* mock_message_helper_; @@ -211,8 +215,7 @@ TEST_F(AppServiceManagerTest, PublishAppService_Mobile_SUCCESS) { smart_objects::SmartObject manifest = GenerateMediaManifest(true); Json::Value empty_json; - EXPECT_CALL(mock_last_state_, get_dictionary()) - .WillOnce(ReturnRef(empty_json)); + EXPECT_CALL(*mock_last_state_, dictionary()).WillOnce(Return(empty_json)); smart_objects::SmartObject syscap_update_published; EXPECT_CALL( @@ -260,8 +263,7 @@ TEST_F(AppServiceManagerTest, PublishAppService_HMI_SUCCESS) { smart_objects::SmartObject manifest = GenerateMediaManifest(true); Json::Value empty_json; - EXPECT_CALL(mock_last_state_, get_dictionary()) - .WillOnce(ReturnRef(empty_json)); + EXPECT_CALL(*mock_last_state_, dictionary()).WillOnce(Return(empty_json)); smart_objects::SmartObject syscap_update_published; EXPECT_CALL( @@ -457,4 +459,4 @@ TEST_F(AppServiceManagerTest, GetActiveServices_OneService_SUCCESS) { } // namespace application_manager_test } // namespace components -} // namespace test
\ No newline at end of file +} // namespace test diff --git a/src/components/application_manager/test/application_helper_test.cc b/src/components/application_manager/test/application_helper_test.cc index d9d590a171..ec84acc697 100644 --- a/src/components/application_manager/test/application_helper_test.cc +++ b/src/components/application_manager/test/application_helper_test.cc @@ -52,6 +52,7 @@ #include "utils/macro.h" #include "media_manager/mock_media_manager.h" +#include "resumption/last_state_wrapper_impl.h" #include "test/resumption/mock_last_state.h" namespace { @@ -118,7 +119,10 @@ class ApplicationHelperTest : public testing::Test { const std::string path_to_plagin = ""; EXPECT_CALL(mock_application_manager_settings_, plugins_folder()) .WillOnce(ReturnRef(path_to_plagin)); - app_manager_impl_.Init(mock_last_state_, &mock_media_manager_); + mock_last_state_ = std::make_shared<MockLastState>(); + last_state_wrapper_ = + std::make_shared<resumption::LastStateWrapperImpl>(mock_last_state_); + app_manager_impl_.Init(last_state_wrapper_, &mock_media_manager_); app_impl_ = std::make_shared<ApplicationImpl>( application_id, @@ -136,7 +140,8 @@ class ApplicationHelperTest : public testing::Test { ApplicationManagerImpl app_manager_impl_; MockMediaManager mock_media_manager_; - MockLastState mock_last_state_; + std::shared_ptr<MockLastState> mock_last_state_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; ApplicationSharedPtr app_impl_; }; 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 82ae42e88a..b5fba2cc54 100644 --- a/src/components/application_manager/test/application_manager_impl_test.cc +++ b/src/components/application_manager/test/application_manager_impl_test.cc @@ -59,6 +59,7 @@ #include "protocol/bson_object_keys.h" #include "protocol_handler/mock_protocol_handler.h" #include "protocol_handler/mock_session_observer.h" +#include "resumption/last_state_wrapper_impl.h" #include "resumption/mock_last_state.h" #include "utils/custom_string.h" #include "utils/file_system.h" @@ -153,9 +154,12 @@ class ApplicationManagerImplTest std::make_shared<NiceMock<resumption_test::MockResumptionData> >( mock_app_mngr_)) , mock_rpc_service_(new MockRPCService) + , mock_last_state_(std::make_shared<resumption_test::MockLastState>()) , mock_policy_handler_(new NiceMock<MockPolicyHandlerInterface>) - , mock_app_service_manager_( - new MockAppServiceManager(mock_app_mngr_, mock_last_state_)) + , mock_app_service_manager_(new MockAppServiceManager( + mock_app_mngr_, + std::make_shared<resumption::LastStateWrapperImpl>( + mock_last_state_))) , mock_message_helper_( application_manager::MockMessageHelper::message_helper_mock()) , mock_statistics_manager_( @@ -207,7 +211,7 @@ class ApplicationManagerImplTest .WillByDefault(Return()); app_manager_impl_->SetAppServiceManager(mock_app_service_manager_); Json::Value empty; - ON_CALL(mock_last_state_, get_dictionary()).WillByDefault(ReturnRef(empty)); + ON_CALL(*mock_last_state_, dictionary()).WillByDefault(Return(empty)); auto request = std::make_shared<smart_objects::SmartObject>( smart_objects::SmartType_Map); @@ -313,7 +317,7 @@ class ApplicationManagerImplTest MockStateController mock_state_ctrl_; MockRPCService* mock_rpc_service_; - resumption_test::MockLastState mock_last_state_; + std::shared_ptr<resumption_test::MockLastState> mock_last_state_; NiceMock<con_test::MockConnectionHandler> mock_connection_handler_; NiceMock<protocol_handler_test::MockSessionObserver> mock_session_observer_; NiceMock<MockApplicationManagerSettings> mock_application_manager_settings_; diff --git a/src/components/application_manager/test/commands/command_request_impl_test.cc b/src/components/application_manager/test/commands/command_request_impl_test.cc index 86dba1c5ac..2b3231ba98 100644 --- a/src/components/application_manager/test/commands/command_request_impl_test.cc +++ b/src/components/application_manager/test/commands/command_request_impl_test.cc @@ -53,6 +53,7 @@ #include "application_manager/mock_app_service_manager.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" namespace test { namespace components { @@ -95,6 +96,9 @@ const std::string kDisallowedParam2 = "disallowed_param2"; const std::string kAllowedParam = "allowed_param"; const std::string kUndefinedParam = "undefined_params"; const std::string kMissedParam = "missed_param"; +const std::string kAppStorageFolder = "app_storage_folder"; +const std::string kAppStorageFile = "./app_info.dat"; +const std::string kAppInfoStorage = "app_info_storage"; } // namespace class CommandRequestImplTest @@ -607,8 +611,10 @@ TEST_F(CommandRequestImplTest, AppNotFound_HashUpdateNotExpected) { } TEST_F(CommandRequestImplTest, SendProviderRequest_ByServiceType) { - resumption::LastStateImpl last_state("app_storage_folder", - "app_info_storage"); + auto last_state = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>(kAppStorageFolder, + kAppInfoStorage)); + MockAppServiceManager app_service_manager(app_mngr_, last_state); MockAppPtr mock_app = CreateMockApp(); EXPECT_CALL(app_mngr_, GetAppServiceManager()) @@ -634,8 +640,10 @@ TEST_F(CommandRequestImplTest, SendProviderRequest_ByServiceType) { } TEST_F(CommandRequestImplTest, SendProviderRequest_ByProviderID) { - resumption::LastStateImpl last_state("app_storage_folder", - "app_info_storage"); + auto last_state = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>(kAppStorageFolder, + kAppInfoStorage)); + MockAppServiceManager app_service_manager(app_mngr_, last_state); MockAppPtr mock_app = CreateMockApp(); EXPECT_CALL(app_mngr_, GetAppServiceManager()) @@ -661,8 +669,10 @@ TEST_F(CommandRequestImplTest, SendProviderRequest_ByProviderID) { } TEST_F(CommandRequestImplTest, SendProviderRequestToHMI_ByProviderID) { - resumption::LastStateImpl last_state("app_storage_folder", - "app_info_storage"); + auto last_state = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>(kAppStorageFolder, + kAppInfoStorage)); + MockAppServiceManager app_service_manager(app_mngr_, last_state); MockAppPtr mock_app = CreateMockApp(); EXPECT_CALL(app_mngr_, GetAppServiceManager()) diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 5c7cd238df..6234830f50 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -50,6 +50,7 @@ #include "application_manager/resumption/resume_ctrl.h" #include "application_manager/state_controller.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "utils/file_system.h" namespace test { @@ -68,7 +69,9 @@ using namespace application_manager; class HMICapabilitiesTest : public ::testing::Test { protected: HMICapabilitiesTest() - : last_state_("app_storage_folder", "app_info_data") + : last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage"))) , file_name_("hmi_capabilities.json") {} virtual void SetUp() OVERRIDE { EXPECT_CALL(app_mngr_, event_dispatcher()) @@ -84,7 +87,7 @@ class HMICapabilitiesTest : public ::testing::Test { .WillOnce(Return(false)); hmi_capabilities_test = std::make_shared<HMICapabilitiesForTesting>(app_mngr_); - hmi_capabilities_test->Init(&last_state_); + hmi_capabilities_test->Init(last_state_wrapper_); } void TearDown() OVERRIDE { @@ -99,7 +102,7 @@ class HMICapabilitiesTest : public ::testing::Test { void SetCooperating(); MockApplicationManager app_mngr_; event_engine_test::MockEventDispatcher mock_event_dispatcher; - resumption::LastStateImpl last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; MockApplicationManagerSettings mock_application_manager_settings_; std::shared_ptr<HMICapabilitiesForTesting> hmi_capabilities_test; const std::string file_name_; @@ -514,7 +517,7 @@ TEST_F(HMICapabilitiesTest, std::shared_ptr<HMICapabilitiesForTesting> hmi_capabilities = std::make_shared<HMICapabilitiesForTesting>(mock_app_mngr); - hmi_capabilities->Init(&last_state_); + hmi_capabilities->Init(last_state_wrapper_); // Check system capabilities; only phone capability is available EXPECT_FALSE(hmi_capabilities->navigation_supported()); @@ -554,7 +557,7 @@ TEST_F(HMICapabilitiesTest, std::shared_ptr<HMICapabilitiesForTesting> hmi_capabilities = std::make_shared<HMICapabilitiesForTesting>(mock_app_mngr); - hmi_capabilities->Init(&last_state_); + hmi_capabilities->Init(last_state_wrapper_); // Check system capabilities; only navigation capability is valid, the other // two are empty @@ -600,7 +603,7 @@ TEST_F(HMICapabilitiesTest, std::shared_ptr<HMICapabilitiesForTesting> hmi_capabilities = std::make_shared<HMICapabilitiesForTesting>(mock_app_mngr); - hmi_capabilities->Init(&last_state_); + hmi_capabilities->Init(last_state_wrapper_); // with old audio pass thru format, the object is an array containing a single // object diff --git a/src/components/application_manager/test/hmi_language_handler_test.cc b/src/components/application_manager/test/hmi_language_handler_test.cc index 5f07c1b9d1..59913b19be 100644 --- a/src/components/application_manager/test/hmi_language_handler_test.cc +++ b/src/components/application_manager/test/hmi_language_handler_test.cc @@ -44,6 +44,7 @@ #include "application_manager/smart_object_keys.h" #include "application_manager/state_controller.h" #include "gtest/gtest.h" +#include "resumption/last_state_wrapper_impl.h" #include "test/resumption/mock_last_state.h" #include "utils/lock.h" @@ -135,7 +136,6 @@ class HmiLanguageHandlerTest : public ::testing::Test { MockEventDispatcher event_dispatcher_; std::shared_ptr<am::HMILanguageHandler> hmi_language_handler_; std::shared_ptr<sync_primitives::Lock> app_set_lock_; - resumption_test::MockLastState last_state_; MockRPCService mock_rpc_service_; }; @@ -155,9 +155,12 @@ TEST_F(HmiLanguageHandlerTest, OnEvent_AllLanguageIsReceivedAndSame_SUCCESS) { // Set up `active_*_language` and //`persisted_ui_language_` to be the same + auto mock_last_state = std::make_shared<resumption_test::MockLastState>(); + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper = + std::make_shared<resumption::LastStateWrapperImpl>(mock_last_state); Json::Value dictionary = Json::Value(); - ON_CALL(last_state_, get_dictionary()).WillByDefault(ReturnRef(dictionary)); - hmi_language_handler_->Init(&last_state_); + ON_CALL(*mock_last_state, dictionary()).WillByDefault(Return(dictionary)); + hmi_language_handler_->Init(last_state_wrapper); InitHMICapabilitiesLanguages(hmi_apis::Common_Language::eType::EN_US, hmi_apis::Common_Language::eType::EN_US, hmi_apis::Common_Language::eType::EN_US); diff --git a/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h b/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h index f77b5685da..0b3753a532 100644 --- a/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h +++ b/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h @@ -45,7 +45,7 @@ namespace application_manager_test { class MockAppServiceManager : public application_manager::AppServiceManager { public: MockAppServiceManager(application_manager::ApplicationManager& app_manager, - resumption::LastState& last_state) + resumption::LastStateWrapperPtr last_state) : application_manager::AppServiceManager(app_manager, last_state) {} MOCK_METHOD3( PublishAppService, diff --git a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h index c08ad146ee..7c163d78ad 100644 --- a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h +++ b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h @@ -196,8 +196,11 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities { set_seat_location_capability, void(const smart_objects::SmartObject& seat_location_capability)); + DEPRECATED MOCK_METHOD1(Init, void(resumption::LastState* last_state)); + MOCK_METHOD1(Init, void(resumption::LastStateWrapperPtr last_state_wrapper)); + MOCK_CONST_METHOD0(ccpu_version, const std::string&()); MOCK_METHOD1(set_ccpu_version, void(const std::string& ccpu_version)); MOCK_METHOD0(get_hmi_language_handler, 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 b657f0e86b..3935ab7924 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 @@ -34,7 +34,7 @@ #include "application_manager/application.h" #include "application_manager/resumption/resume_ctrl.h" #include "gmock/gmock.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" namespace test { namespace components { @@ -82,7 +82,9 @@ class MockResumeCtrl : public resumption::ResumeCtrl { MOCK_METHOD1(OnAppActivated, void(app_mngr::ApplicationSharedPtr application)); MOCK_METHOD1(RemoveFromResumption, void(uint32_t app_id)); + DEPRECATED MOCK_METHOD1(Init, bool(resumption::LastState& last_state)); + MOCK_METHOD1(Init, bool(resumption::LastStateWrapperPtr last_state)); MOCK_METHOD2(OnAppRegistrationStart, void(const std::string& policy_app_id, const std::string& device_id)); diff --git a/src/components/application_manager/test/resumption/resumption_data_json_test.cc b/src/components/application_manager/test/resumption/resumption_data_json_test.cc index 955309e091..9d348ecbb7 100644 --- a/src/components/application_manager/test/resumption/resumption_data_json_test.cc +++ b/src/components/application_manager/test/resumption/resumption_data_json_test.cc @@ -39,6 +39,7 @@ #include "application_manager/usage_statistics.h" #include "interfaces/MOBILE_API.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "application_manager/resumption_data_test.h" #include "formatters/CFormatterJsonBase.h" @@ -66,8 +67,10 @@ namespace formatters = ns_smart_device_link::ns_json_handler::formatters; class ResumptionDataJsonTest : public ResumptionDataTest { protected: ResumptionDataJsonTest() - : last_state_("app_storage_folder", "app_info_storage") - , res_json(last_state_, mock_application_manager_) {} + : last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage"))) + , res_json(last_state_wrapper_, mock_application_manager_) {} virtual void SetUp() { app_mock = std::make_shared< NiceMock<application_manager_test::MockApplication> >(); @@ -83,12 +86,14 @@ class ResumptionDataJsonTest : public ResumptionDataTest { } void CheckSavedJson() { - Value& dictionary = last_state_.get_dictionary(); + resumption::LastStateAccessor accessor = + last_state_wrapper_->get_accessor(); + Value dictionary = accessor.GetData().dictionary(); ASSERT_TRUE(dictionary[am::strings::resumption].isObject()); ASSERT_TRUE( dictionary[am::strings::resumption][am::strings::resume_app_list] .isArray()); - Value& resume_app_list = + const Value& resume_app_list = dictionary[am::strings::resumption][am::strings::resume_app_list]; sm::SmartObject res_app_list; for (uint32_t i = 0; i < resume_app_list.size(); i++) { @@ -99,13 +104,16 @@ class ResumptionDataJsonTest : public ResumptionDataTest { } void SetZeroIgnOff() { - Value& dictionary = last_state_.get_dictionary(); + resumption::LastStateAccessor accessor = + last_state_wrapper_->get_accessor(); + Value dictionary = accessor.GetData().dictionary(); Value& res = dictionary[am::strings::resumption]; res[am::strings::last_ign_off_time] = 0; - last_state_.SaveStateToFileSystem(); + accessor.GetMutableData().set_dictionary(dictionary); + accessor.GetMutableData().SaveToFileSystem(); } - resumption::LastStateImpl last_state_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; ResumptionDataJson res_json; }; diff --git a/src/components/application_manager/test/rpc_passing_handler_test.cc b/src/components/application_manager/test/rpc_passing_handler_test.cc index fb74a0a7e3..6eac6ca0b1 100644 --- a/src/components/application_manager/test/rpc_passing_handler_test.cc +++ b/src/components/application_manager/test/rpc_passing_handler_test.cc @@ -41,6 +41,7 @@ #include "application_manager/mock_application_manager_settings.h" #include "application_manager/mock_rpc_handler.h" #include "application_manager/mock_rpc_service.h" +#include "resumption/last_state_wrapper_impl.h" #include "resumption/mock_last_state.h" #include <vector> @@ -73,7 +74,10 @@ struct PassthroughParams { class RPCPassingHandlerTest : public ::testing::Test { public: RPCPassingHandlerTest() - : mock_app_service_manager_(mock_app_manager_, mock_last_state_) + : mock_last_state_(std::make_shared<resumption_test::MockLastState>()) + , last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( + mock_last_state_)) + , mock_app_service_manager_(mock_app_manager_, last_state_wrapper_) , mock_app_ptr_(std::make_shared<NiceMock<MockApplication> >()) , version_(utils::SemanticVersion(5, 1, 0)) {} @@ -210,7 +214,8 @@ class RPCPassingHandlerTest : public ::testing::Test { NiceMock<MockApplicationManagerSettings> mock_app_manager_settings_; MockRPCService mock_rpc_service_; MockRPCHandler mock_rpc_handler_; - resumption_test::MockLastState mock_last_state_; + std::shared_ptr<resumption_test::MockLastState> mock_last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; MockAppServiceManager mock_app_service_manager_; std::shared_ptr<NiceMock<MockApplication> > mock_app_ptr_; const utils::SemanticVersion version_; diff --git a/src/components/connection_handler/CMakeLists.txt b/src/components/connection_handler/CMakeLists.txt index 8018ea3707..30199b2014 100644 --- a/src/components/connection_handler/CMakeLists.txt +++ b/src/components/connection_handler/CMakeLists.txt @@ -37,6 +37,7 @@ include_directories ( ${ENCRYPTION_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} ${BOOST_INCLUDE_DIR} + ${JSONCPP_INCLUDE_DIRECTORY} ) set(PATHS diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index 04b5049c3d..057f38f78e 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -47,11 +47,6 @@ #include "application_manager/plugin_manager/rpc_plugin_manager.h" #include "application_manager/state_controller.h" #include "policy/policy_types.h" -#include "telemetry_monitor/telemetry_observable.h" - -namespace resumption { -class LastState; -} namespace app_launch { class AppLaunchCtrl; @@ -136,10 +131,14 @@ class ApplicationManager { public: virtual ~ApplicationManager() {} + DEPRECATED + virtual bool Init(resumption::LastState&, + media_manager::MediaManager* media_manager) = 0; + /** * Inits application manager */ - virtual bool Init(resumption::LastState& last_state, + virtual bool Init(resumption::LastStateWrapperPtr last_state_wrapper, media_manager::MediaManager* media_manager) = 0; /** diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h index 535ab0409d..e10295b56f 100644 --- a/src/components/include/application_manager/hmi_capabilities.h +++ b/src/components/include/application_manager/hmi_capabilities.h @@ -37,13 +37,10 @@ #include "interfaces/HMI_API.h" #include "interfaces/MOBILE_API.h" #include "json/json.h" +#include "resumption/last_state_wrapper.h" #include "smart_objects/smart_object.h" #include "utils/macro.h" -namespace resumption { -class LastState; -} - namespace application_manager { class ApplicationManager; @@ -531,8 +528,11 @@ class HMICapabilities { virtual const smart_objects::SmartObject* seat_location_capability() const = 0; + DEPRECATED virtual void Init(resumption::LastState* last_state) = 0; + virtual void Init(resumption::LastStateWrapperPtr last_state_wrapper) = 0; + /** * @brief Trigger waiting for response * @param request Request object diff --git a/src/components/include/resumption/last_state.h b/src/components/include/resumption/last_state.h new file mode 100644 index 0000000000..b28e5611b7 --- /dev/null +++ b/src/components/include/resumption/last_state.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2019, 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_INCLUDE_RESUMPTION_LAST_STATE_H_ +#define SRC_COMPONENTS_INCLUDE_RESUMPTION_LAST_STATE_H_ + +#include "json/json.h" +#include "utils/macro.h" + +namespace resumption { + +class LastState { + public: + /** + * @brief Destructor + */ + virtual ~LastState() {} + + /** + * @brief Saves dictionary to filesystem + */ + DEPRECATED + virtual void SaveStateToFileSystem() = 0; + + /** + * @brief SaveToFileSystem + * Saving dictionary to filesystem + */ + virtual void SaveToFileSystem() = 0; + + /** + * @brief RemoveFromFileSystem + * Remove dictionary from filesystem + */ + virtual void RemoveFromFileSystem() = 0; + + /** + * @brief dictionary Gets internal dictionary + * @return Reference to internal dictionary json value + */ + virtual Json::Value& get_dictionary() = 0; + + /** + * @brief dictionary Gets internal dictionary + * @return Copy of internal dictionary json value + */ + virtual Json::Value dictionary() const = 0; + + /** + * @brief set_dictionary sets internal dictionary + * @param dictionary New dictionary json value to be set + */ + virtual void set_dictionary(const Json::Value& dictionary) = 0; +}; + +} // namespace resumption + +#endif // SRC_COMPONENTS_INCLUDE_RESUMPTION_LAST_STATE_H_ diff --git a/src/components/include/resumption/last_state_wrapper.h b/src/components/include/resumption/last_state_wrapper.h new file mode 100644 index 0000000000..d5af2e958e --- /dev/null +++ b/src/components/include/resumption/last_state_wrapper.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, 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_INCLUDE_RESUMPTION_LAST_STATE_WRAPPER_H_ +#define SRC_COMPONENTS_INCLUDE_RESUMPTION_LAST_STATE_WRAPPER_H_ + +#include <memory> + +#include "resumption/last_state.h" +#include "utils/mutable_data_accessor.h" + +namespace resumption { +class LastStateWrapper; +typedef std::shared_ptr<LastStateWrapper> LastStateWrapperPtr; +typedef MutableDataAccessor<LastState> LastStateAccessor; + +class LastStateWrapper { + public: + /** + * @brief Getter for providing exclusive access to LastState instance + * @return accessor with ability to access to LastState instance + */ + virtual LastStateAccessor get_accessor() const = 0; +}; + +} // namespace resumption + +#endif // SRC_COMPONENTS_INCLUDE_RESUMPTION_LAST_STATE_WRAPPER_H_ 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 e5706c2003..b2de63252e 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -55,7 +55,7 @@ #include "application_manager/state_controller.h" #include "interfaces/HMI_API.h" #include "interfaces/MOBILE_API.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "smart_objects/smart_object.h" namespace test { @@ -66,6 +66,10 @@ using application_manager::plugin_manager::RPCPluginManager; class MockApplicationManager : public application_manager::ApplicationManager { public: MOCK_METHOD2(Init, + bool(resumption::LastStateWrapperPtr last_state, + media_manager::MediaManager* media_manager)); + DEPRECATED + MOCK_METHOD2(Init, bool(resumption::LastState& last_state, media_manager::MediaManager* media_manager)); MOCK_METHOD0(Stop, bool()); diff --git a/src/components/include/test/application_manager/mock_rpc_plugin.h b/src/components/include/test/application_manager/mock_rpc_plugin.h index 7e4ff11bc7..2633825428 100644 --- a/src/components/include/test/application_manager/mock_rpc_plugin.h +++ b/src/components/include/test/application_manager/mock_rpc_plugin.h @@ -15,6 +15,13 @@ class MockRPCPlugin : public RPCPlugin { rpc_service::RPCService& rpc_service, HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler, + resumption::LastStateWrapperPtr last_state)); + DEPRECATED + MOCK_METHOD5(Init, + bool(ApplicationManager& app_manager, + rpc_service::RPCService& rpc_service, + HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handler, resumption::LastState& last_state)); MOCK_METHOD2(IsAbleToProcess, bool(const int32_t function_id, diff --git a/src/components/include/test/resumption/mock_last_state.h b/src/components/include/test/resumption/mock_last_state.h index 9f4b11cbbf..99c3799a95 100644 --- a/src/components/include/test/resumption/mock_last_state.h +++ b/src/components/include/test/resumption/mock_last_state.h @@ -35,6 +35,7 @@ #include "gmock/gmock.h" #include "resumption/last_state.h" +#include "utils/macro.h" namespace test { namespace components { @@ -42,8 +43,14 @@ namespace resumption_test { class MockLastState : public resumption::LastState { public: + DEPRECATED MOCK_METHOD0(SaveStateToFileSystem, void()); + DEPRECATED MOCK_METHOD0(get_dictionary, Json::Value&()); + MOCK_METHOD0(SaveToFileSystem, void()); + MOCK_METHOD0(RemoveFromFileSystem, void()); + MOCK_CONST_METHOD0(dictionary, Json::Value()); + MOCK_METHOD1(set_dictionary, void(const Json::Value&)); }; } // namespace resumption_test diff --git a/src/components/include/test/transport_manager/mock_transport_manager.h b/src/components/include/test/transport_manager/mock_transport_manager.h index 884bde50bf..c853ceb512 100644 --- a/src/components/include/test/transport_manager/mock_transport_manager.h +++ b/src/components/include/test/transport_manager/mock_transport_manager.h @@ -35,7 +35,7 @@ #include <string> #include "gmock/gmock.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "telemetry_monitor/telemetry_observable.h" #include "transport_manager/transport_adapter/transport_adapter_event.h" #include "transport_manager/transport_manager.h" @@ -56,6 +56,8 @@ class MockTransportManager : public ::transport_manager::TransportManager, public ::telemetry_monitor::TelemetryObservable< transport_manager::TMTelemetryObserver> { public: + MOCK_METHOD1(Init, int(resumption::LastStateWrapperPtr last_state)); + DEPRECATED MOCK_METHOD1(Init, int(resumption::LastState& last_state)); MOCK_METHOD0(Reinit, int()); MOCK_METHOD0(Deinit, void()); diff --git a/src/components/include/transport_manager/transport_manager.h b/src/components/include/transport_manager/transport_manager.h index ce92bfd9cb..e370e3e4c6 100644 --- a/src/components/include/transport_manager/transport_manager.h +++ b/src/components/include/transport_manager/transport_manager.h @@ -34,14 +34,11 @@ #define SRC_COMPONENTS_INCLUDE_TRANSPORT_MANAGER_TRANSPORT_MANAGER_H_ #include "protocol/common.h" +#include "resumption/last_state_wrapper.h" #include "transport_manager/common.h" #include "transport_manager/transport_adapter/transport_adapter_event.h" #include "transport_manager/transport_manager_listener.h" -namespace resumption { -class LastState; -} - namespace transport_manager { class TransportAdapterEvent; @@ -56,11 +53,14 @@ class TransportManager { **/ virtual ~TransportManager() {} + DEPRECATED + virtual int Init(resumption::LastState& last_state) = 0; + /** * @brief Initialize transport manager. * @return Error code. */ - virtual int Init(resumption::LastState& last_state) = 0; + virtual int Init(resumption::LastStateWrapperPtr last_state_wrapper) = 0; /** * @brief Reinitializes transport manager diff --git a/src/components/include/utils/data_accessor.h b/src/components/include/utils/data_accessor.h index 1be7c3ab53..99820237c8 100644 --- a/src/components/include/utils/data_accessor.h +++ b/src/components/include/utils/data_accessor.h @@ -56,6 +56,7 @@ class DataAccessor { --(*counter_); } } + const T& GetData() const { return data_; } diff --git a/src/components/include/utils/mutable_data_accessor.h b/src/components/include/utils/mutable_data_accessor.h new file mode 100644 index 0000000000..0e03345a45 --- /dev/null +++ b/src/components/include/utils/mutable_data_accessor.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_INCLUDE_UTILS_MUTABLE_DATA_ACCESSOR_H +#define SRC_COMPONENTS_INCLUDE_UTILS_MUTABLE_DATA_ACCESSOR_H + +#include "utils/lock.h" + +// This class is for thread-safe mutable access to data + +template <class T> +class MutableDataAccessor { + public: + MutableDataAccessor(T& data, + const std::shared_ptr<sync_primitives::BaseLock>& lock) + : data_(data), lock_(lock), counter_(new uint32_t(0)) { + lock_->Acquire(); + } + + MutableDataAccessor(const MutableDataAccessor<T>& other) + : data_(other.data_), lock_(other.lock_), counter_(other.counter_) { + ++(*counter_); + } + + ~MutableDataAccessor() { + if (0 == *counter_) { + lock_->Release(); + } else { + --(*counter_); + } + } + + const T& GetData() const { + return data_; + } + + T& GetMutableData() { + return data_; + } + + private: + void* operator new(size_t size); + T& data_; + // Require that the lock lives at least as long as the DataAccessor + const std::shared_ptr<sync_primitives::BaseLock> lock_; + std::shared_ptr<uint32_t> counter_; +}; + +#endif // SRC_COMPONENTS_INCLUDE_UTILS_MUTABLE_DATA_ACCESSOR_H diff --git a/src/components/protocol_handler/CMakeLists.txt b/src/components/protocol_handler/CMakeLists.txt index 90dd2c9eda..53ccd3c5c9 100644 --- a/src/components/protocol_handler/CMakeLists.txt +++ b/src/components/protocol_handler/CMakeLists.txt @@ -36,6 +36,7 @@ include_directories( ${COMPONENTS_DIR}/connection_handler/include/ ${COMPONENTS_DIR}/application_manager/include ${CMAKE_BINARY_DIR}/src/components/ + ${JSONCPP_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} ${BSON_INCLUDE_DIRECTORY} ${BOOST_INCLUDE_DIR} diff --git a/src/components/resumption/CMakeLists.txt b/src/components/resumption/CMakeLists.txt index a2c93b0689..73e7b88a74 100644 --- a/src/components/resumption/CMakeLists.txt +++ b/src/components/resumption/CMakeLists.txt @@ -36,6 +36,7 @@ include_directories ( ${COMPONENTS_DIR}/config_profile/include/ ${JSONCPP_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} + ${BOOST_INCLUDE_DIR} ) set(PATHS diff --git a/src/components/resumption/include/resumption/last_state_impl.h b/src/components/resumption/include/resumption/last_state_impl.h index 2da3147930..5eb4050d2d 100644 --- a/src/components/resumption/include/resumption/last_state_impl.h +++ b/src/components/resumption/include/resumption/last_state_impl.h @@ -33,7 +33,10 @@ #ifndef SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ #define SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ +#include <string> + #include "resumption/last_state.h" +#include "utils/lock.h" #include "utils/macro.h" namespace resumption { @@ -49,31 +52,53 @@ class LastStateImpl : public LastState { */ LastStateImpl(const std::string& app_storage_folder, const std::string& app_info_storage); - /** * @brief Destructor */ ~LastStateImpl(); + DEPRECATED + void SaveStateToFileSystem(); + /** * @brief Saving dictionary to filesystem */ - void SaveStateToFileSystem() OVERRIDE; + void SaveToFileSystem() OVERRIDE; /** - * @brief Get reference to dictionary + * @brief Remove dictionary from filesystem */ - Json::Value& get_dictionary() OVERRIDE; + void RemoveFromFileSystem() OVERRIDE; - private: - const std::string app_storage_folder_; - const std::string app_info_storage_; - Json::Value dictionary_; + /** + * @brief Get the dictionary + * @return A copy of the dictionary instance + */ + Json::Value dictionary() const OVERRIDE; /** + * @brief Get the dictionary + * @return Reference to the dictionary + */ + DEPRECATED Json::Value& get_dictionary(); + + /** + * @brief Resets internal dictionary + * @param dictionary New dictionary json value to be set + */ + void set_dictionary(const Json::Value& dictionary) OVERRIDE; + + private: + /** * @brief Load dictionary from filesystem */ - void LoadStateFromFileSystem(); + void LoadFromFileSystem(); + + Json::Value dictionary_; + mutable sync_primitives::Lock dictionary_lock_; + + std::string app_storage_folder_; + std::string app_info_storage_; DISALLOW_COPY_AND_ASSIGN(LastStateImpl); }; diff --git a/src/components/resumption/include/resumption/last_state.h b/src/components/resumption/include/resumption/last_state_wrapper_impl.h index 3481fc9327..52ba8a4d2b 100644 --- a/src/components/resumption/include/resumption/last_state.h +++ b/src/components/resumption/include/resumption/last_state_wrapper_impl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Ford Motor Company + * Copyright (c) 2019, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,33 +30,32 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_H_ -#define SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_H_ +#ifndef SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_WRAPPER_IMPL_H_ +#define SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_WRAPPER_IMPL_H_ -#include <string> +#include <memory> -#include "json/json.h" +#include "resumption/last_state_wrapper.h" +#include "utils/lock.h" +#include "utils/macro.h" +#include "utils/mutable_data_accessor.h" namespace resumption { -class LastState { +class LastStateWrapperImpl : public LastStateWrapper { public: /** - * @brief Destructor + * @brief Constructor */ - virtual ~LastState() {} + explicit LastStateWrapperImpl(std::shared_ptr<LastState> last_state); - /** - * @brief Saving dictionary to filesystem - */ - virtual void SaveStateToFileSystem() = 0; + LastStateAccessor get_accessor() const OVERRIDE; - /** - * @brief Get reference to dictionary - */ - virtual Json::Value& get_dictionary() = 0; + private: + std::shared_ptr<LastState> last_state_; + mutable std::shared_ptr<sync_primitives::Lock> lock_; }; } // namespace resumption -#endif // SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_H_ +#endif // SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_WRAPPER_IMPL_H_ diff --git a/src/components/resumption/src/last_state_impl.cc b/src/components/resumption/src/last_state_impl.cc index c25da5bdc4..05c801d762 100644 --- a/src/components/resumption/src/last_state_impl.cc +++ b/src/components/resumption/src/last_state_impl.cc @@ -43,31 +43,52 @@ LastStateImpl::LastStateImpl(const std::string& app_storage_folder, const std::string& app_info_storage) : app_storage_folder_(app_storage_folder) , app_info_storage_(app_info_storage) { - LoadStateFromFileSystem(); + LoadFromFileSystem(); LOG4CXX_AUTO_TRACE(logger_); } LastStateImpl::~LastStateImpl() { LOG4CXX_AUTO_TRACE(logger_); - SaveStateToFileSystem(); + SaveToFileSystem(); } void LastStateImpl::SaveStateToFileSystem() { LOG4CXX_AUTO_TRACE(logger_); - const std::string& str = dictionary_.toStyledString(); - const std::vector<uint8_t> char_vector_pdata(str.begin(), str.end()); + std::string styled_string; + { + sync_primitives::AutoLock lock(dictionary_lock_); + styled_string = dictionary_.toStyledString(); + } + + const std::vector<uint8_t> char_vector_pdata(styled_string.begin(), + styled_string.end()); DCHECK(file_system::CreateDirectoryRecursively(app_storage_folder_)); LOG4CXX_INFO(logger_, - "LastState::SaveStateToFileSystem " << app_info_storage_ << str); + "LastState::SaveStateToFileSystem[DEPRECATED] " + << app_info_storage_ << styled_string); DCHECK(file_system::Write(app_info_storage_, char_vector_pdata)); } -Json::Value& LastStateImpl::get_dictionary() { - return dictionary_; +void LastStateImpl::SaveToFileSystem() { + LOG4CXX_AUTO_TRACE(logger_); + + std::string styled_string; + { + sync_primitives::AutoLock lock(dictionary_lock_); + styled_string = dictionary_.toStyledString(); + } + + const std::vector<uint8_t> char_vector_pdata(styled_string.begin(), + styled_string.end()); + DCHECK(file_system::CreateDirectoryRecursively(app_storage_folder_)); + LOG4CXX_INFO( + logger_, + "LastState::SaveToFileSystem " << app_info_storage_ << styled_string); + DCHECK(file_system::Write(app_info_storage_, char_vector_pdata)); } -void LastStateImpl::LoadStateFromFileSystem() { +void LastStateImpl::LoadFromFileSystem() { std::string buffer; const bool result = file_system::ReadFile(app_info_storage_, buffer); utils::JsonReader reader; @@ -80,4 +101,28 @@ void LastStateImpl::LoadStateFromFileSystem() { LOG4CXX_WARN(logger_, "No valid last state was found."); } +void LastStateImpl::RemoveFromFileSystem() { + LOG4CXX_AUTO_TRACE(logger_); + if (!file_system::DeleteFile(app_info_storage_)) { + LOG4CXX_WARN(logger_, "Failed attempt to delete " << app_info_storage_); + } +} + +Json::Value LastStateImpl::dictionary() const { + sync_primitives::AutoLock lock(dictionary_lock_); + return dictionary_; +} + +Json::Value& LastStateImpl::get_dictionary() { + sync_primitives::AutoLock lock(dictionary_lock_); + return dictionary_; +} + +void LastStateImpl::set_dictionary(const Json::Value& dictionary) { + DCHECK(dictionary.type() == Json::objectValue || + dictionary.type() == Json::nullValue); + sync_primitives::AutoLock lock(dictionary_lock_); + dictionary_ = dictionary; +} + } // namespace resumption diff --git a/src/components/resumption/src/last_state_wrapper_impl.cc b/src/components/resumption/src/last_state_wrapper_impl.cc new file mode 100644 index 0000000000..61b325f53b --- /dev/null +++ b/src/components/resumption/src/last_state_wrapper_impl.cc @@ -0,0 +1,49 @@ +/* Copyright (c) 2019, 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 "resumption/last_state_wrapper_impl.h" +#include "utils/logger.h" + +namespace resumption { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Resumption") + +LastStateWrapperImpl::LastStateWrapperImpl( + std::shared_ptr<LastState> last_state) + : last_state_(last_state) + , lock_(std::make_shared<sync_primitives::Lock>()) {} + +LastStateAccessor LastStateWrapperImpl::get_accessor() const { + LOG4CXX_AUTO_TRACE(logger_); + return MutableDataAccessor<LastState>(*last_state_, lock_); +} + +} // namespace resumption diff --git a/src/components/resumption/test/last_state_test.cc b/src/components/resumption/test/last_state_test.cc index c82af2450c..61c227bbf3 100644 --- a/src/components/resumption/test/last_state_test.cc +++ b/src/components/resumption/test/last_state_test.cc @@ -73,13 +73,13 @@ class LastStateTest : public ::testing::Test { }; TEST_F(LastStateTest, Basic) { - const Value& dictionary = last_state_.get_dictionary(); + const Value& dictionary = last_state_.dictionary(); EXPECT_EQ(empty_dictionary_, dictionary.toStyledString()); } TEST_F(LastStateTest, SetGetData) { { - Value& dictionary = last_state_.get_dictionary(); + Value dictionary = last_state_.dictionary(); const Value& bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"]; EXPECT_EQ(empty_dictionary_, bluetooth_info.toStyledString()); @@ -102,10 +102,11 @@ TEST_F(LastStateTest, SetGetData) { dictionary["TransportManager"]["BluetoothAdapter"]["devices"] = "bluetooth_device"; - last_state_.SaveStateToFileSystem(); + last_state_.set_dictionary(dictionary); + last_state_.SaveToFileSystem(); } - const Value& dictionary = last_state_.get_dictionary(); + const Value dictionary = last_state_.dictionary(); const Value& bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"]; diff --git a/src/components/security_manager/include/security_manager/crypto_manager_impl.h b/src/components/security_manager/include/security_manager/crypto_manager_impl.h index 46fd1a5995..42abe6e3b6 100644 --- a/src/components/security_manager/include/security_manager/crypto_manager_impl.h +++ b/src/components/security_manager/include/security_manager/crypto_manager_impl.h @@ -206,6 +206,7 @@ class CryptoManagerImpl : public CryptoManager { SSL_CTX* context_; static uint32_t instance_count_; static sync_primitives::Lock instance_lock_; + sync_primitives::Lock crypto_manager_lock_; DISALLOW_COPY_AND_ASSIGN(CryptoManagerImpl); }; } // namespace security_manager diff --git a/src/components/security_manager/src/crypto_manager_impl.cc b/src/components/security_manager/src/crypto_manager_impl.cc index cb42d5b46c..48b3119bec 100644 --- a/src/components/security_manager/src/crypto_manager_impl.cc +++ b/src/components/security_manager/src/crypto_manager_impl.cc @@ -283,6 +283,7 @@ bool CryptoManagerImpl::Init() { bool CryptoManagerImpl::OnCertificateUpdated(const std::string& data) { LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(crypto_manager_lock_); if (!context_) { LOG4CXX_WARN(logger_, "Not initialized"); return false; @@ -307,6 +308,8 @@ bool CryptoManagerImpl::OnCertificateUpdated(const std::string& data) { } SSLContext* CryptoManagerImpl::CreateSSLContext() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(crypto_manager_lock_); if (NULL == context_) { return NULL; } diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h index c4bd02d64b..14f954286f 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h @@ -49,7 +49,11 @@ class BluetoothTransportAdapter : public TransportAdapterImpl { /** * @brief Constructor. */ - BluetoothTransportAdapter(resumption::LastState& last_state, + BluetoothTransportAdapter(resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings); + + DEPRECATED + BluetoothTransportAdapter(resumption::LastState&, const TransportManagerSettings& settings); /** diff --git a/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h b/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h index 138f9ca895..c8b2cc9508 100644 --- a/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/cloud/cloud_websocket_transport_adapter.h @@ -50,7 +50,7 @@ class CloudWebsocketTransportAdapter : public TransportAdapterImpl { * @brief Constructor. */ explicit CloudWebsocketTransportAdapter( - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); /** diff --git a/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h b/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h index a802a64afa..3dabfb39ca 100644 --- a/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/iap2_emulation/iap2_transport_adapter.h @@ -33,7 +33,7 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_IAP2_EMULATION_IAP2_TRANSPORT_ADAPTER_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_IAP2_EMULATION_IAP2_TRANSPORT_ADAPTER_H_ -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "transport_manager/tcp/tcp_transport_adapter.h" #include "transport_manager/transport_manager_settings.h" #include "utils/macro.h" @@ -60,9 +60,14 @@ class IAP2BluetoothEmulationTransportAdapter : public TcpTransportAdapter { */ IAP2BluetoothEmulationTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); + DEPRECATED + IAP2BluetoothEmulationTransportAdapter( + const uint16_t port, + resumption::LastState& last_state_wrapper, + const TransportManagerSettings& settings); /** * @brief DeviceSwitched is called during switching from iAP2 Bluetooth to * iAP2 USB transport. @@ -103,9 +108,16 @@ class IAP2USBEmulationTransportAdapter : public TcpTransportAdapter { * @param last_state LastState instance reference * @param settings Settings reference */ + IAP2USBEmulationTransportAdapter( + const uint16_t port, + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings); + + DEPRECATED IAP2USBEmulationTransportAdapter(const uint16_t port, - resumption::LastState& last_state, - const TransportManagerSettings& settings); + resumption::LastState&, + const TransportManagerSettings& settings) = + delete; /** * Destructor diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h index 37f5a7fe49..c5948062c9 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h @@ -49,9 +49,14 @@ class TcpTransportAdapter : public TransportAdapterImpl { /** * @brief Constructor. */ - explicit TcpTransportAdapter(uint16_t port, - resumption::LastState& last_state, - const TransportManagerSettings& settings); + TcpTransportAdapter(uint16_t port, + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings); + + DEPRECATED + TcpTransportAdapter(uint16_t port, + resumption::LastState&, + const TransportManagerSettings& settings) = delete; /** * @brief Destructor. diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h index 5f54cf8376..db9bb03998 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h @@ -43,7 +43,7 @@ #include "utils/rwlock.h" #include "utils/timer.h" -#include "resumption/last_state.h" +#include "resumption/last_state_wrapper.h" #include "transport_manager/transport_adapter/connection.h" #include "transport_manager/transport_adapter/transport_adapter.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" @@ -82,9 +82,16 @@ class TransportAdapterImpl : public TransportAdapter, TransportAdapterImpl(DeviceScanner* device_scanner, ServerConnectionFactory* server_connection_factory, ClientConnectionListener* client_connection_listener, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); + DEPRECATED + TransportAdapterImpl(DeviceScanner* device_scanner, + ServerConnectionFactory* server_connection_factory, + ClientConnectionListener* client_connection_listener, + resumption::LastState& last_state, + const TransportManagerSettings& settings) = delete; + /** * @brief Destructor. **/ @@ -662,7 +669,7 @@ class TransportAdapterImpl : public TransportAdapter, #endif // TELEMETRY_MONITOR resumption::LastState& last_state() const { - return last_state_; + return last_state_wrapper_->get_accessor().GetMutableData(); } /** @@ -680,7 +687,7 @@ class TransportAdapterImpl : public TransportAdapter, */ ClientConnectionListener* client_connection_listener_; - resumption::LastState& last_state_; + resumption::LastStateWrapperPtr last_state_wrapper_; const TransportManagerSettings& settings_; }; diff --git a/src/components/transport_manager/include/transport_manager/transport_manager_default.h b/src/components/transport_manager/include/transport_manager/transport_manager_default.h index 63061b14b7..9d428cf817 100644 --- a/src/components/transport_manager/include/transport_manager/transport_manager_default.h +++ b/src/components/transport_manager/include/transport_manager/transport_manager_default.h @@ -38,10 +38,6 @@ #include "transport_manager/transport_manager_impl.h" -namespace resumption { -class LastState; -} - namespace transport_manager { struct TransportAdapterFactory { @@ -50,19 +46,19 @@ struct TransportAdapterFactory { using CreatorTA = std::function<transport_adapter::TransportAdapter*(Args&&... args)>; #ifdef BLUETOOTH_SUPPORT - CreatorTA<resumption::LastState&, const TransportManagerSettings&> + CreatorTA<resumption::LastStateWrapperPtr&, const TransportManagerSettings&> ta_bluetooth_creator_; #endif CreatorTA<const uint16_t, - resumption::LastState&, + resumption::LastStateWrapperPtr&, const TransportManagerSettings&> ta_tcp_creator_; #if defined(USB_SUPPORT) - CreatorTA<resumption::LastState&, const TransportManagerSettings&> + CreatorTA<resumption::LastStateWrapperPtr&, const TransportManagerSettings&> ta_usb_creator_; #endif #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) - CreatorTA<resumption::LastState&, const TransportManagerSettings&> + CreatorTA<resumption::LastStateWrapperPtr&, const TransportManagerSettings&> ta_cloud_creator_; #endif }; @@ -80,6 +76,9 @@ class TransportManagerDefault : public TransportManagerImpl { * * @return Code error. */ + int Init(resumption::LastStateWrapperPtr last_state_wrapper) OVERRIDE; + + DEPRECATED int Init(resumption::LastState& last_state) OVERRIDE; /** diff --git a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h index 5e97a5567e..2fbd592b72 100644 --- a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h @@ -124,6 +124,9 @@ class TransportManagerImpl * * @return Code error. */ + int Init(resumption::LastStateWrapperPtr last_state_wrapper) OVERRIDE; + + DEPRECATED int Init(resumption::LastState& last_state) OVERRIDE; /** diff --git a/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h b/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h index ee7039efde..45c6d4c0e4 100644 --- a/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h +++ b/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h @@ -44,8 +44,13 @@ namespace transport_adapter { class UsbAoaAdapter : public TransportAdapterImpl { public: - UsbAoaAdapter(resumption::LastState& last_state, + UsbAoaAdapter(resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings); + + DEPRECATED + UsbAoaAdapter(resumption::LastState&, + const TransportManagerSettings& settings) = delete; + virtual ~UsbAoaAdapter(); protected: diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index 911658bc56..066751c474 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -57,12 +57,13 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") BluetoothTransportAdapter::~BluetoothTransportAdapter() {} BluetoothTransportAdapter::BluetoothTransportAdapter( - resumption::LastState& last_state, const TransportManagerSettings& settings) + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) : TransportAdapterImpl( new BluetoothDeviceScanner(this, true, 0, settings.bluetooth_uuid()), new BluetoothConnectionFactory(this), NULL, - last_state, + last_state_wrapper, settings) {} DeviceType BluetoothTransportAdapter::GetDeviceType() const { @@ -112,23 +113,25 @@ void BluetoothTransportAdapter::Store() const { } } bluetooth_adapter_dictionary["devices"] = devices_dictionary; - Json::Value& dictionary = last_state().get_dictionary(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); dictionary["TransportManager"]["BluetoothAdapter"] = bluetooth_adapter_dictionary; + accessor.GetMutableData().set_dictionary(dictionary); LOG4CXX_TRACE(logger_, "exit"); } bool BluetoothTransportAdapter::Restore() { LOG4CXX_TRACE(logger_, "enter"); bool errors_occured = false; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); const Json::Value bluetooth_adapter_dictionary = - last_state().get_dictionary()["TransportManager"]["BluetoothAdapter"]; + dictionary["TransportManager"]["BluetoothAdapter"]; const Json::Value devices_dictionary = bluetooth_adapter_dictionary["devices"]; - for (Json::Value::const_iterator i = devices_dictionary.begin(); - i != devices_dictionary.end(); - ++i) { - const Json::Value device_dictionary = *i; + for (const auto& bt_device : devices_dictionary) { + const Json::Value device_dictionary = bt_device; std::string name = device_dictionary["name"].asString(); std::string address_record = device_dictionary["address"].asString(); bdaddr_t address; @@ -136,10 +139,8 @@ bool BluetoothTransportAdapter::Restore() { RfcommChannelVector rfcomm_channels; const Json::Value applications_dictionary = device_dictionary["applications"]; - for (Json::Value::const_iterator j = applications_dictionary.begin(); - j != applications_dictionary.end(); - ++j) { - const Json::Value application_dictionary = *j; + for (const auto& application : applications_dictionary) { + const Json::Value application_dictionary = application; std::string rfcomm_channel_record = application_dictionary["rfcomm_channel"].asString(); uint8_t rfcomm_channel = @@ -150,11 +151,9 @@ bool BluetoothTransportAdapter::Restore() { new BluetoothDevice(address, name.c_str(), rfcomm_channels); DeviceSptr device(bluetooth_device); AddDevice(device); - for (RfcommChannelVector::const_iterator j = rfcomm_channels.begin(); - j != rfcomm_channels.end(); - ++j) { + for (const auto& channel : rfcomm_channels) { ApplicationHandle app_handle = - *j; // for Bluetooth device app_handle is just RFCOMM channel + channel; // for Bluetooth device app_handle is just RFCOMM channel if (Error::OK != Connect(device->unique_device_id(), app_handle)) { errors_occured = true; } diff --git a/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc b/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc index 622531b120..2d1de703b1 100644 --- a/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc +++ b/src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc @@ -44,11 +44,12 @@ namespace transport_adapter { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") CloudWebsocketTransportAdapter::CloudWebsocketTransportAdapter( - resumption::LastState& last_state, const TransportManagerSettings& settings) + resumption::LastStateWrapperPtr last_state_wrapper, + const TransportManagerSettings& settings) : TransportAdapterImpl(NULL, new CloudWebsocketConnectionFactory(this), NULL, - last_state, + last_state_wrapper, settings) {} CloudWebsocketTransportAdapter::~CloudWebsocketTransportAdapter() {} diff --git a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc index 2e37f76bc9..6a43f66c64 100644 --- a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc +++ b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc @@ -54,9 +54,9 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "IAP2Emulation"); IAP2BluetoothEmulationTransportAdapter::IAP2BluetoothEmulationTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) - : TcpTransportAdapter(port, last_state, settings) {} + : TcpTransportAdapter(port, last_state_wrapper, settings) {} void IAP2BluetoothEmulationTransportAdapter::DeviceSwitched( const DeviceUID& device_handle) { @@ -76,9 +76,9 @@ void IAP2BluetoothEmulationTransportAdapter::TransportConfigUpdated( IAP2USBEmulationTransportAdapter::IAP2USBEmulationTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) - : TcpTransportAdapter(port, last_state, settings), out_(0) { + : TcpTransportAdapter(port, last_state_wrapper, settings), out_(0) { auto delegate = new IAPSignalHandlerDelegate(*this); signal_handler_ = threads::CreateThread("iAP signal handler", delegate); signal_handler_->start(); diff --git a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc index aeb50f3830..54eb3a7b6d 100644 --- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc +++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc @@ -53,7 +53,7 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") TcpTransportAdapter::TcpTransportAdapter( const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : TransportAdapterImpl( NULL, @@ -63,7 +63,7 @@ TcpTransportAdapter::TcpTransportAdapter( port, true, settings.transport_manager_tcp_adapter_network_interface()), - last_state, + last_state_wrapper, settings) {} TcpTransportAdapter::~TcpTransportAdapter() {} @@ -131,20 +131,22 @@ void TcpTransportAdapter::Store() const { } } tcp_adapter_dictionary["devices"] = devices_dictionary; - Json::Value& dictionary = last_state().get_dictionary(); + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); dictionary["TransportManager"]["TcpAdapter"] = tcp_adapter_dictionary; + accessor.GetMutableData().set_dictionary(dictionary); } bool TcpTransportAdapter::Restore() { LOG4CXX_AUTO_TRACE(logger_); bool errors_occurred = false; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); const Json::Value tcp_adapter_dictionary = - last_state().get_dictionary()["TransportManager"]["TcpAdapter"]; + dictionary["TransportManager"]["TcpAdapter"]; const Json::Value devices_dictionary = tcp_adapter_dictionary["devices"]; - for (Json::Value::const_iterator i = devices_dictionary.begin(); - i != devices_dictionary.end(); - ++i) { - const Json::Value device_dictionary = *i; + for (const auto& tcp_adapter_device : devices_dictionary) { + const Json::Value device_dictionary = tcp_adapter_device; std::string name = device_dictionary["name"].asString(); std::string address_record = device_dictionary["address"].asString(); in_addr_t address = inet_addr(address_record.c_str()); @@ -153,10 +155,8 @@ bool TcpTransportAdapter::Restore() { AddDevice(device); const Json::Value applications_dictionary = device_dictionary["applications"]; - for (Json::Value::const_iterator j = applications_dictionary.begin(); - j != applications_dictionary.end(); - ++j) { - const Json::Value application_dictionary = *j; + for (const auto& application : applications_dictionary) { + const Json::Value application_dictionary = application; std::string port_record = application_dictionary["port"].asString(); int port = atoi(port_record.c_str()); ApplicationHandle app_handle = tcp_device->AddDiscoveredApplication(port); 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 78a9840401..4e057aee63 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 @@ -70,7 +70,7 @@ TransportAdapterImpl::TransportAdapterImpl( DeviceScanner* device_scanner, ServerConnectionFactory* server_connection_factory, ClientConnectionListener* client_connection_listener, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : listeners_() , initialised_(0) @@ -86,7 +86,7 @@ TransportAdapterImpl::TransportAdapterImpl( device_scanner_(device_scanner) , server_connection_factory_(server_connection_factory) , client_connection_listener_(client_connection_listener) - , last_state_(last_state) + , last_state_wrapper_(last_state_wrapper) , settings_(settings) { } diff --git a/src/components/transport_manager/src/transport_manager_default.cc b/src/components/transport_manager/src/transport_manager_default.cc index 0d58e24b5c..868fcc3f15 100644 --- a/src/components/transport_manager/src/transport_manager_default.cc +++ b/src/components/transport_manager/src/transport_manager_default.cc @@ -57,29 +57,29 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") TransportAdapterFactory::TransportAdapterFactory() { #ifdef BLUETOOTH_SUPPORT - ta_bluetooth_creator_ = [](resumption::LastState& last_state, + ta_bluetooth_creator_ = [](resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) { - return new transport_adapter::BluetoothTransportAdapter(last_state, + return new transport_adapter::BluetoothTransportAdapter(last_state_wrapper, settings); }; #endif ta_tcp_creator_ = [](const uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) { return new transport_adapter::TcpTransportAdapter( - port, last_state, settings); + port, last_state_wrapper, settings); }; #if defined(USB_SUPPORT) - ta_usb_creator_ = [](resumption::LastState& last_state, + ta_usb_creator_ = [](resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) { - return new transport_adapter::UsbAoaAdapter(last_state, settings); + return new transport_adapter::UsbAoaAdapter(last_state_wrapper, settings); }; #endif #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) - ta_cloud_creator_ = [](resumption::LastState& last_state, + ta_cloud_creator_ = [](resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) { - return new transport_adapter::CloudWebsocketTransportAdapter(last_state, - settings); + return new transport_adapter::CloudWebsocketTransportAdapter( + last_state_wrapper, settings); }; #endif } @@ -89,9 +89,10 @@ TransportManagerDefault::TransportManagerDefault( const TransportAdapterFactory& ta_factory) : TransportManagerImpl(settings), ta_factory_(ta_factory) {} -int TransportManagerDefault::Init(resumption::LastState& last_state) { +int TransportManagerDefault::Init( + resumption::LastStateWrapperPtr last_state_wrapper) { LOG4CXX_TRACE(logger_, "enter"); - if (E_SUCCESS != TransportManagerImpl::Init(last_state)) { + if (E_SUCCESS != TransportManagerImpl::Init(last_state_wrapper)) { LOG4CXX_TRACE(logger_, "exit with E_TM_IS_NOT_INITIALIZED. Condition: E_SUCCESS != " "TransportManagerImpl::Init()"); @@ -101,7 +102,8 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { const auto& settings = get_settings(); #if defined(BLUETOOTH_SUPPORT) - auto ta_bluetooth = ta_factory_.ta_bluetooth_creator_(last_state, settings); + auto ta_bluetooth = + ta_factory_.ta_bluetooth_creator_(last_state_wrapper, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_bluetooth->SetTelemetryObserver(metric_observer_); @@ -110,8 +112,10 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { AddTransportAdapter(ta_bluetooth); #endif // BLUETOOTH_SUPPORT - auto ta_tcp = ta_factory_.ta_tcp_creator_( - settings.transport_manager_tcp_adapter_port(), last_state, settings); + auto ta_tcp = + ta_factory_.ta_tcp_creator_(settings.transport_manager_tcp_adapter_port(), + last_state_wrapper, + settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_tcp->SetTelemetryObserver(metric_observer_); @@ -120,7 +124,7 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { AddTransportAdapter(ta_tcp); #if defined(USB_SUPPORT) - auto ta_usb = ta_factory_.ta_usb_creator_(last_state, settings); + auto ta_usb = ta_factory_.ta_usb_creator_(last_state_wrapper, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_usb->SetTelemetryObserver(metric_observer_); @@ -130,7 +134,7 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { #endif // USB_SUPPORT #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) - auto ta_cloud = ta_factory_.ta_cloud_creator_(last_state, settings); + auto ta_cloud = ta_factory_.ta_cloud_creator_(last_state_wrapper, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_cloud->SetTelemetryObserver(metric_observer_); @@ -144,14 +148,14 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { transport_adapter::IAP2BluetoothEmulationTransportAdapter* iap2_bt_emu_adapter = new transport_adapter::IAP2BluetoothEmulationTransportAdapter( - iap2_bt_emu_port, last_state, settings); + iap2_bt_emu_port, last_state_wrapper, settings); AddTransportAdapter(iap2_bt_emu_adapter); const uint16_t iap2_usb_emu_port = 34567; transport_adapter::IAP2USBEmulationTransportAdapter* iap2_usb_emu_adapter = new transport_adapter::IAP2USBEmulationTransportAdapter( - iap2_usb_emu_port, last_state, settings); + iap2_usb_emu_port, last_state_wrapper, settings); AddTransportAdapter(iap2_usb_emu_adapter); #endif // BUILD_TEST @@ -160,6 +164,10 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { return E_SUCCESS; } +int TransportManagerDefault::Init(resumption::LastState&) { + return 1; +} + TransportManagerDefault::~TransportManagerDefault() {} } // namespace transport_manager diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index 07dd35bc2f..c6fd60a185 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -581,8 +581,18 @@ int TransportManagerImpl::SearchDevices() { return transport_adapter_search; } +int TransportManagerImpl::Init( + resumption::LastStateWrapperPtr last_state_wrapper) { + // Last state wrapper required to initialize Transport adapters + UNUSED(last_state_wrapper); + LOG4CXX_TRACE(logger_, "enter"); + is_initialized_ = true; + LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); + return E_SUCCESS; +} + int TransportManagerImpl::Init(resumption::LastState& last_state) { - // Last state requred to initialize Transport adapters + // Last state required to initialize Transport adapters UNUSED(last_state); LOG4CXX_TRACE(logger_, "enter"); is_initialized_ = true; diff --git a/src/components/transport_manager/src/usb/usb_aoa_adapter.cc b/src/components/transport_manager/src/usb/usb_aoa_adapter.cc index d1e9c64c3b..9ce571eb6c 100644 --- a/src/components/transport_manager/src/usb/usb_aoa_adapter.cc +++ b/src/components/transport_manager/src/usb/usb_aoa_adapter.cc @@ -43,12 +43,12 @@ namespace transport_manager { namespace transport_adapter { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") -UsbAoaAdapter::UsbAoaAdapter(resumption::LastState& last_state, +UsbAoaAdapter::UsbAoaAdapter(resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : TransportAdapterImpl(new UsbDeviceScanner(this, settings), new UsbConnectionFactory(this), NULL, - last_state, + last_state_wrapper, settings) , is_initialised_(false) , usb_handler_(new UsbHandler()) { diff --git a/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h b/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h index 2d240ab3ff..6e74ae759f 100644 --- a/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h +++ b/src/components/transport_manager/test/include/transport_manager/cloud/mock_cloud_websocket_transport_adapter.h @@ -45,9 +45,9 @@ class MockCloudWebsocketTransportAdapter : public CloudWebsocketTransportAdapter { public: MockCloudWebsocketTransportAdapter( - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const transport_manager::TransportManagerSettings& settings) - : CloudWebsocketTransportAdapter(last_state, settings) {} + : CloudWebsocketTransportAdapter(last_state_wrapper, settings) {} MOCK_CONST_METHOD0(GetDeviceType, DeviceType()); MOCK_CONST_METHOD0(Store, void()); MOCK_METHOD0(Restore, bool()); diff --git a/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h b/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h index fb84bce085..dbac183d32 100644 --- a/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h +++ b/src/components/transport_manager/test/include/transport_manager/tcp/mock_tcp_transport_adapter.h @@ -45,9 +45,9 @@ class MockTCPTransportAdapter : public TcpTransportAdapter { public: MockTCPTransportAdapter( uint16_t port, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const transport_manager::TransportManagerSettings& settings) - : TcpTransportAdapter(port, last_state, settings) {} + : TcpTransportAdapter(port, last_state_wrapper, settings) {} MOCK_CONST_METHOD2( FindEstablishedConnection, ConnectionSPtr(const transport_manager::DeviceUID& device_handle, diff --git a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h index 592ed855cc..7b1d720ba2 100644 --- a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h +++ b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_impl.h @@ -58,14 +58,21 @@ class MockTransportAdapterImpl : public TransportAdapterImpl { DeviceScanner* device_scanner, ServerConnectionFactory* server_connection_factory, ClientConnectionListener* client_connection_listener, - resumption::LastState& last_state, + resumption::LastStateWrapperPtr last_state_wrapper, const transport_manager::TransportManagerSettings& settings) : TransportAdapterImpl(device_scanner, server_connection_factory, client_connection_listener, - last_state, + last_state_wrapper, settings) {} + DEPRECATED + MockTransportAdapterImpl(DeviceScanner*, + ServerConnectionFactory*, + ClientConnectionListener*, + resumption::LastState&, + const transport_manager::TransportManagerSettings&); + ConnectionSPtr FindStatedConnection(const DeviceUID& device_handle, const ApplicationHandle& app_handle) { return this->FindEstablishedConnection(device_handle, app_handle); diff --git a/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h b/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h index 230f5ed170..affd6aee47 100644 --- a/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h +++ b/src/components/transport_manager/test/include/transport_manager/usb/mock_usb_aoa_adapter.h @@ -43,9 +43,9 @@ using namespace ::transport_manager::transport_adapter; class MockUsbAoaAdapter : public UsbAoaAdapter { public: - MockUsbAoaAdapter(resumption::LastState& last_state, + MockUsbAoaAdapter(resumption::LastStateWrapperPtr last_state_wrapper, const transport_manager::TransportManagerSettings& settings) - : UsbAoaAdapter(last_state, settings) {} + : UsbAoaAdapter(last_state_wrapper, settings) {} MOCK_CONST_METHOD0(GetDeviceType, DeviceType()); MOCK_CONST_METHOD0(IsInitialised, bool()); MOCK_METHOD1(AddListener, void(TransportAdapterListener* listener)); diff --git a/src/components/transport_manager/test/tcp_transport_adapter_test.cc b/src/components/transport_manager/test/tcp_transport_adapter_test.cc index 0fbdc6d65f..cacdfb6fbd 100644 --- a/src/components/transport_manager/test/tcp_transport_adapter_test.cc +++ b/src/components/transport_manager/test/tcp_transport_adapter_test.cc @@ -34,6 +34,7 @@ #include "gtest/gtest.h" #include "protocol/raw_message.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "transport_manager/mock_transport_manager_settings.h" #include "transport_manager/tcp/mock_tcp_transport_adapter.h" #include "transport_manager/transport_adapter/connection.h" @@ -55,9 +56,13 @@ using namespace transport_manager::transport_adapter; class TcpAdapterTest : public ::testing::Test { protected: - TcpAdapterTest() : last_state_("app_storage_folder", "app_info_storage") {} + TcpAdapterTest() { + last_state_wrapper_ = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage")); + } MockTransportManagerSettings transport_manager_settings; - resumption::LastStateImpl last_state_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; const uint32_t port = 12345; const std::string string_port = "12345"; std::string network_interface = ""; @@ -72,7 +77,7 @@ class TcpAdapterTest : public ::testing::Test { TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); std::string uniq_id = "unique_device_name"; std::shared_ptr<MockTCPDevice> mockdev = std::make_shared<MockTCPDevice>(port, uniq_id); @@ -96,8 +101,9 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { transport_adapter.CallStore(); // Check that value is saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = dictionary["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -112,7 +118,7 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); const uint32_t count_dev = 10; std::shared_ptr<MockTCPDevice> mockdev[count_dev]; std::string uniq_id[count_dev]; @@ -148,8 +154,9 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { transport_adapter.CallStore(); // Check that values are saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = dictionary["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -166,7 +173,7 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); const uint32_t count_dev = 10; std::shared_ptr<MockTCPDevice> mockdev[count_dev]; @@ -206,8 +213,9 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { transport_adapter.CallStore(); // Check that value is saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = dictionary["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -225,7 +233,7 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) { // Prepare MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); std::string uniq_id = "unique_device_name"; auto mockdev = std::make_shared<MockTCPDevice>(port, uniq_id); transport_adapter.AddDevice(mockdev); @@ -243,26 +251,32 @@ TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) { transport_adapter.CallStore(); // Check that value is not saved - Json::Value& tcp_dict = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]["devices"]; + resumption::LastStateAccessor accessor = last_state_wrapper_->get_accessor(); + const Json::Value dictionary = accessor.GetData().dictionary(); + const Json::Value& tcp_dict = + dictionary["TransportManager"]["TcpAdapter"]["devices"]; ASSERT_TRUE(tcp_dict.isNull()); } TEST_F(TcpAdapterTest, RestoreData_DataNotStored) { - Json::Value& tcp_adapter_dictionary = - last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; - - tcp_adapter_dictionary = Json::Value(); + { + resumption::LastStateAccessor accessor = + last_state_wrapper_->get_accessor(); + Json::Value dictionary = accessor.GetData().dictionary(); + Json::Value& tcp_dictionary = dictionary["TransportManager"]["TcpAdapter"]; + tcp_dictionary = Json::Value(); + accessor.GetMutableData().set_dictionary(dictionary); + } MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); EXPECT_CALL(transport_adapter, Connect(_, _)).Times(0); EXPECT_TRUE(transport_adapter.CallRestore()); } TEST_F(TcpAdapterTest, StoreDataWithOneDevice_RestoreData) { MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); std::string uniq_id = "unique_device_name"; std::shared_ptr<MockTCPDevice> mockdev = std::make_shared<MockTCPDevice>(port, uniq_id); @@ -297,7 +311,7 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDevice_RestoreData) { TEST_F(TcpAdapterTest, StoreDataWithSeveralDevices_RestoreData) { MockTCPTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); const uint32_t count_dev = 10; std::shared_ptr<MockTCPDevice> mockdev[count_dev]; @@ -351,7 +365,7 @@ TEST_F(TcpAdapterTest, NotifyTransportConfigUpdated) { MockTransportAdapterListener mock_adapter_listener; TcpTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + port, last_state_wrapper_, transport_manager_settings); transport_adapter.AddListener(&mock_adapter_listener); TransportConfig config; @@ -367,8 +381,8 @@ TEST_F(TcpAdapterTest, NotifyTransportConfigUpdated) { } TEST_F(TcpAdapterTest, GetTransportConfiguration) { - TcpTransportAdapter transport_adapter( - port, last_state_, transport_manager_settings); + MockTCPTransportAdapter transport_adapter( + port, last_state_wrapper_, transport_manager_settings); TransportConfig config; config[tc_enabled] = std::string("true"); diff --git a/src/components/transport_manager/test/transport_adapter_test.cc b/src/components/transport_manager/test/transport_adapter_test.cc index 025c86f3ac..1773ecfb67 100644 --- a/src/components/transport_manager/test/transport_adapter_test.cc +++ b/src/components/transport_manager/test/transport_adapter_test.cc @@ -51,6 +51,7 @@ #include "config_profile/profile.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" namespace test { namespace components { @@ -65,8 +66,11 @@ using namespace ::protocol_handler; class TransportAdapterTest : public ::testing::Test { protected: - TransportAdapterTest() - : last_state_("app_storage_folder", "app_info_storage") {} + TransportAdapterTest() { + last_state_wrapper_ = std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage")); + } void SetUp() OVERRIDE { dev_id = "device_id"; @@ -82,7 +86,7 @@ class TransportAdapterTest : public ::testing::Test { } NiceMock<MockTransportManagerSettings> transport_manager_settings; - resumption::LastStateImpl last_state_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; std::string dev_id; std::string uniq_id; int app_handle; @@ -228,7 +232,7 @@ TEST_F(TransportAdapterTest, Init) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -247,8 +251,11 @@ TEST_F(TransportAdapterTest, Init) { TEST_F(TransportAdapterTest, SearchDevices_WithoutScanner) { MockClientConnectionListener* clientMock = new MockClientConnectionListener(); MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); - MockTransportAdapterImpl transport_adapter( - NULL, serverMock, clientMock, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(NULL, + serverMock, + clientMock, + last_state_wrapper_, + transport_manager_settings); EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK)); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -264,7 +271,7 @@ TEST_F(TransportAdapterTest, SearchDevices_WithoutScanner) { TEST_F(TransportAdapterTest, SearchDevices_DeviceNotInitialized) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, NULL, last_state_, transport_manager_settings); + dev_mock, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -280,7 +287,7 @@ TEST_F(TransportAdapterTest, SearchDevices_DeviceNotInitialized) { TEST_F(TransportAdapterTest, SearchDevices_DeviceInitialized) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, NULL, last_state_, transport_manager_settings); + dev_mock, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -296,7 +303,7 @@ TEST_F(TransportAdapterTest, SearchDevices_DeviceInitialized) { TEST_F(TransportAdapterTest, SearchDeviceDone_DeviceExisting) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -313,7 +320,7 @@ TEST_F(TransportAdapterTest, SearchDeviceDone_DeviceExisting) { TEST_F(TransportAdapterTest, SearchDeviceFailed) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -328,7 +335,7 @@ TEST_F(TransportAdapterTest, SearchDeviceFailed) { TEST_F(TransportAdapterTest, AddDevice) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -346,7 +353,7 @@ TEST_F(TransportAdapterTest, AddDevice) { TEST_F(TransportAdapterTest, Connect_ServerNotSupported) { MockClientConnectionListener* clientMock = new MockClientConnectionListener(); MockTransportAdapterImpl transport_adapter( - NULL, NULL, clientMock, last_state_, transport_manager_settings); + NULL, NULL, clientMock, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -364,7 +371,7 @@ TEST_F(TransportAdapterTest, Connect_ServerNotSupported) { TEST_F(TransportAdapterTest, Connect_ServerNotInitialized) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -382,7 +389,7 @@ TEST_F(TransportAdapterTest, Connect_ServerNotInitialized) { TEST_F(TransportAdapterTest, Connect_Success) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -401,7 +408,7 @@ TEST_F(TransportAdapterTest, Connect_Success) { TEST_F(TransportAdapterTest, Connect_DeviceAddedTwice) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -424,7 +431,7 @@ TEST_F(TransportAdapterTest, Connect_DeviceAddedTwice) { TEST_F(TransportAdapterTest, ConnectDevice_ServerNotAdded_DeviceAdded) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -450,7 +457,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_ServerNotAdded_DeviceAdded) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceNotAdded) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); @@ -471,7 +478,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceNotAdded) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -504,7 +511,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded_ConnectFailedRetry) { MockServerConnectionFactory* server_mock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, server_mock, NULL, last_state_, transport_manager_settings); + NULL, server_mock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*server_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -541,7 +548,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded_ConnectFailedRetry) { TEST_F(TransportAdapterTest, ConnectDevice_DeviceAddedTwice) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -585,7 +592,7 @@ TEST_F(TransportAdapterTest, ConnectDevice_DeviceAddedTwice) { TEST_F(TransportAdapterTest, Disconnect_ConnectDoneSuccess) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -618,7 +625,7 @@ TEST_F(TransportAdapterTest, Disconnect_ConnectDoneSuccess) { TEST_F(TransportAdapterTest, FindPending) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -661,7 +668,7 @@ TEST_F(TransportAdapterTest, Pending_Connect_Disconnect_ConnectDoneSuccess_PendingDeviceAdded) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -754,7 +761,7 @@ TEST_F(TransportAdapterTest, TEST_F(TransportAdapterTest, WebsocketEndpointParsing_SUCCESS) { std::shared_ptr<CloudWebsocketTransportAdapter> cta = std::make_shared<CloudWebsocketTransportAdapter>( - last_state_, transport_manager_settings); + last_state_wrapper_, transport_manager_settings); for (auto protocol : kWebsocketProtocols) { for (auto endpoint : kValidTestEndpoints) { @@ -782,7 +789,7 @@ TEST_F(TransportAdapterTest, WebsocketEndpointParsing_SUCCESS) { TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INVALID) { std::shared_ptr<CloudWebsocketTransportAdapter> cta = std::make_shared<CloudWebsocketTransportAdapter>( - last_state_, transport_manager_settings); + last_state_wrapper_, transport_manager_settings); for (auto protocol : kWebsocketProtocols) { for (auto endpoint : kInvalidTestEndpoints) { @@ -802,7 +809,7 @@ TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INVALID) { TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INCORRECT) { std::shared_ptr<CloudWebsocketTransportAdapter> cta = std::make_shared<CloudWebsocketTransportAdapter>( - last_state_, transport_manager_settings); + last_state_wrapper_, transport_manager_settings); for (auto protocol : kWebsocketProtocols) { for (auto endpoint : kIncorrectTestEndpoints) { @@ -832,7 +839,7 @@ TEST_F(TransportAdapterTest, WebsocketEndpointParsing_INCORRECT) { TEST_F(TransportAdapterTest, DisconnectDevice_DeviceAddedConnectionCreated) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -876,7 +883,7 @@ TEST_F(TransportAdapterTest, DisconnectDevice_DeviceAddedConnectionCreated) { TEST_F(TransportAdapterTest, DeviceDisconnected) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -926,7 +933,7 @@ TEST_F(TransportAdapterTest, DeviceDisconnected) { TEST_F(TransportAdapterTest, AbortedConnectSuccess) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -952,8 +959,11 @@ TEST_F(TransportAdapterTest, AbortedConnectSuccess) { TEST_F(TransportAdapterTest, SendData) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); - MockTransportAdapterImpl transport_adapter( - dev_mock, serverMock, NULL, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(dev_mock, + serverMock, + NULL, + last_state_wrapper_, + transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -995,7 +1005,7 @@ TEST_F(TransportAdapterTest, SendData_ConnectionNotEstablished) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); @@ -1032,8 +1042,11 @@ TEST_F(TransportAdapterTest, SendData_ConnectionNotEstablished) { TEST_F(TransportAdapterTest, StartClientListening_ClientNotInitialized) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockClientConnectionListener* clientMock = new MockClientConnectionListener(); - MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, clientMock, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(dev_mock, + NULL, + clientMock, + last_state_wrapper_, + transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -1055,8 +1068,11 @@ TEST_F(TransportAdapterTest, StartClientListening_ClientNotInitialized) { TEST_F(TransportAdapterTest, StartClientListening) { MockDeviceScanner* dev_mock = new MockDeviceScanner(); MockClientConnectionListener* clientMock = new MockClientConnectionListener(); - MockTransportAdapterImpl transport_adapter( - dev_mock, NULL, clientMock, last_state_, transport_manager_settings); + MockTransportAdapterImpl transport_adapter(dev_mock, + NULL, + clientMock, + last_state_wrapper_, + transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -1083,7 +1099,7 @@ TEST_F(TransportAdapterTest, StopClientListening_Success) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); @@ -1119,7 +1135,7 @@ TEST_F(TransportAdapterTest, FindNewApplicationsRequest) { MockTransportAdapterImpl transport_adapter(dev_mock, serverMock, clientMock, - last_state_, + last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); @@ -1142,7 +1158,7 @@ TEST_F(TransportAdapterTest, FindNewApplicationsRequest) { TEST_F(TransportAdapterTest, GetDeviceAndApplicationLists) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -1167,7 +1183,7 @@ TEST_F(TransportAdapterTest, GetDeviceAndApplicationLists) { TEST_F(TransportAdapterTest, FindEstablishedConnection) { MockServerConnectionFactory* serverMock = new MockServerConnectionFactory(); MockTransportAdapterImpl transport_adapter( - NULL, serverMock, NULL, last_state_, transport_manager_settings); + NULL, serverMock, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK)); @@ -1198,7 +1214,7 @@ TEST_F(TransportAdapterTest, RunAppOnDevice_NoDeviseWithAskedId_UNSUCCESS) { const std::string bundle_id = "test_bundle_id"; MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); std::shared_ptr<MockDevice> mock_device = @@ -1218,7 +1234,7 @@ TEST_F(TransportAdapterTest, RunAppOnDevice_DeviseWithAskedIdWasFound_SUCCESS) { const std::string device_uid = "test_device_uid"; MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); std::shared_ptr<MockDevice> mock_device = @@ -1235,7 +1251,7 @@ TEST_F(TransportAdapterTest, RunAppOnDevice_DeviseWithAskedIdWasFound_SUCCESS) { TEST_F(TransportAdapterTest, StopDevice) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -1250,7 +1266,7 @@ TEST_F(TransportAdapterTest, StopDevice) { TEST_F(TransportAdapterTest, TransportConfigUpdated) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); @@ -1269,7 +1285,7 @@ TEST_F(TransportAdapterTest, TransportConfigUpdated) { TEST_F(TransportAdapterTest, GetTransportConfigration) { MockTransportAdapterImpl transport_adapter( - NULL, NULL, NULL, last_state_, transport_manager_settings); + NULL, NULL, NULL, last_state_wrapper_, transport_manager_settings); SetDefaultExpectations(transport_adapter); EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true)); transport_adapter.Init(); diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc index 8a7f95c74b..bedc1634cc 100644 --- a/src/components/transport_manager/test/transport_manager_default_test.cc +++ b/src/components/transport_manager/test/transport_manager_default_test.cc @@ -32,6 +32,7 @@ #include "transport_manager/transport_manager_default.h" #include "gtest/gtest.h" +#include "resumption/last_state_wrapper_impl.h" #include "resumption/mock_last_state.h" #include "transport_manager/bt/mock_bluetooth_transport_adapter.h" #include "transport_manager/cloud/mock_cloud_websocket_transport_adapter.h" @@ -86,10 +87,13 @@ class TestTransportManagerDefault : public ::testing::Test { public: TestTransportManagerDefault() : transport_manager_settings_() + , mock_last_state_(std::make_shared<MockLastState>()) , unique_tcp_dev_name_("unique_tcp_device_name") , dev_id_("device_id") , tcp_adapter_port_(1u) - , network_interface_("test_iface") {} + , network_interface_("test_iface") + , last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>( + mock_last_state_)) {} void SetUp() OVERRIDE { EXPECT_CALL(transport_manager_settings_, @@ -100,43 +104,45 @@ class TestTransportManagerDefault : public ::testing::Test { // to be able to check related function calls mock_bt_ta_ = new MockBluetoothTransportAdapter(); mock_tcp_ta_ = new MockTCPTransportAdapter( - tcp_adapter_port_, mock_last_state_, transport_manager_settings_); + tcp_adapter_port_, last_state_wrapper_, transport_manager_settings_); mock_usb_aoa_ta_ = - new MockUsbAoaAdapter(mock_last_state_, transport_manager_settings_); + new MockUsbAoaAdapter(last_state_wrapper_, transport_manager_settings_); mock_cloud_websocket_ta_ = new MockCloudWebsocketTransportAdapter( - mock_last_state_, transport_manager_settings_); + last_state_wrapper_, transport_manager_settings_); TransportAdapterFactory ta_factory; #ifdef BLUETOOTH_SUPPORT ta_factory.ta_bluetooth_creator_ = - [&](resumption::LastState& last_state, + [&](resumption::LastStateWrapperPtr& last_state_wrapper, const TransportManagerSettings& settings) { - UNUSED(last_state); + UNUSED(last_state_wrapper); UNUSED(settings); return mock_bt_ta_; }; #endif - ta_factory.ta_tcp_creator_ = [&](const uint16_t port, - resumption::LastState& last_state, - const TransportManagerSettings& settings) { - UNUSED(port); - UNUSED(last_state); - UNUSED(settings); - return mock_tcp_ta_; - }; + ta_factory.ta_tcp_creator_ = + [&](const uint16_t port, + resumption::LastStateWrapperPtr& last_state_wrapper, + const TransportManagerSettings& settings) { + UNUSED(port); + UNUSED(last_state_wrapper); + UNUSED(settings); + return mock_tcp_ta_; + }; #if defined(USB_SUPPORT) - ta_factory.ta_usb_creator_ = [&](resumption::LastState& last_state, - const TransportManagerSettings& settings) { - UNUSED(last_state); - UNUSED(settings); - return mock_usb_aoa_ta_; - }; + ta_factory.ta_usb_creator_ = + [&](resumption::LastStateWrapperPtr& last_state_wrapper, + const TransportManagerSettings& settings) { + UNUSED(last_state_wrapper); + UNUSED(settings); + return mock_usb_aoa_ta_; + }; #endif #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) ta_factory.ta_cloud_creator_ = - [&](resumption::LastState& last_state, + [&](resumption::LastStateWrapperPtr& last_state_wrapper, const TransportManagerSettings& settings) { - UNUSED(last_state); + UNUSED(last_state_wrapper); UNUSED(settings); return mock_cloud_websocket_ta_; }; @@ -154,7 +160,7 @@ class TestTransportManagerDefault : public ::testing::Test { protected: MockTransportManagerSettings transport_manager_settings_; std::unique_ptr<TransportManagerDefault> transport_manager_; - NiceMock<MockLastState> mock_last_state_; + std::shared_ptr<MockLastState> mock_last_state_; Json::Value custom_dictionary_; const std::string unique_tcp_dev_name_; const std::string dev_id_; @@ -166,6 +172,7 @@ class TestTransportManagerDefault : public ::testing::Test { MockTCPTransportAdapter* mock_tcp_ta_; MockUsbAoaAdapter* mock_usb_aoa_ta_; MockCloudWebsocketTransportAdapter* mock_cloud_websocket_ta_; + std::shared_ptr<resumption::LastStateWrapperImpl> last_state_wrapper_; }; void TestTransportManagerDefault::ExpectationsSettings_TM( @@ -185,17 +192,16 @@ void TestTransportManagerDefault::ExpectationsSettings_TM( custom_dictionary_[kTransportManager][kTcpAdapter][kDevices][0] = tcp_device; custom_dictionary_[kTransportManager][kBluetoothAdapter][kDevices][0] = bluetooth_device; - ON_CALL(mock_last_state_, get_dictionary()) + ON_CALL(*mock_last_state_, dictionary()) + .WillByDefault(Return(custom_dictionary_)); + ON_CALL(*mock_last_state_, get_dictionary()) .WillByDefault(ReturnRef(custom_dictionary_)); - EXPECT_CALL(transport_manager_settings_, use_last_state()) .WillRepeatedly(Return(use_last_state)); EXPECT_CALL(transport_manager_settings_, transport_manager_tcp_adapter_port()) .WillRepeatedly(Return(tcp_adapter_port_)); - EXPECT_CALL(transport_manager_settings_, bluetooth_uuid()) .WillRepeatedly(Return(kBTUUID.data())); - EXPECT_CALL(transport_manager_settings_, aoa_filter_manufacturer()) .WillRepeatedly(ReturnRef(dummy_parameter_)); EXPECT_CALL(transport_manager_settings_, aoa_filter_model_name()) @@ -271,7 +277,7 @@ TEST_F(TestTransportManagerDefault, Init_LastStateNotUsed) { ExpectationsCloudWebsocket_TA(); // Act - transport_manager_->Init(mock_last_state_); + transport_manager_->Init(last_state_wrapper_); transport_manager_->Stop(); } @@ -285,7 +291,7 @@ TEST_F(TestTransportManagerDefault, Init_LastStateUsed) { ExpectationsCloudWebsocket_TA(); // Act - transport_manager_->Init(mock_last_state_); + transport_manager_->Init(last_state_wrapper_); transport_manager_->Stop(); } diff --git a/src/components/transport_manager/test/transport_manager_impl_test.cc b/src/components/transport_manager/test/transport_manager_impl_test.cc index ac9b801dbd..db4813be9a 100644 --- a/src/components/transport_manager/test/transport_manager_impl_test.cc +++ b/src/components/transport_manager/test/transport_manager_impl_test.cc @@ -35,6 +35,7 @@ #include "gtest/gtest.h" #include "protocol/raw_message.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "transport_manager/common.h" #include "transport_manager/mock_telemetry_observer.h" #include "transport_manager/mock_transport_manager_impl.h" @@ -79,9 +80,11 @@ class TransportManagerImplTest : public ::testing::Test { device_handle_, mac_address_, device_name_, connection_type_) {} void SetUp() OVERRIDE { - resumption::LastStateImpl last_state_("app_storage_folder", - "app_info_storage"); - tm_.Init(last_state_); + std::shared_ptr<resumption::LastStateWrapperImpl> wrapper = + std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage")); + tm_.Init(wrapper); mock_adapter_ = new MockTransportAdapter(); tm_listener_ = std::make_shared<MockTransportManagerListener>(); diff --git a/src/components/transport_manager/test/websocket_connection_test.cc b/src/components/transport_manager/test/websocket_connection_test.cc index 6f6baa82fd..a7ddb820a0 100644 --- a/src/components/transport_manager/test/websocket_connection_test.cc +++ b/src/components/transport_manager/test/websocket_connection_test.cc @@ -32,6 +32,7 @@ #include "gtest/gtest.h" #include "resumption/last_state_impl.h" +#include "resumption/last_state_wrapper_impl.h" #include "transport_manager/cloud/cloud_websocket_transport_adapter.h" #include "transport_manager/cloud/sample_websocket_server.h" #include "transport_manager/cloud/websocket_client_connection.h" @@ -99,7 +100,9 @@ class WebsocketConnectionTest : public ::testing::Test { protected: WebsocketConnectionTest() - : last_state_("app_storage_folder", "app_info_storage") {} + : last_state_(std::make_shared<resumption::LastStateWrapperImpl>( + std::make_shared<resumption::LastStateImpl>("app_storage_folder", + "app_info_storage"))) {} ~WebsocketConnectionTest() {} @@ -109,7 +112,7 @@ class WebsocketConnectionTest : public ::testing::Test { } NiceMock<MockTransportManagerSettings> transport_manager_settings; - resumption::LastStateImpl last_state_; + resumption::LastStateWrapperPtr last_state_; std::string dev_id; std::string uniq_id; std::shared_ptr<websocket::WSSession> ws_session; |