diff options
author | Andriy Byzhynar (GitHub) <AByzhynar@luxoft.com> | 2018-09-18 19:44:26 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-18 19:44:26 +0300 |
commit | 927d570aa26c88595018e95a6696b591a0a938a7 (patch) | |
tree | 30dc82d0bb9b8b9a08e0ad8a67048f6a49f1c671 | |
parent | 108e01480821ff0499e4622127e8253471681d48 (diff) | |
parent | 385be61be82458c704c6d8f25cd89a8267260275 (diff) | |
download | sdl_core-927d570aa26c88595018e95a6696b591a0a938a7.tar.gz |
Merge pull request #2606 from mked-luxoft/fix/subscribe_vehicle_data_on_resumption
Fix/subscribe vehicle data on resumption
38 files changed, 1112 insertions, 130 deletions
diff --git a/src/components/application_manager/include/application_manager/resumption/extension_pending_resumption_handler.h b/src/components/application_manager/include/application_manager/resumption/extension_pending_resumption_handler.h new file mode 100644 index 0000000000..3b96fcbcaf --- /dev/null +++ b/src/components/application_manager/include/application_manager/resumption/extension_pending_resumption_handler.h @@ -0,0 +1,40 @@ +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_RESUMPTION_EXTENSION_PENDING_RESUMPTION_HANDLER_H +#define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_RESUMPTION_EXTENSION_PENDING_RESUMPTION_HANDLER_H +#include "application_manager/event_engine/event_observer.h" +#include "application_manager/application_manager.h" +#include "application_manager/app_extension.h" + +namespace resumption { + +namespace app_mngr = application_manager; + +class ExtensionPendingResumptionHandler + : public application_manager::event_engine::EventObserver { + public: + ExtensionPendingResumptionHandler( + app_mngr::ApplicationManager& application_manager); + + virtual ~ExtensionPendingResumptionHandler() {} + + // EventObserver interface + virtual void on_event( + const application_manager::event_engine::Event& event) = 0; + + virtual void HandleResumptionSubscriptionRequest( + app_mngr::AppExtension& extension, + Subscriber& subscriber, + application_manager::Application& app) = 0; + + virtual void ClearPendingResumptionRequests() = 0; + + protected: + virtual ResumptionRequest MakeResumptionRequest( + const uint32_t corr_id, + const hmi_apis::FunctionID::eType function_id, + const smart_objects::SmartObject& message); + + app_mngr::ApplicationManager& application_manager_; +}; +} // namespace resumption + +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_RESUMPTION_EXTENSION_PENDING_RESUMPTION_HANDLER_H diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h index 370caffc75..6a12b34e7d 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 @@ -176,9 +176,12 @@ class ResumeCtrl { /** * @brief Handle restored data when timeout appeared - * @param application id - const int32_t + * @param correlation_id - const int32_t + * @param function id hmi_apis::FunctionID::eType */ - virtual void HandleOnTimeOut(const int32_t app_id) = 0; + + virtual void HandleOnTimeOut(const uint32_t correlation_id, + const hmi_apis::FunctionID::eType) = 0; /** * @brief Start timer for resumption applications 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 8f98827a68..2935066502 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 @@ -175,7 +175,8 @@ class ResumeCtrlImpl : public ResumeCtrl { const std::string& hash, ResumptionCallBack callback) OVERRIDE; - void HandleOnTimeOut(const int32_t app_id) OVERRIDE; + void HandleOnTimeOut(const uint32_t correlation_id, + const hmi_apis::FunctionID::eType) OVERRIDE; /** * @brief Start timer for resumption applications diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h b/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h index 4337123f9e..434bd9ed4b 100644 --- a/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h +++ b/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h @@ -102,7 +102,8 @@ class ResumptionDataProcessor : public app_mngr::event_engine::EventObserver { * @brief Handle restored data when timeout appeared * @param application id - const int32_t */ - void HandleOnTimeOut(const int32_t app_id); + void HandleOnTimeOut(const uint32_t correlation_id, + const hmi_apis::FunctionID::eType); private: /** diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_subscribe_way_points_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_subscribe_way_points_request.h index 052c3c7151..97b6966e70 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_subscribe_way_points_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_subscribe_way_points_request.h @@ -65,6 +65,8 @@ class NaviSubscribeWayPointsRequest : public app_mngr::commands::RequestToHMI { **/ virtual void Run() OVERRIDE; + void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(NaviSubscribeWayPointsRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/tts_set_global_properties_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/tts_set_global_properties_request.h index f416b3a787..98c7977391 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/tts_set_global_properties_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/tts_set_global_properties_request.h @@ -67,6 +67,8 @@ class TTSSetGlobalPropertiesRequest : public app_mngr::commands::RequestToHMI { **/ virtual void Run(); + virtual void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(TTSSetGlobalPropertiesRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_command_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_command_request.h index e5d2483576..1779249bfe 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_command_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_command_request.h @@ -66,6 +66,8 @@ class UIAddCommandRequest : public app_mngr::commands::RequestToHMI { **/ virtual void Run(); + virtual void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(UIAddCommandRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_submenu_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_submenu_request.h index 5de5e41cd6..db48b687cf 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_submenu_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_add_submenu_request.h @@ -66,6 +66,8 @@ class UIAddSubmenuRequest : public app_mngr::commands::RequestToHMI { **/ virtual void Run(); + virtual void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(UIAddSubmenuRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_global_properties_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_global_properties_request.h index 44e8bba450..4ed514ad02 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_global_properties_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_global_properties_request.h @@ -67,6 +67,8 @@ class UISetGlobalPropertiesRequest : public app_mngr::commands::RequestToHMI { **/ virtual void Run(); + virtual void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(UISetGlobalPropertiesRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/vr_add_command_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/vr_add_command_request.h index 0abb37adbc..1269128c14 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/vr_add_command_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/vr_add_command_request.h @@ -61,6 +61,8 @@ class VRAddCommandRequest : public app_mngr::commands::RequestToHMI { **/ virtual ~VRAddCommandRequest(); + void onTimeOut() OVERRIDE; + /** * @brief Execute command **/ diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h index 95b7547a54..72d6a65a7a 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h @@ -117,10 +117,10 @@ class RegisterAppInterfaceRequest * @brief Prepares and sends RegisterAppInterface response to mobile * considering application type * @param app_type Type of application + * @param add_info - additional information to be sent to mobile app **/ void SendRegisterAppInterfaceResponseToMobile(ApplicationType app_type, - const std::string& add_info, - bool need_restore_vr); + const std::string& add_info); smart_objects::SmartObjectSPtr GetLockScreenIconUrlNotification( const uint32_t connection_key, app_mngr::ApplicationSharedPtr app); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_app_extension.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_app_extension.h new file mode 100644 index 0000000000..10ce89b261 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_app_extension.h @@ -0,0 +1,86 @@ +/* + Copyright (c) 2018, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_PLUGIN_INCLUDE_SDL_PLUGIN_SDL_APP_EXTENSION_H +#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_PLUGIN_INCLUDE_SDL_PLUGIN_SDL_APP_EXTENSION_H + +#include <application_manager/application_manager.h> + +namespace sdl_rpc_plugin { +class SDLRPCPlugin; + +namespace app_mngr = application_manager; + +class SDLAppExtension : public app_mngr::AppExtension { + public: + /** + * @brief SDLAppExtension constructor + * @param plugin sdl info plugin + * @param app application that contains this plugin + */ + SDLAppExtension(SDLRPCPlugin& plugin, app_mngr::Application& app); + virtual ~SDLAppExtension(); + + /** + * @brief SaveResumptionData saves vehicle info data + * @param resumption_data plase to store resumption data + */ + void SaveResumptionData(smart_objects::SmartObject& resumption_data) OVERRIDE; + + /** + * @brief ProcessResumption load resumtion data back to plugin during + * resumption + * @param resumption_data resumption data + * @param subscriber callback for subscription + */ + void ProcessResumption(const smart_objects::SmartObject& saved_app, + resumption::Subscriber subscriber) OVERRIDE; + + /** + * @brief Revert the data to the state before Resumption. + * @param subscriptions Subscriptions to be returned + **/ + void RevertResumption( + const smart_objects::SmartObject& subscriptions) OVERRIDE; + + /** + * @brief SDLAppExtensionUID unique identifier of VehicleInfo + * aplication extension + */ + static unsigned SDLAppExtensionUID; + + private: + SDLRPCPlugin& plugin_; + app_mngr::Application& app_; +}; +} +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_PLUGIN_INCLUDE_SDL_PLUGIN_SDL_APP_EXTENSION_H diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_pending_resumption_handler.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_pending_resumption_handler.h new file mode 100644 index 0000000000..2dc83202d0 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/sdl_pending_resumption_handler.h @@ -0,0 +1,83 @@ +/* + Copyright (c) 2018, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_PLUGIN_INCLUDE_SDL_PLUGIN_SDL_PENDING_RESUMPTION_HANDLER_H +#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_PLUGIN_INCLUDE_SDL_PLUGIN_SDL_PENDING_RESUMPTION_HANDLER_H + +#include "application_manager/event_engine/event_observer.h" +#include "application_manager/resumption/extension_pending_resumption_handler.h" +#include "sdl_rpc_plugin/sdl_app_extension.h" + +namespace sdl_rpc_plugin { + +namespace app_mngr = application_manager; + +class SDLPendingResumptionHandler + : public resumption::ExtensionPendingResumptionHandler { + public: + SDLPendingResumptionHandler( + app_mngr::ApplicationManager& application_manager); + + // EventObserver interface + void on_event(const app_mngr::event_engine::Event& event) OVERRIDE; + + void HandleResumptionSubscriptionRequest( + app_mngr::AppExtension& extension, + resumption::Subscriber& subscriber, + application_manager::Application& app) OVERRIDE; + + void ClearPendingResumptionRequests() OVERRIDE; + + private: + smart_objects::SmartObjectSPtr CreateSubscriptionRequest(); + + struct ResumptionAwaitingHandling { + const uint32_t app_id; + SDLAppExtension& ext; + resumption::Subscriber subscriber; + + ResumptionAwaitingHandling(const uint32_t application_id, + SDLAppExtension& extension, + resumption::Subscriber subscriber_callback) + : app_id(application_id) + , ext(extension) + , subscriber(subscriber_callback) {} + }; + + typedef std::pair<SDLAppExtension, resumption::Subscriber> FreezedResumption; + std::queue<ResumptionAwaitingHandling> freezed_resumptions_; + std::map<uint32_t, smart_objects::SmartObject> pending_requests_; + std::queue<uint32_t> app_ids_; +}; +} + +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_PLUGIN_INCLUDE_SDL_PLUGIN_SDL_PENDING_RESUMPTION_HANDLER_H 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 6ae3a0b6bc..a5360992ea 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 @@ -34,12 +34,16 @@ #define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_SDL_RPC_PLUGIN_H #include "application_manager/plugin_manager/rpc_plugin.h" #include "application_manager/command_factory.h" +#include "application_manager/resumption/extension_pending_resumption_handler.h" namespace sdl_rpc_plugin { +class SDLAppExtension; namespace plugins = application_manager::plugin_manager; class SDLRPCPlugin : public plugins::RPCPlugin { // RPCPlugin interface public: + SDLRPCPlugin(); + bool Init(application_manager::ApplicationManager& app_manager, application_manager::rpc_service::RPCService& rpc_service, application_manager::HMICapabilities& hmi_capabilities, @@ -58,8 +62,36 @@ class SDLRPCPlugin : public plugins::RPCPlugin { application_manager::plugin_manager::ApplicationEvent event, application_manager::ApplicationSharedPtr application) OVERRIDE; + /** + * @brief ProcessResumptionSubscription send appropriate subscribe requests + * to HMI + * @param app application for subscription + * @param ext application extension + * @param subscriber callback for subscription + */ + void ProcessResumptionSubscription(application_manager::Application& app, + SDLAppExtension& ext, + resumption::Subscriber subscriber); + + /** + * @brief Revert the data to the state before Resumption. + * @param subscriptions Subscriptions to be returned + **/ + void RevertResumption(application_manager::Application& app); + + /** + * @brief SaveResumptionData saves subscription data + * @param resumption_data plase to store resumption data + */ + void SaveResumptionData(application_manager::Application& app, + smart_objects::SmartObject& resumption_data); + private: std::unique_ptr<application_manager::CommandFactory> command_factory_; + application_manager::ApplicationManager* application_manager_; + using ExtensionPendingResumptionHandlerSPtr = + std::shared_ptr<resumption::ExtensionPendingResumptionHandler>; + ExtensionPendingResumptionHandlerSPtr pending_resumption_handler_; }; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_subscribe_way_points_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_subscribe_way_points_request.cc index a4445ebce8..6f21f1ad0d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_subscribe_way_points_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_subscribe_way_points_request.cc @@ -31,6 +31,7 @@ */ #include "sdl_rpc_plugin/commands/hmi/navi_subscribe_way_points_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace sdl_rpc_plugin { using namespace application_manager; @@ -57,6 +58,14 @@ void NaviSubscribeWayPointsRequest::Run() { SendRequest(); } +void NaviSubscribeWayPointsRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_set_global_properties_request.cc index 8c7443d465..52fd01e256 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_set_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_set_global_properties_request.cc @@ -31,6 +31,7 @@ */ #include "sdl_rpc_plugin/commands/hmi/tts_set_global_properties_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace sdl_rpc_plugin { using namespace application_manager; @@ -57,6 +58,13 @@ void TTSSetGlobalPropertiesRequest::Run() { SendRequest(); } +void TTSSetGlobalPropertiesRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_command_request.cc index 749b3ad56b..2ca2de5591 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_command_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_command_request.cc @@ -31,6 +31,7 @@ */ #include "sdl_rpc_plugin/commands/hmi/ui_add_command_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace sdl_rpc_plugin { using namespace application_manager; @@ -57,6 +58,14 @@ void UIAddCommandRequest::Run() { SendRequest(); } +void UIAddCommandRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_submenu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_submenu_request.cc index de338d4670..19071fa348 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_submenu_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_add_submenu_request.cc @@ -31,6 +31,7 @@ */ #include "sdl_rpc_plugin/commands/hmi/ui_add_submenu_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace sdl_rpc_plugin { using namespace application_manager; @@ -57,6 +58,13 @@ void UIAddSubmenuRequest::Run() { SendRequest(); } +void UIAddSubmenuRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_global_properties_request.cc index 0664404361..1e7a2cf0f0 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_global_properties_request.cc @@ -31,6 +31,7 @@ */ #include "sdl_rpc_plugin/commands/hmi/ui_set_global_properties_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace sdl_rpc_plugin { using namespace application_manager; @@ -57,6 +58,13 @@ void UISetGlobalPropertiesRequest::Run() { SendRequest(); } +void UISetGlobalPropertiesRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_add_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_add_command_request.cc index 72ce387f77..6f01688c9f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_add_command_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_add_command_request.cc @@ -31,6 +31,7 @@ */ #include "sdl_rpc_plugin/commands/hmi/vr_add_command_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace sdl_rpc_plugin { using namespace application_manager; @@ -57,6 +58,14 @@ void VRAddCommandRequest::Run() { SendRequest(); } +void VRAddCommandRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc index 155f819761..9c653d75a4 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc @@ -36,6 +36,7 @@ #include "application_manager/application.h" #include "application_manager/message_helper.h" +#include "application_manager/resumption/resume_ctrl.h" #include "utils/file_system.h" #include "utils/helpers.h" #include "utils/custom_string.h" @@ -71,6 +72,12 @@ void AddCommandRequest::onTimeOut() { LOG4CXX_AUTO_TRACE(logger_); RemoveCommand(); CommandRequestImpl::onTimeOut(); + + auto& resume_ctrl = application_manager_.resume_controller(); + + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); } bool AddCommandRequest::Init() { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc index cd1f95b93c..989c968668 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc @@ -39,6 +39,7 @@ #include "application_manager/application_impl.h" #include "application_manager/message_helper.h" +#include "application_manager/resumption/resume_ctrl.h" #include "utils/gen_hash.h" #include "utils/helpers.h" @@ -419,6 +420,12 @@ void CreateInteractionChoiceSetRequest::onTimeOut() { CommandRequestImpl::onTimeOut(); DeleteChoices(); + auto& resume_ctrl = application_manager_.resume_controller(); + + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); + // We have to keep request alive until receive all responses from HMI // according to SDLAQ-CRS-2976 sync_primitives::AutoLock timeout_lock_(is_timed_out_lock_); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc index b66d737648..b9fba3e339 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc @@ -251,7 +251,7 @@ bool RegisterAppInterfaceRequest::ProcessApplicationTransportSwitching() { application_manager_.ProcessReconnection(app, connection_key()); result_code_ = mobile_apis::Result::SUCCESS; - SendRegisterAppInterfaceResponseToMobile(app_type, "", false); + SendRegisterAppInterfaceResponseToMobile(app_type, ""); application_manager_.SendHMIStatusNotification(app); @@ -279,18 +279,6 @@ void RegisterAppInterfaceRequest::FillApplicationParams( LOG4CXX_AUTO_TRACE(logger_); const auto& msg_params = (*message_)[strings::msg_params]; const std::string policy_app_id = msg_params[strings::app_id].asString(); - // For resuming application need to restore hmi_app_id from resumeCtrl - resumption::ResumeCtrl& resumer = application_manager_.resume_controller(); - const std::string& device_mac = application->mac_address(); - - // there is side affect with 2 mobile app with the same mobile app_id - if (resumer.IsApplicationSaved(policy_app_id, device_mac)) { - application->set_hmi_application_id( - resumer.GetHMIApplicationID(policy_app_id, device_mac)); - } else { - application->set_hmi_application_id( - application_manager_.GenerateNewHMIAppID()); - } application->set_is_media_application( msg_params[strings::is_media_application].asBool()); @@ -433,8 +421,8 @@ void RegisterAppInterfaceRequest::onTimeOut() { resume_ctrl.HandleOnTimeOut(application_->app_id()); result_code_ = mobile_api::Result::RESUME_FAILED; const std::string info = "HMI does not respond during timeout."; - SendRegisterAppInterfaceResponseToMobile( - ApplicationType::kNewApplication, info, true); + SendRegisterAppInterfaceResponseToMobile(ApplicationType::kNewApplication, + info); } void RegisterAppInterfaceRequest::Run() { @@ -577,17 +565,23 @@ void RegisterAppInterfaceRequest::Run() { application_manager_.GetPluginManager().ForEachPlugin(on_app_registered); if (DataResumeResult::RESUME_DATA == resume_data_result) { + application_manager_.updateRequestTimeout( + connection_key(), correlation_id(), 0); + sleep(1); is_data_resumption_ = true; + application_->set_is_resuming(true); auto& resume_ctrl = application_manager_.resume_controller(); const auto& msg_params = (*message_)[strings::msg_params]; const auto& hash_id = msg_params[strings::hash_id].asString(); LOG4CXX_WARN(logger_, "Start Data Resumption"); - auto send_response = [this](mobile_apis::Result::eType result_code, - const std::string& info) { + auto app = application_; + auto send_response = [this, app](mobile_apis::Result::eType result_code, + const std::string info) { + LOG4CXX_DEBUG(logger_, "Invoking lambda callback for: " << this); result_code_ = result_code; - SendRegisterAppInterfaceResponseToMobile( - ApplicationType::kNewApplication, info, true); - application_->UpdateHash(); + SendRegisterAppInterfaceResponseToMobile(ApplicationType::kNewApplication, + info); + app->UpdateHash(); }; resume_ctrl.StartResumption(application_, hash_id, send_response); @@ -609,11 +603,9 @@ void RegisterAppInterfaceRequest::Run() { } CheckLanguage(); - const bool need_to_restore_vr = - resume_data_result == DataResumeResult::RESUME_DATA; - SendRegisterAppInterfaceResponseToMobile( - ApplicationType::kNewApplication, add_info, need_to_restore_vr); + SendRegisterAppInterfaceResponseToMobile(ApplicationType::kNewApplication, + add_info); smart_objects::SmartObjectSPtr so = GetLockScreenIconUrlNotification(connection_key(), application_); rpc_service_.ManageMobileCommand(so, SOURCE_SDL); @@ -814,8 +806,7 @@ void FinishSendingRegisterAppInterfaceToMobile( } // Default HMI level should be set before any permissions validation, since - // it - // relies on HMI level. + // it relies on HMI level. app_manager.OnApplicationRegistered(application); (*notify_upd_manager)(); @@ -828,9 +819,7 @@ void FinishSendingRegisterAppInterfaceToMobile( } void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( - ApplicationType app_type, - const std::string& add_info, - bool need_restore_vr) { + ApplicationType app_type, const std::string& add_info) { LOG4CXX_AUTO_TRACE(logger_); smart_objects::SmartObject response_params(smart_objects::SmartType_Map); @@ -983,8 +972,8 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( DEPRECATED void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile() { - SendRegisterAppInterfaceResponseToMobile( - ApplicationType::kNewApplication, "", false); + SendRegisterAppInterfaceResponseToMobile(ApplicationType::kNewApplication, + ""); } void RegisterAppInterfaceRequest::SendChangeRegistration( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_app_extension.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_app_extension.cc new file mode 100644 index 0000000000..5d42743475 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_app_extension.cc @@ -0,0 +1,78 @@ +/* + Copyright (c) 2018, 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 "sdl_rpc_plugin/sdl_app_extension.h" +#include "sdl_rpc_plugin/sdl_rpc_plugin.h" + +CREATE_LOGGERPTR_GLOBAL(logger_, "SDLAppExtension") + +namespace sdl_rpc_plugin { +namespace strings = application_manager::strings; +unsigned SDLAppExtension::SDLAppExtensionUID = 138; + +SDLAppExtension::SDLAppExtension(SDLRPCPlugin& plugin, + application_manager::Application& app) + : app_mngr::AppExtension(SDLAppExtension::SDLAppExtensionUID) + , plugin_(plugin) + , app_(app) { + LOG4CXX_AUTO_TRACE(logger_); +} + +SDLAppExtension::~SDLAppExtension() { + LOG4CXX_AUTO_TRACE(logger_); +} + +void SDLAppExtension::SaveResumptionData( + smart_objects::SmartObject& resumption_data) { + plugin_.SaveResumptionData(app_, resumption_data); +} + +void SDLAppExtension::ProcessResumption( + const smart_objects::SmartObject& saved_app, + resumption::Subscriber subscriber) { + LOG4CXX_AUTO_TRACE(logger_); + if (!saved_app.keyExists(strings::subscribed_for_way_points)) { + LOG4CXX_ERROR(logger_, "subscribed_for_way_points section does not exist"); + return; + } + const bool subscribed_for_way_points_so = + saved_app[strings::subscribed_for_way_points].asBool(); + if (subscribed_for_way_points_so) { + plugin_.ProcessResumptionSubscription(app_, *this, subscriber); + } +} + +void SDLAppExtension::RevertResumption( + const smart_objects::SmartObject& subscriptions) { + plugin_.RevertResumption(app_); +} +} diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_pending_resumption_handler.cc new file mode 100644 index 0000000000..f61e5798e3 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_pending_resumption_handler.cc @@ -0,0 +1,171 @@ +#include "sdl_rpc_plugin/sdl_pending_resumption_handler.h" +#include "application_manager/event_engine/event_observer.h" +#include "application_manager/resumption/resumption_data_processor.h" +#include "application_manager/message_helper.h" +#include "utils/helpers.h" + +namespace sdl_rpc_plugin { + +CREATE_LOGGERPTR_GLOBAL(logger_, "VehicleInfoPendingResumptionHandler") + +SDLPendingResumptionHandler::SDLPendingResumptionHandler( + application_manager::ApplicationManager& application_manager) + : ExtensionPendingResumptionHandler(application_manager) {} + +smart_objects::SmartObjectSPtr +SDLPendingResumptionHandler::CreateSubscriptionRequest() { + LOG4CXX_AUTO_TRACE(logger_); + auto subscribe_waypoints_msg = + application_manager::MessageHelper::CreateMessageForHMI( + hmi_apis::FunctionID::Navigation_SubscribeWayPoints, + application_manager_.GetNextHMICorrelationID()); + (*subscribe_waypoints_msg)[application_manager::strings::params] + [application_manager::strings::message_type] = + hmi_apis::messageType::request; + return subscribe_waypoints_msg; +} + +void SDLPendingResumptionHandler::ClearPendingResumptionRequests() { + LOG4CXX_AUTO_TRACE(logger_); + using namespace application_manager; + const hmi_apis::FunctionID::eType timed_out_pending_request_fid = + static_cast<hmi_apis::FunctionID::eType>( + pending_requests_.begin() + ->second[strings::params][strings::function_id] + .asInt()); + unsubscribe_from_event(timed_out_pending_request_fid); + pending_requests_.clear(); + + if (!freezed_resumptions_.empty()) { + ResumptionAwaitingHandling freezed_resumption = + freezed_resumptions_.front(); + freezed_resumptions_.pop(); + + auto request = CreateSubscriptionRequest(); + const uint32_t cid = + (*request)[strings::params][strings::correlation_id].asUInt(); + const hmi_apis::FunctionID::eType fid = + static_cast<hmi_apis::FunctionID::eType>( + (*request)[strings::params][strings::function_id].asInt()); + auto resumption_req = MakeResumptionRequest(cid, fid, *request); + auto subscriber = freezed_resumption.subscriber; + subscriber(freezed_resumption.app_id, resumption_req); + LOG4CXX_DEBUG(logger_, + "Subscribing for event with function id: " + << fid << " correlation id: " << cid); + subscribe_on_event(fid, cid); + pending_requests_[cid] = *request; + LOG4CXX_DEBUG(logger_, + "Sending request with fid: " << fid << " and cid: " << cid); + application_manager_.GetRPCService().ManageHMICommand(request); + } +} + +void SDLPendingResumptionHandler::on_event( + const application_manager::event_engine::Event& event) { + using namespace application_manager; + LOG4CXX_AUTO_TRACE(logger_); + + const smart_objects::SmartObject& response = event.smart_object(); + const uint32_t corr_id = event.smart_object_correlation_id(); + + smart_objects::SmartObject pending_request; + if (pending_requests_.find(corr_id) == pending_requests_.end()) { + LOG4CXX_DEBUG(logger_, "corr id" << corr_id << " NOT found"); + return; + } + pending_request = pending_requests_[corr_id]; + pending_requests_.erase(corr_id); + + LOG4CXX_DEBUG(logger_, + "Received event with function id: " + << event.id() << " and correlation id: " << corr_id); + + const hmi_apis::Common_Result::eType result_code = + static_cast<hmi_apis::Common_Result::eType>( + response[strings::params][application_manager::hmi_response::code] + .asInt()); + const bool succesfull_response = + (result_code == hmi_apis::Common_Result::SUCCESS || + result_code == hmi_apis::Common_Result::WARNINGS); + if (succesfull_response) { + LOG4CXX_DEBUG(logger_, "Resumption of subscriptions is successful"); + } else { + LOG4CXX_DEBUG(logger_, "Resumption of subscriptions is NOT successful"); + uint32_t app_id = 0; + if (app_ids_.empty()) { + LOG4CXX_ERROR(logger_, "app_ids is empty"); + return; + } + app_id = app_ids_.front(); + auto app = application_manager_.application(app_id); + if (!app) { + LOG4CXX_ERROR(logger_, "Application NOT found"); + return; + } + application_manager_.UnsubscribeAppFromWayPoints(app); + if (freezed_resumptions_.empty()) { + LOG4CXX_DEBUG(logger_, "freezed resumptions is empty"); + return; + } + + ResumptionAwaitingHandling freezed_resumption = + freezed_resumptions_.front(); + freezed_resumptions_.pop(); + resumption::Subscriber subscriber = freezed_resumption.subscriber; + + auto request = CreateSubscriptionRequest(); + const uint32_t cid = + (*request)[strings::params][strings::correlation_id].asUInt(); + const hmi_apis::FunctionID::eType fid = + static_cast<hmi_apis::FunctionID::eType>( + (*request)[strings::params][strings::function_id].asInt()); + auto resumption_req = MakeResumptionRequest(cid, fid, *request); + subscribe_on_event(fid, cid); + subscriber(freezed_resumption.app_id, resumption_req); + LOG4CXX_DEBUG(logger_, + "Subscribing for event with function id: " + << fid << " correlation id: " << cid); + pending_requests_[cid] = *request; + LOG4CXX_DEBUG(logger_, + "Sending request with fid: " << fid << " and cid: " << cid); + application_manager_.GetRPCService().ManageHMICommand(request); + } +} + +void SDLPendingResumptionHandler::HandleResumptionSubscriptionRequest( + application_manager::AppExtension& extension, + resumption::Subscriber& subscriber, + application_manager::Application& app) { + LOG4CXX_AUTO_TRACE(logger_); + SDLAppExtension& ext = dynamic_cast<SDLAppExtension&>(extension); + smart_objects::SmartObjectSPtr request = CreateSubscriptionRequest(); + smart_objects::SmartObject& request_ref = *request; + const auto function_id = static_cast<hmi_apis::FunctionID::eType>( + request_ref[application_manager::strings::params] + [application_manager::strings::function_id].asInt()); + const uint32_t corr_id = + request_ref[application_manager::strings::params] + [application_manager::strings::correlation_id].asUInt(); + + auto resumption_request = + MakeResumptionRequest(corr_id, function_id, *request); + app_ids_.push(app.app_id()); + if (pending_requests_.empty()) { + LOG4CXX_DEBUG(logger_, + "There are no pending requests for app_id: " << app.app_id()); + pending_requests_[corr_id] = request_ref; + subscribe_on_event(function_id, corr_id); + subscriber(app.app_id(), resumption_request); + LOG4CXX_DEBUG(logger_, + "Sending request with function id: " + << function_id << " and correlation_id: " << corr_id); + application_manager_.GetRPCService().ManageHMICommand(request); + return; + } + LOG4CXX_DEBUG(logger_, + "There are pending requests for app_id: " << app.app_id()); + ResumptionAwaitingHandling frozen_res(app.app_id(), ext, subscriber); + freezed_resumptions_.push(frozen_res); +} +} 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 22b818f5e0..4f26f534ec 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 @@ -32,15 +32,25 @@ #include "sdl_rpc_plugin/sdl_rpc_plugin.h" #include "sdl_rpc_plugin/sdl_command_factory.h" +#include "sdl_rpc_plugin/sdl_app_extension.h" +#include "sdl_rpc_plugin/sdl_pending_resumption_handler.h" +#include "application_manager/message_helper.h" namespace sdl_rpc_plugin { +CREATE_LOGGERPTR_GLOBAL(logger_, "SDLRPCPlugin") namespace plugins = application_manager::plugin_manager; +SDLRPCPlugin::SDLRPCPlugin() + : application_manager_(nullptr), pending_resumption_handler_(nullptr) {} + bool SDLRPCPlugin::Init( application_manager::ApplicationManager& app_manager, application_manager::rpc_service::RPCService& rpc_service, application_manager::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler) { + application_manager_ = &app_manager; + pending_resumption_handler_ = + std::make_shared<SDLPendingResumptionHandler>(app_manager); command_factory_.reset(new sdl_rpc_plugin::SDLCommandFactory( app_manager, rpc_service, hmi_capabilities, policy_handler)); return true; @@ -66,7 +76,59 @@ void SDLRPCPlugin::OnPolicyEvent( void SDLRPCPlugin::OnApplicationEvent( application_manager::plugin_manager::ApplicationEvent event, - application_manager::ApplicationSharedPtr application) {} + application_manager::ApplicationSharedPtr application) { + LOG4CXX_AUTO_TRACE(logger_); + if (plugins::ApplicationEvent::kApplicationRegistered == event) { + application->AddExtension( + std::make_shared<SDLAppExtension>(*this, *application)); + } +} + +void SDLRPCPlugin::ProcessResumptionSubscription( + application_manager::Application& app, + SDLAppExtension& ext, + resumption::Subscriber subscriber) { + LOG4CXX_AUTO_TRACE(logger_); + application_manager::ApplicationSharedPtr application = + application_manager_->application(app.app_id()); + std::set<int32_t> apps = + application_manager_->GetAppsSubscribedForWayPoints(); + application_manager_->SubscribeAppForWayPoints(application); + pending_resumption_handler_->HandleResumptionSubscriptionRequest( + ext, subscriber, app); +} + +void SDLRPCPlugin::SaveResumptionData( + application_manager::Application& app, + smart_objects::SmartObject& resumption_data) { + resumption_data[application_manager::strings::subscribed_for_way_points] = + true; +} + +void SDLRPCPlugin::RevertResumption(application_manager::Application& app) { + application_manager::ApplicationSharedPtr application = + application_manager_->application(app.app_id()); + pending_resumption_handler_->ClearPendingResumptionRequests(); + std::set<int32_t> apps = + application_manager_->GetAppsSubscribedForWayPoints(); + if (1 == apps.size() && + application_manager_->IsAppSubscribedForWayPoints(application)) { + auto subscribe_waypoints_msg = + application_manager::MessageHelper::CreateMessageForHMI( + hmi_apis::FunctionID::Navigation_UnsubscribeWayPoints, + application_manager_->GetNextHMICorrelationID()); + (*subscribe_waypoints_msg)[application_manager::strings::params] + [application_manager::strings::message_type] = + hmi_apis::messageType::request; + (*subscribe_waypoints_msg)[application_manager::strings::msg_params] + [application_manager::strings::app_id] = + app.app_id(); + + application_manager_->GetRPCService().ManageHMICommand( + subscribe_waypoints_msg); + } + application_manager_->UnsubscribeAppFromWayPoints(application); +} } // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/commands/hmi/vi_subscribe_vehicle_data_request.h b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/commands/hmi/vi_subscribe_vehicle_data_request.h index bd22a313e7..abd9806bd3 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/commands/hmi/vi_subscribe_vehicle_data_request.h +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/commands/hmi/vi_subscribe_vehicle_data_request.h @@ -67,6 +67,8 @@ class VISubscribeVehicleDataRequest : public app_mngr::commands::RequestToHMI { **/ virtual void Run(); + void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(VISubscribeVehicleDataRequest); }; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_pending_resumption_handler.h b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_pending_resumption_handler.h new file mode 100644 index 0000000000..c5847c2148 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_pending_resumption_handler.h @@ -0,0 +1,63 @@ +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_VEHICLE_INFO_PLUGIN_INCLUDE_VEHICLE_INFO_PLUGIN_PENDING_RESUMPTION_HANDLER_H +#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_VEHICLE_INFO_PLUGIN_INCLUDE_VEHICLE_INFO_PLUGIN_PENDING_RESUMPTION_HANDLER_H +#include "application_manager/event_engine/event_observer.h" +#include "application_manager/resumption/extension_pending_resumption_handler.h" +#include "vehicle_info_app_extension.h" + +namespace vehicle_info_plugin { + +namespace app_mngr = application_manager; + +class VehicleInfoPendingResumptionHandler + : public resumption::ExtensionPendingResumptionHandler { + public: + VehicleInfoPendingResumptionHandler( + app_mngr::ApplicationManager& application_manager); + + // EventObserver interface + void on_event(const app_mngr::event_engine::Event& event) OVERRIDE; + + void HandleResumptionSubscriptionRequest(app_mngr::AppExtension& extension, + resumption::Subscriber& subscriber, + app_mngr::Application& app) OVERRIDE; + + std::map<std::string, bool> ExtractSubscribeResults( + const smart_objects::SmartObject& response, + const smart_objects::SmartObject& request) const; + + bool IsResumptionResultSuccessful( + std::map<std::string, bool>& subscription_results); + + void RemoveSucessfulSubscriptions( + std::set<std::string>& subscriptions, + std::set<std::string>& successful_subscriptions); + + std::set<std::string> GetExtensionSubscriptions( + VehicleInfoAppExtension& extension); + + smart_objects::SmartObjectSPtr CreateSubscribeRequestToHMI( + const std::set<std::string>& subscriptions); + + void ClearPendingResumptionRequests() OVERRIDE; + + private: + struct ResumptionAwaitingHandling { + const uint32_t app_id; + VehicleInfoAppExtension& ext; + resumption::Subscriber subscriber; + + ResumptionAwaitingHandling(const uint32_t application_id, + VehicleInfoAppExtension& extension, + resumption::Subscriber subscriber_callback) + : app_id(application_id) + , ext(extension) + , subscriber(subscriber_callback) {} + }; + + typedef std::pair<VehicleInfoAppExtension, resumption::Subscriber> + FreezedResumption; + std::queue<ResumptionAwaitingHandling> freezed_resumptions_; + std::map<uint32_t, smart_objects::SmartObject> pending_requests_; +}; +} // namespace vehicle_info_plugin +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_VEHICLE_INFO_PLUGIN_INCLUDE_VEHICLE_INFO_PLUGIN_PENDING_RESUMPTION_HANDLER_H 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 507431a0c8..4c0314c736 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 @@ -34,6 +34,7 @@ #define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_VEHICLE_INFO_PLUGIN_INCLUDE_VEHICLE_INFO_PLUGIN_VEHICLE_INFO_PLUGIN_H #include "application_manager/command_factory.h" +#include "application_manager/resumption/extension_pending_resumption_handler.h" namespace vehicle_info_plugin { class VehicleInfoAppExtension; @@ -92,6 +93,9 @@ class VehicleInfoPlugin : public plugins::RPCPlugin { std::unique_ptr<app_mngr::CommandFactory> command_factory_; app_mngr::ApplicationManager* application_manager_; + using ExtensionPendingResumptionHandlerSPtr = + std::shared_ptr<resumption::ExtensionPendingResumptionHandler>; + ExtensionPendingResumptionHandlerSPtr pending_resumption_handler_; }; } diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_subscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_subscribe_vehicle_data_request.cc index 60e9dc88c3..5b609dad8a 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_subscribe_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_subscribe_vehicle_data_request.cc @@ -31,6 +31,7 @@ */ #include "vehicle_info_plugin/commands/hmi/vi_subscribe_vehicle_data_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace vehicle_info_plugin { using namespace application_manager; @@ -57,6 +58,14 @@ void VISubscribeVehicleDataRequest::Run() { SendRequest(); } +void VISubscribeVehicleDataRequest::onTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id())); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc new file mode 100644 index 0000000000..ee37c0ba0a --- /dev/null +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc @@ -0,0 +1,275 @@ +#include "vehicle_info_plugin/vehicle_info_pending_resumption_handler.h" +#include "application_manager/event_engine/event_observer.h" +#include "application_manager/resumption/resumption_data_processor.h" +#include "application_manager/message_helper.h" +#include "utils/helpers.h" + +namespace vehicle_info_plugin { + +CREATE_LOGGERPTR_GLOBAL(logger_, "VehicleInfoPendingResumptionHandler") + +VehicleInfoPendingResumptionHandler::VehicleInfoPendingResumptionHandler( + application_manager::ApplicationManager& application_manager) + : ExtensionPendingResumptionHandler(application_manager) {} + +template <class Key, class Value> +std::set<Key> EnumerateKeys(std::map<Key, Value>& container) { + std::set<std::string> keys; + + std::transform( + container.begin(), + container.end(), + std::inserter(keys, keys.end()), + [&](const std::pair<std::string, bool>& pair) { return pair.first; }); + + return keys; +} + +bool VehicleInfoPendingResumptionHandler::IsResumptionResultSuccessful( + std::map<std::string, bool>& subscription_results) { + for (auto ivi_status : subscription_results) { + if (!ivi_status.second) { + return false; + break; + } + } + + return true; +} + +void VehicleInfoPendingResumptionHandler::RemoveSucessfulSubscriptions( + std::set<std::string>& subscriptions, + std::set<std::string>& successful_subscriptions) { + for (auto subscription : subscriptions) { + if (helpers::in_range(successful_subscriptions, subscription)) { + subscriptions.erase(subscription); + } + } +} + +void VehicleInfoPendingResumptionHandler::ClearPendingResumptionRequests() { + LOG4CXX_AUTO_TRACE(logger_); + using namespace application_manager; + const hmi_apis::FunctionID::eType timed_out_pending_request_fid = + static_cast<hmi_apis::FunctionID::eType>( + pending_requests_.begin() + ->second[strings::params][strings::function_id] + .asInt()); + unsubscribe_from_event(timed_out_pending_request_fid); + pending_requests_.clear(); + + if (!freezed_resumptions_.empty()) { + ResumptionAwaitingHandling freezed_resumption = + freezed_resumptions_.front(); + freezed_resumptions_.pop(); + + std::set<std::string> subscriptions = + GetExtensionSubscriptions(freezed_resumption.ext); + + auto request = CreateSubscribeRequestToHMI(subscriptions); + const uint32_t cid = + (*request)[strings::params][strings::correlation_id].asUInt(); + const hmi_apis::FunctionID::eType fid = + static_cast<hmi_apis::FunctionID::eType>( + (*request)[strings::params][strings::function_id].asInt()); + auto resumption_req = MakeResumptionRequest(cid, fid, *request); + auto subscriber = freezed_resumption.subscriber; + subscriber(freezed_resumption.app_id, resumption_req); + LOG4CXX_DEBUG(logger_, + "Subscribing for event with function id: " + << fid << " correlation id: " << cid); + subscribe_on_event(fid, cid); + pending_requests_[cid] = *request; + LOG4CXX_DEBUG(logger_, + "Sending request with fid: " << fid << " and cid: " << cid); + application_manager_.GetRPCService().ManageHMICommand(request); + } +} + +void VehicleInfoPendingResumptionHandler::on_event( + const application_manager::event_engine::Event& event) { + using namespace application_manager; + LOG4CXX_AUTO_TRACE(logger_); + + const smart_objects::SmartObject& response = event.smart_object(); + const uint32_t corr_id = event.smart_object_correlation_id(); + + smart_objects::SmartObject pending_request; + if (pending_requests_.find(corr_id) == pending_requests_.end()) { + LOG4CXX_DEBUG(logger_, "corr id" << corr_id << " NOT found"); + return; + } + pending_request = pending_requests_[corr_id]; + pending_requests_.erase(corr_id); + + LOG4CXX_DEBUG(logger_, + "Received event with function id: " + << event.id() << " and correlation id: " << corr_id); + + if (freezed_resumptions_.empty()) { + LOG4CXX_DEBUG(logger_, "freezed resumptions is empty"); + return; + } + + std::map<std::string, bool> subscription_results = + ExtractSubscribeResults(pending_request, response); + + LOG4CXX_DEBUG(logger_, + "pending_requests_.size()" << pending_requests_.size()); + + std::set<std::string> successful_subscriptions = + EnumerateKeys(subscription_results); + + ResumptionAwaitingHandling freezed_resumption = freezed_resumptions_.front(); + freezed_resumptions_.pop(); + resumption::Subscriber subscriber = freezed_resumption.subscriber; + + std::set<std::string> subscriptions = + GetExtensionSubscriptions(freezed_resumption.ext); + + if (!IsResumptionResultSuccessful(subscription_results)) { + LOG4CXX_DEBUG(logger_, "Resumption of subscriptions is NOT successful"); + } else { + LOG4CXX_DEBUG(logger_, "Resumption of subscriptions is successful"); + RemoveSucessfulSubscriptions(subscriptions, successful_subscriptions); + } + + auto request = CreateSubscribeRequestToHMI(subscriptions); + const uint32_t cid = + (*request)[strings::params][strings::correlation_id].asUInt(); + const hmi_apis::FunctionID::eType fid = + static_cast<hmi_apis::FunctionID::eType>( + (*request)[strings::params][strings::function_id].asInt()); + auto resumption_req = MakeResumptionRequest(cid, fid, *request); + subscribe_on_event(fid, cid); + subscriber(freezed_resumption.app_id, resumption_req); + LOG4CXX_DEBUG(logger_, + "Subscribing for event with function id: " + << fid << " correlation id: " << cid); + pending_requests_[cid] = *request; + LOG4CXX_DEBUG(logger_, + "Sending request with fid: " << fid << " and cid: " << cid); + application_manager_.GetRPCService().ManageHMICommand(request); +} + +std::map<std::string, bool> +VehicleInfoPendingResumptionHandler::ExtractSubscribeResults( + const smart_objects::SmartObject& response, + const smart_objects::SmartObject& request) const { + using namespace application_manager; + const hmi_apis::Common_Result::eType result_code = + static_cast<hmi_apis::Common_Result::eType>( + response[strings::params][application_manager::hmi_response::code] + .asInt()); + bool succesfull_response = (result_code == hmi_apis::Common_Result::SUCCESS || + result_code == hmi_apis::Common_Result::WARNINGS); + const auto response_keys = + response[application_manager::strings::msg_params].enumerate(); + const auto request_keys = + request[application_manager::strings::msg_params].enumerate(); + + auto response_params = response[strings::msg_params]; + + std::map<std::string, bool> subscription_results; + + if (!succesfull_response) { + for (auto key : request_keys) { + subscription_results[key] = false; + } + } + + if (succesfull_response) { + for (auto key : request_keys) { + if (!helpers::in_range(response_keys, key)) { + subscription_results[key] = true; + } else { + const auto kSuccess = + hmi_apis::Common_VehicleDataResultCode::VDRC_SUCCESS; + const auto vd_result_code = + response_params[key][application_manager::strings::result_code] + .asInt(); + subscription_results[key] = vd_result_code == kSuccess; + } + } + } + return subscription_results; +} + +void VehicleInfoPendingResumptionHandler::HandleResumptionSubscriptionRequest( + application_manager::AppExtension& extension, + resumption::Subscriber& subscriber, + application_manager::Application& app) { + LOG4CXX_AUTO_TRACE(logger_); + + VehicleInfoAppExtension& ext = + dynamic_cast<VehicleInfoAppExtension&>(extension); + + std::set<std::string> subscriptions = GetExtensionSubscriptions(ext); + + smart_objects::SmartObjectSPtr request = + CreateSubscribeRequestToHMI(subscriptions); + + smart_objects::SmartObject& request_ref = *request; + const auto function_id = static_cast<hmi_apis::FunctionID::eType>( + request_ref[application_manager::strings::params] + [application_manager::strings::function_id].asInt()); + const uint32_t corr_id = + request_ref[application_manager::strings::params] + [application_manager::strings::correlation_id].asUInt(); + + auto resumption_request = + MakeResumptionRequest(corr_id, function_id, *request); + + if (pending_requests_.empty()) { + LOG4CXX_DEBUG(logger_, + "There are no pending requests for app_id: " << app.app_id()); + pending_requests_[corr_id] = request_ref; + subscribe_on_event(function_id, corr_id); + subscriber(app.app_id(), resumption_request); + LOG4CXX_DEBUG(logger_, + "Sending request with function id: " + << function_id << " and correlation_id: " << corr_id); + application_manager_.GetRPCService().ManageHMICommand(request); + return; + } else { + LOG4CXX_DEBUG(logger_, + "There are pending requests for app_id: " << app.app_id()); + ResumptionAwaitingHandling frozen_res(app.app_id(), ext, subscriber); + freezed_resumptions_.push(frozen_res); + } +} + +std::set<std::string> +VehicleInfoPendingResumptionHandler::GetExtensionSubscriptions( + VehicleInfoAppExtension& extension) { + std::set<std::string> subscriptions; + for (auto& ivi : application_manager::MessageHelper::vehicle_data()) { + const auto it = extension.Subscriptions().find(ivi.second); + if (extension.Subscriptions().end() != it) { + subscriptions.insert(ivi.first); + } + } + return subscriptions; +} + +smart_objects::SmartObjectSPtr +VehicleInfoPendingResumptionHandler::CreateSubscribeRequestToHMI( + const std::set<std::string>& subscriptions) { + LOG4CXX_AUTO_TRACE(logger_); + using namespace application_manager; + smart_objects::SmartObject msg_params = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + for (const auto& ivi_data : subscriptions) { + msg_params[ivi_data] = true; + } + + smart_objects::SmartObjectSPtr request = + application_manager::MessageHelper::CreateModuleInfoSO( + hmi_apis::FunctionID::VehicleInfo_SubscribeVehicleData, + application_manager_); + (*request)[strings::msg_params] = msg_params; + + return request; +} +} 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 fe8d210e8f..d0d24440c4 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 @@ -37,13 +37,15 @@ #include "application_manager/message_helper.h" #include "application_manager/message_helper.h" #include "application_manager/resumption/resumption_data_processor.h" +#include "vehicle_info_plugin/vehicle_info_pending_resumption_handler.h" namespace vehicle_info_plugin { CREATE_LOGGERPTR_GLOBAL(logger_, "VehicleInfoPlugin") namespace strings = application_manager::strings; -VehicleInfoPlugin::VehicleInfoPlugin() : application_manager_(nullptr) {} +VehicleInfoPlugin::VehicleInfoPlugin() + : application_manager_(nullptr), pending_resumption_handler_(nullptr) {} bool VehicleInfoPlugin::Init( application_manager::ApplicationManager& app_manager, @@ -51,6 +53,8 @@ bool VehicleInfoPlugin::Init( application_manager::HMICapabilities& hmi_capabilities, policy::PolicyHandlerInterface& policy_handler) { application_manager_ = &app_manager; + pending_resumption_handler_ = + std::make_shared<VehicleInfoPendingResumptionHandler>(app_manager); command_factory_.reset(new vehicle_info_plugin::VehicleInfoCommandFactory( app_manager, rpc_service, hmi_capabilities, policy_handler)); return true; @@ -87,27 +91,8 @@ void VehicleInfoPlugin::ProcessResumptionSubscription( resumption::Subscriber subscriber) { LOG4CXX_AUTO_TRACE(logger_); - std::set<std::string> subscriptions; - for (auto& ivi : application_manager::MessageHelper::vehicle_data()) { - const auto it = ext.Subscriptions().find(ivi.second); - if (ext.Subscriptions().end() != it) { - subscriptions.insert(ivi.first); - } - } - - smart_objects::SmartObjectSPtr request = - CreateSubscriptionRequest(subscriptions); - - resumption::ResumptionRequest resumption_request; - resumption_request.request_ids.correlation_id = - (*request)[strings::params][strings::correlation_id].asInt(); - resumption_request.request_ids.function_id = - hmi_apis::FunctionID::VehicleInfo_SubscribeVehicleData; - resumption_request.message = *request; - - subscriber(app.app_id(), resumption_request); - - application_manager_->GetRPCService().ManageHMICommand(request); + pending_resumption_handler_->HandleResumptionSubscriptionRequest( + ext, subscriber, app); } void VehicleInfoPlugin::RevertResumption( @@ -115,6 +100,8 @@ void VehicleInfoPlugin::RevertResumption( const std::set<std::string>& list_of_subscriptions) { LOG4CXX_AUTO_TRACE(logger_); + pending_resumption_handler_->ClearPendingResumptionRequests(); + std::set<std::string> subscriptions_to_revert; for (auto& ivi_data : list_of_subscriptions) { if (!IsSubscribedAppExist(ivi_data)) { @@ -170,6 +157,7 @@ smart_objects::SmartObjectSPtr VehicleInfoPlugin::CreateUnsubscriptionRequest( } bool VehicleInfoPlugin::IsSubscribedAppExist(const std::string& ivi) { + LOG4CXX_AUTO_TRACE(logger_); auto applications = application_manager_->applications(); const auto it = application_manager::MessageHelper::vehicle_data().find(ivi); DCHECK_OR_RETURN( diff --git a/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc index f1e5bf9735..7c9f41bc10 100644 --- a/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc +++ b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc @@ -62,12 +62,11 @@ void EventDispatcherImpl::raise_event(const Event& event) { } // Call observers - while (!observers_.empty()) { - EventObserver* temp = *observers_.begin(); - observers_.erase(observers_.begin()); + for (auto observer : observers_) { AutoUnlock unlock_observer(observer_lock); - temp->on_event(event); + observer->on_event(event); } + observers_.clear(); } void EventDispatcherImpl::add_observer(const Event::EventID& event_id, diff --git a/src/components/application_manager/src/resumption/extension_pending_resumption_handler.cc b/src/components/application_manager/src/resumption/extension_pending_resumption_handler.cc new file mode 100644 index 0000000000..50b4632d5f --- /dev/null +++ b/src/components/application_manager/src/resumption/extension_pending_resumption_handler.cc @@ -0,0 +1,29 @@ +#include "application_manager/resumption/extension_pending_resumption_handler.h" +#include "application_manager/resumption/resumption_data_processor.h" +#include "smart_objects/smart_object.h" + +namespace resumption { + +namespace app_mngr = application_manager; + +CREATE_LOGGERPTR_GLOBAL(logger_, "ExtensionPenndingResumptionHandler") + +ExtensionPendingResumptionHandler::ExtensionPendingResumptionHandler( + app_mngr::ApplicationManager& application_manager) + : application_manager::event_engine::EventObserver( + application_manager.event_dispatcher()) + , application_manager_(application_manager) {} + +ResumptionRequest ExtensionPendingResumptionHandler::MakeResumptionRequest( + const uint32_t corr_id, + const hmi_apis::FunctionID::eType function_id, + const smart_objects::SmartObject& message) { + LOG4CXX_AUTO_TRACE(logger_); + resumption::ResumptionRequest resumption_request; + resumption_request.request_ids.correlation_id = corr_id; + resumption_request.request_ids.function_id = function_id; + resumption_request.message = message; + return resumption_request; +} + +} // namespace resumption
\ No newline at end of file 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 0bd9f60323..b82a31aa34 100644 --- a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc +++ b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc @@ -408,9 +408,10 @@ bool ResumeCtrlImpl::StartResumption(ApplicationSharedPtr application, return result; } -void ResumeCtrlImpl::HandleOnTimeOut(const int32_t app_id) { +void ResumeCtrlImpl::HandleOnTimeOut( + const uint32_t cor_id, const hmi_apis::FunctionID::eType function_id) { LOG4CXX_AUTO_TRACE(logger_); - resumption_data_processor_.HandleOnTimeOut(app_id); + resumption_data_processor_.HandleOnTimeOut(cor_id, function_id); } bool ResumeCtrlImpl::StartResumptionOnlyHMILevel( diff --git a/src/components/application_manager/src/resumption/resumption_data_processor.cc b/src/components/application_manager/src/resumption/resumption_data_processor.cc index 5fc2007f79..7a98e93173 100644 --- a/src/components/application_manager/src/resumption/resumption_data_processor.cc +++ b/src/components/application_manager/src/resumption/resumption_data_processor.cc @@ -67,7 +67,6 @@ void ResumptionDataProcessor::Restore(ApplicationSharedPtr application, AddChoicesets(application, saved_app); SetGlobalProperties(application, saved_app); AddSubscriptions(application, saved_app); - AddWayPointsSubscription(application, saved_app); register_callbacks_[application->app_id()] = callback; } @@ -76,9 +75,34 @@ bool ResumptionRequestIDs::operator<(const ResumptionRequestIDs& other) const { function_id < other.function_id; } -void ResumptionDataProcessor::HandleOnTimeOut(const int32_t app_id) { +void ResumptionDataProcessor::HandleOnTimeOut( + const uint32_t corr_id, const hmi_apis::FunctionID::eType function_id) { LOG4CXX_AUTO_TRACE(logger_); - RevertRestoredData(application_manager_.application(app_id)); + LOG4CXX_DEBUG(logger_, + "Handling timeout with corr id: " + << corr_id << " and function_id: " << function_id); + uint32_t app_id = 0; + ApplicationSharedPtr app; + + auto it = std::find_if( + request_app_ids_.begin(), + request_app_ids_.end(), + [corr_id, function_id]( + const std::pair<ResumptionRequestIDs, std::uint32_t>& item) { + return item.first.function_id == function_id && + item.first.correlation_id == static_cast<int32_t>(corr_id); + }); + if (it != request_app_ids_.end()) { + app_id = it->second; + app = application_manager_.application(app_id); + } + if (app && app->is_resuming()) { + LOG4CXX_DEBUG(logger_, "Unsubscribing from event: " << function_id); + auto callback = register_callbacks_[app_id]; + callback(mobile_apis::Result::RESUME_FAILED, "Data resumption failed"); + unsubscribe_from_event(function_id); + RevertRestoredData(application_manager_.application(app_id)); + } } void ResumptionDataProcessor::on_event(const event_engine::Event& event) { @@ -111,6 +135,8 @@ void ResumptionDataProcessor::on_event(const event_engine::Event& event) { const uint32_t app_id = app_id_ptr->second; + LOG4CXX_DEBUG(logger_, "app_id is: " << app_id); + LOG4CXX_DEBUG(logger_, "Found function id: " << app_id_ptr->first.function_id << " correlation id: " @@ -161,34 +187,42 @@ void ResumptionDataProcessor::on_event(const event_engine::Event& event) { } auto it = register_callbacks_.find(app_id); - DCHECK_OR_RETURN_VOID(it != register_callbacks_.end()); + if (it == register_callbacks_.end()) { + LOG4CXX_WARN(logger_, "Callback for app_id: " << app_id << " not found"); + + return; + } auto callback = it->second; const bool successful_resumption = status.error_requests.empty() && status.unsuccesfull_vehicle_data_subscriptions_.empty(); + if (successful_resumption) { LOG4CXX_DEBUG(logger_, "Resumption for app " << app_id << " successful"); callback(mobile_apis::Result::SUCCESS, "Data resumption succesful"); } if (!successful_resumption) { - LOG4CXX_ERROR(logger_, "Resumption for app " << app_id << "failed"); - RevertRestoredData(application_manager_.application(app_id)); + LOG4CXX_ERROR(logger_, "Resumption for app " << app_id << " failed"); callback(mobile_apis::Result::RESUME_FAILED, "Data resumption failed"); + RevertRestoredData(application_manager_.application(app_id)); } resumption_status_.erase(app_id); request_app_ids_.erase(app_id_ptr); + register_callbacks_.erase(app_id); } void ResumptionDataProcessor::RevertRestoredData( ApplicationSharedPtr application) { LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Reverting for app: " << application->app_id()); DeleteFiles(application); DeleteSubmenues(application); DeleteCommands(application); DeleteChoicesets(application); DeleteGlobalProperties(application); DeleteSubscriptions(application); - DeleteWayPointsSubscription(application); + resumption_status_.erase(application->app_id()); + register_callbacks_.erase(application->app_id()); } void ResumptionDataProcessor::WaitForResponse( @@ -537,49 +571,6 @@ void ResumptionDataProcessor::DeleteGlobalProperties( } } -void ResumptionDataProcessor::AddWayPointsSubscription( - app_mngr::ApplicationSharedPtr application, - const smart_objects::SmartObject& saved_app) { - LOG4CXX_AUTO_TRACE(logger_); - - if (!saved_app.keyExists(strings::subscribed_for_way_points)) { - LOG4CXX_ERROR(logger_, "subscribed_for_way_points section is not exists"); - return; - } - - const bool subscribed_for_way_points_so = - saved_app[strings::subscribed_for_way_points].asBool(); - if (subscribed_for_way_points_so) { - application_manager_.SubscribeAppForWayPoints(application); - auto subscribe_waypoints_msg = MessageHelper::CreateMessageForHMI( - hmi_apis::FunctionID::Navigation_SubscribeWayPoints, - application_manager_.GetNextHMICorrelationID()); - (*subscribe_waypoints_msg)[strings::params][strings::message_type] = - hmi_apis::messageType::request; - (*subscribe_waypoints_msg)[strings::msg_params][strings::app_id] = - application->app_id(); - ProcessHMIRequest(subscribe_waypoints_msg, true); - } -} - -void ResumptionDataProcessor::DeleteWayPointsSubscription( - ApplicationSharedPtr application) { - LOG4CXX_AUTO_TRACE(logger_); - - if (application_manager_.IsAppSubscribedForWayPoints(application)) { - LOG4CXX_DEBUG(logger_, "App is subscribed"); - application_manager_.UnsubscribeAppFromWayPoints(application); - auto subscribe_waypoints_msg = MessageHelper::CreateMessageForHMI( - hmi_apis::FunctionID::Navigation_UnsubscribeWayPoints, - application_manager_.GetNextHMICorrelationID()); - (*subscribe_waypoints_msg)[strings::params][strings::message_type] = - hmi_apis::messageType::request; - (*subscribe_waypoints_msg)[strings::msg_params][strings::app_id] = - application->app_id(); - ProcessHMIRequest(subscribe_waypoints_msg, false); - } -} - void ResumptionDataProcessor::AddSubscriptions( ApplicationSharedPtr application, const smart_objects::SmartObject& saved_app) { @@ -663,6 +654,9 @@ void ResumptionDataProcessor::DeleteButtonsSubscriptions( smart_objects::SmartObjectSPtr notification; for (auto& btn : button_subscriptions) { const auto hmi_btn = static_cast<hmi_apis::Common_ButtonName::eType>(btn); + if (hmi_apis::Common_ButtonName::CUSTOM_BUTTON == hmi_btn) { + continue; + } notification = MessageHelper::CreateOnButtonSubscriptionNotification( application->hmi_app_id(), hmi_btn, @@ -671,14 +665,6 @@ void ResumptionDataProcessor::DeleteButtonsSubscriptions( ProcessHMIRequest(notification, false); application->UnsubscribeFromButton(btn); } - - notification = MessageHelper::CreateOnButtonSubscriptionNotification( - application->hmi_app_id(), - hmi_apis::Common_ButtonName::CUSTOM_BUTTON, - /*is_subscribed = */ false, - application_manager_); - ProcessHMIRequest(notification, false); - application->SubscribeToButton(mobile_apis::ButtonName::CUSTOM_BUTTON); } void ResumptionDataProcessor::DeletePluginsSubscriptions( @@ -736,10 +722,11 @@ void ResumptionDataProcessor::CheckVehicleDataResponse( : response_params[ivi][strings::result_code].asInt(); if (kSuccess != vd_result_code) { LOG4CXX_TRACE(logger_, - "ivi " << ivi << " was not successfuly subscribed"); + "ivi " << ivi << " was NOT successfuly subscribed"); status.unsuccesfull_vehicle_data_subscriptions_.push_back(ivi); } else { + LOG4CXX_TRACE(logger_, "ivi " << ivi << " was successfuly subscribed"); status.succesfull_vehicle_data_subscriptions_.push_back(ivi); } } 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 73fa97c2c4..94ebb396fe 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 @@ -63,7 +63,9 @@ class MockResumeCtrl : public resumption::ResumeCtrl { bool(app_mngr::ApplicationSharedPtr application, const std::string& hash, resumption::ResumeCtrl::ResumptionCallBack)); - MOCK_METHOD1(HandleOnTimeOut, void(const int32_t app_id)); + MOCK_METHOD2(HandleOnTimeOut, + void(const uint32_t cor_id, + const hmi_apis::FunctionID::eType function_id)); MOCK_METHOD1(StartResumptionOnlyHMILevel, bool(app_mngr::ApplicationSharedPtr application)); MOCK_METHOD1(RetryResumption, void(const uint32_t app_id)); diff --git a/src/components/include/test/application_manager/mock_app_extension.h b/src/components/include/test/application_manager/mock_app_extension.h index a42c9229e4..e98c15b1d8 100644 --- a/src/components/include/test/application_manager/mock_app_extension.h +++ b/src/components/include/test/application_manager/mock_app_extension.h @@ -47,10 +47,10 @@ static unsigned MockAppExtensionUID = 123; class MockAppExtension : public application_manager::AppExtension { public: MockAppExtension() : AppExtension(MockAppExtensionUID) {} - MOCK_METHOD1( - SaveResumptionData, - void(ns_smart_device_link::ns_smart_objects::SmartObject& resumption_data)); - MOCK_METHOD1(ProcessResumption, + MOCK_METHOD1(SaveResumptionData, + void(ns_smart_device_link::ns_smart_objects::SmartObject& + resumption_data)); + MOCK_METHOD2(ProcessResumption, void(const ns_smart_device_link::ns_smart_objects::SmartObject& resumption_data, resumption::Subscriber subscriber)); |