summaryrefslogtreecommitdiff
path: root/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc')
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc200
1 files changed, 141 insertions, 59 deletions
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
index 19ec2dfb27..aa16c9b218 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
@@ -52,11 +52,13 @@ DeleteSubMenuRequest::DeleteSubMenuRequest(
rpc_service::RPCService& rpc_service,
HMICapabilities& hmi_capabilities,
policy::PolicyHandlerInterface& policy_handler)
- : CommandRequestImpl(message,
- application_manager,
- rpc_service,
- hmi_capabilities,
- policy_handler) {}
+ : RequestFromMobileImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler)
+ , requests_list_()
+ , pending_request_corr_id_(0) {}
DeleteSubMenuRequest::~DeleteSubMenuRequest() {}
@@ -82,19 +84,42 @@ void DeleteSubMenuRequest::Run() {
return;
}
+ {
+ const DataAccessor<SubMenuMap> accessor = app->sub_menu_map();
+ const SubMenuMap& sub_menus = accessor.GetData();
+ DeleteNestedSubMenus(app, menu_id, sub_menus);
+ }
+
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
-
msg_params[strings::menu_id] =
(*message_)[strings::msg_params][strings::menu_id];
msg_params[strings::app_id] = app->app_id();
+ requests_list_.push_back(msg_params);
+
StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI);
+ SendNextRequest();
+}
- SendHMIRequest(hmi_apis::FunctionID::UI_DeleteSubMenu, &msg_params, true);
+void DeleteSubMenuRequest::SendNextRequest() {
+ SDL_LOG_AUTO_TRACE();
+
+ const auto request_params = requests_list_.front();
+ auto function_id = hmi_apis::FunctionID::UI_DeleteSubMenu;
+
+ if (request_params.keyExists(strings::cmd_id)) {
+ function_id = request_params.keyExists(strings::grammar_id)
+ ? hmi_apis::FunctionID::VR_DeleteCommand
+ : hmi_apis::FunctionID::UI_DeleteCommand;
+ }
+
+ pending_request_corr_id_ = SendHMIRequest(function_id, &request_params, true);
+ SDL_LOG_DEBUG(
+ "Waiting for response for corr_id = " << pending_request_corr_id_);
}
void DeleteSubMenuRequest::DeleteNestedSubMenus(ApplicationSharedPtr const app,
- uint32_t parentID,
+ const uint32_t parentID,
const SubMenuMap& subMenus) {
SDL_LOG_AUTO_TRACE();
@@ -108,26 +133,26 @@ void DeleteSubMenuRequest::DeleteNestedSubMenus(ApplicationSharedPtr const app,
}
if (parentID == (*it->second)[strings::parent_id].asUInt()) {
- uint32_t menuID = (*it->second)[strings::menu_id].asUInt();
+ const uint32_t menuID = (*it->second)[strings::menu_id].asUInt();
DeleteNestedSubMenus(app, menuID, subMenus);
- DeleteSubMenuVRCommands(app, menuID);
- DeleteSubMenuUICommands(app, menuID);
+
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
msg_params[strings::menu_id] = menuID;
msg_params[strings::app_id] = app->app_id();
- SendHMIRequest(hmi_apis::FunctionID::UI_DeleteSubMenu, &msg_params);
- ++it;
- SDL_LOG_DEBUG("Removing submenuID: " << menuID);
- app->RemoveSubMenu(menuID);
- } else {
- ++it;
+ requests_list_.push_back(msg_params);
}
+
+ ++it;
}
+
+ SDL_LOG_DEBUG("Delete commands with Parent ID: " << parentID);
+ DeleteSubMenuVRCommands(app, parentID);
+ DeleteSubMenuUICommands(app, parentID);
}
void DeleteSubMenuRequest::DeleteSubMenuVRCommands(
- ApplicationConstSharedPtr app, uint32_t parentID) {
+ ApplicationConstSharedPtr app, const uint32_t parentID) {
SDL_LOG_AUTO_TRACE();
const DataAccessor<CommandsMap> accessor = app->commands_map();
@@ -148,7 +173,7 @@ void DeleteSubMenuRequest::DeleteSubMenuVRCommands(
msg_params[strings::grammar_id] = app->get_grammar_id();
msg_params[strings::type] = hmi_apis::Common_VRCommandType::Command;
- SendHMIRequest(hmi_apis::FunctionID::VR_DeleteCommand, &msg_params);
+ requests_list_.push_back(msg_params);
}
}
}
@@ -175,16 +200,11 @@ void DeleteSubMenuRequest::DeleteSubMenuUICommands(
const uint32_t cmd_id = (*it->second)[strings::cmd_id].asUInt();
msg_params[strings::app_id] = app->app_id();
msg_params[strings::cmd_id] = cmd_id;
- SDL_LOG_DEBUG("Removing UI Command: " << cmd_id);
- app->RemoveCommand(cmd_id);
- app->help_prompt_manager().OnVrCommandDeleted(cmd_id, false);
- it = commands.begin(); // Can not relay on
- // iterators after erase was called
-
- SendHMIRequest(hmi_apis::FunctionID::UI_DeleteCommand, &msg_params);
- } else {
- ++it;
+
+ requests_list_.push_back(msg_params);
}
+
+ ++it;
}
}
@@ -193,48 +213,110 @@ void DeleteSubMenuRequest::on_event(const event_engine::Event& event) {
const smart_objects::SmartObject& message = event.smart_object();
switch (event.id()) {
- case hmi_apis::FunctionID::UI_DeleteSubMenu: {
- EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI);
- hmi_apis::Common_Result::eType result_code =
- static_cast<hmi_apis::Common_Result::eType>(
- message[strings::params][hmi_response::code].asInt());
- std::string response_info;
- GetInfo(message, response_info);
- const bool result = PrepareResultForMobileResponse(
- result_code, HmiInterfaces::HMI_INTERFACE_UI);
-
- ApplicationSharedPtr application =
- application_manager_.application(connection_key());
-
- if (!application) {
- SDL_LOG_ERROR("NULL pointer");
- return;
+ case hmi_apis::FunctionID::UI_DeleteCommand: {
+ SDL_LOG_DEBUG("Received UI_DeleteCommand response");
+
+ const auto corr_id =
+ message[strings::params][strings::correlation_id].asUInt();
+ if (pending_request_corr_id_ == corr_id) {
+ auto msg_params = requests_list_.front();
+
+ const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
+ message[strings::params][hmi_response::code].asInt());
+
+ auto app = application_manager_.application(connection_key());
+ if (!app) {
+ SDL_LOG_ERROR("Application not found");
+ return;
+ }
+
+ if (application_manager::commands::IsHMIResultSuccess(result_code)) {
+ const auto cmd_id = msg_params[strings::cmd_id].asUInt();
+ SDL_LOG_DEBUG("Removing UI Command: " << cmd_id);
+ app->RemoveCommand(cmd_id);
+ app->help_prompt_manager().OnVrCommandDeleted(cmd_id, false);
+ }
+
+ requests_list_.pop_front();
}
- if (result) {
- // delete sub menu items from SDL and HMI
- uint32_t parentID =
- (*message_)[strings::msg_params][strings::menu_id].asUInt();
- const DataAccessor<SubMenuMap> accessor = application->sub_menu_map();
- const SubMenuMap& subMenus = accessor.GetData();
- DeleteNestedSubMenus(application, parentID, subMenus);
- DeleteSubMenuVRCommands(application, parentID);
- DeleteSubMenuUICommands(application, parentID);
- application->RemoveSubMenu(
- (*message_)[strings::msg_params][strings::menu_id].asInt());
+ break;
+ }
+
+ case hmi_apis::FunctionID::VR_DeleteCommand: {
+ SDL_LOG_DEBUG("Received VR_DeleteCommand response");
+
+ const auto corr_id =
+ message[strings::params][strings::correlation_id].asUInt();
+
+ if (corr_id == pending_request_corr_id_) {
+ auto app = application_manager_.application(connection_key());
+ if (!app) {
+ SDL_LOG_ERROR("Application not found");
+ return;
+ }
+
+ requests_list_.pop_front();
}
- SendResponse(result,
- MessageHelper::HMIToMobileResult(result_code),
- response_info.empty() ? NULL : response_info.c_str(),
- &(message[strings::msg_params]));
break;
}
+
+ case hmi_apis::FunctionID::UI_DeleteSubMenu: {
+ SDL_LOG_DEBUG("Received UI_DeleteSubMenu response");
+
+ const auto corr_id =
+ message[strings::params][strings::correlation_id].asUInt();
+ if (corr_id == pending_request_corr_id_) {
+ auto msg_params = requests_list_.front();
+
+ const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
+ message[strings::params][hmi_response::code].asInt());
+
+ auto app = application_manager_.application(connection_key());
+ if (!app) {
+ SDL_LOG_ERROR("Application not found");
+ return;
+ }
+
+ if (application_manager::commands::IsHMIResultSuccess(result_code)) {
+ const auto menu_id = msg_params[strings::menu_id].asUInt();
+ SDL_LOG_DEBUG("Removing submenuID: " << menu_id);
+ app->RemoveSubMenu(menu_id);
+ }
+
+ requests_list_.pop_front();
+ }
+
+ break;
+ }
+
default: {
SDL_LOG_ERROR("Received unknown event" << event.id());
return;
}
}
+
+ if (!requests_list_.empty()) {
+ SDL_LOG_DEBUG("Still waiting for another requests");
+ SendNextRequest();
+ return;
+ }
+
+ EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI);
+
+ hmi_apis::Common_Result::eType result_code =
+ static_cast<hmi_apis::Common_Result::eType>(
+ message[strings::params][hmi_response::code].asInt());
+ std::string response_info;
+ GetInfo(message, response_info);
+ const bool result = PrepareResultForMobileResponse(
+ result_code, HmiInterfaces::HMI_INTERFACE_UI);
+
+ SendResponse(result,
+ MessageHelper::HMIToMobileResult(result_code),
+ response_info.empty() ? NULL : response_info.c_str(),
+ &(message[strings::msg_params]));
}
bool DeleteSubMenuRequest::Init() {