diff options
author | Alexander Kutsan (GitHub) <akutsan@luxoft.com> | 2016-10-12 13:54:22 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-12 13:54:22 +0300 |
commit | db5af6c8d99159b5d2b427557ac4ef4cb67143b8 (patch) | |
tree | 43e5a9ed6aeb1278f303dce90df219cda4795bf9 | |
parent | bce24f3ee2211c27cd9c8dae4c6a7f76773a1aa2 (diff) | |
parent | 9d172a224153e970e81d460d6cb9b734c4599768 (diff) | |
download | sdl_core-db5af6c8d99159b5d2b427557ac4ef4cb67143b8.tar.gz |
Merge pull request #891 from LuxoftAKutsan/fix/response_function_id_check
Add function_id check in request controller
10 files changed, 64 insertions, 36 deletions
diff --git a/src/components/application_manager/include/application_manager/application_manager.h b/src/components/application_manager/include/application_manager/application_manager.h index 352801a61d..e67864b9b1 100644 --- a/src/components/application_manager/include/application_manager/application_manager.h +++ b/src/components/application_manager/include/application_manager/application_manager.h @@ -412,8 +412,11 @@ class ApplicationManager { * @brief TerminateRequest forces termination of request * @param connection_key - application id of request * @param corr_id correlation id of request + * @param function_id function id of request */ - virtual void TerminateRequest(uint32_t connection_key, uint32_t corr_id) = 0; + virtual void TerminateRequest(const uint32_t connection_key, + const uint32_t corr_id, + const int32_t function_id) = 0; /* * @brief Closes application by id 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 bb064d8b61..be52046888 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 @@ -711,8 +711,11 @@ class ApplicationManagerImpl * @brief TerminateRequest forces termination of request * @param connection_key - application id of request * @param corr_id correlation id of request + * @param function_id function id of request */ - void TerminateRequest(uint32_t connection_key, uint32_t corr_id) OVERRIDE; + void TerminateRequest(const uint32_t connection_key, + const uint32_t corr_id, + const int32_t function_id) OVERRIDE; // Overriden ProtocolObserver method void OnMessageReceived( const ::protocol_handler::RawMessagePtr message) OVERRIDE; diff --git a/src/components/application_manager/include/application_manager/request_controller.h b/src/components/application_manager/include/application_manager/request_controller.h index 237d9f5d8a..49fa2a7608 100644 --- a/src/components/application_manager/include/application_manager/request_controller.h +++ b/src/components/application_manager/include/application_manager/request_controller.h @@ -139,11 +139,13 @@ class RequestController { * * @param correlation_id Active request correlation ID, * @param connection_key Active request connection key (0 for HMI requersts) + * @param function_id Active request function id * @param force_terminate if true, request controller will terminate * even if not allowed by request */ - void terminateRequest(const uint32_t& correlation_id, - const uint32_t& connection_key, + void TerminateRequest(const uint32_t correlation_id, + const uint32_t connection_key, + const int32_t function_id, bool force_terminate = false); /** @@ -152,8 +154,9 @@ class RequestController { * @param mobile_correlation_id Active mobile request correlation ID * */ - void OnMobileResponse(const uint32_t& mobile_correlation_id, - const uint32_t& connection_key); + void OnMobileResponse(const uint32_t mobile_correlation_id, + const uint32_t connection_key, + const int32_t function_id); /** * @brief Removes request from queue @@ -161,7 +164,7 @@ class RequestController { * @param mobile_correlation_id Active mobile request correlation ID * */ - void OnHMIResponse(const uint32_t& correlation_id); + void OnHMIResponse(const uint32_t correlation_id, const int32_t function_id); /** * @ Add notification to collection diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 94ae92f6e0..1ef6e5ceb8 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1387,8 +1387,9 @@ void ApplicationManagerImpl::SendMessageToMobile( // checked against policy permissions if (msg_to_mobile[strings::params].keyExists(strings::correlation_id)) { request_ctrl_.OnMobileResponse( - msg_to_mobile[strings::params][strings::correlation_id].asInt(), - msg_to_mobile[strings::params][strings::connection_key].asInt()); + msg_to_mobile[strings::params][strings::correlation_id].asUInt(), + msg_to_mobile[strings::params][strings::connection_key].asUInt(), + msg_to_mobile[strings::params][strings::function_id].asInt()); } else if (app) { mobile_apis::FunctionID::eType function_id = static_cast<mobile_apis::FunctionID::eType>( @@ -1438,9 +1439,10 @@ void ApplicationManagerImpl::SendMessageToMobile( impl::MessageToMobile(message_to_send, final_message)); } -void ApplicationManagerImpl::TerminateRequest(uint32_t connection_key, - uint32_t corr_id) { - request_ctrl_.terminateRequest(corr_id, connection_key, true); +void ApplicationManagerImpl::TerminateRequest(const uint32_t connection_key, + const uint32_t corr_id, + const int32_t function_id) { + request_ctrl_.TerminateRequest(corr_id, connection_key, function_id, true); } bool ApplicationManagerImpl::ManageMobileCommand( @@ -1693,8 +1695,10 @@ bool ApplicationManagerImpl::ManageHMICommand( command->Run(); if (kResponse == message_type) { const uint32_t correlation_id = - (*(message.get()))[strings::params][strings::correlation_id].asInt(); - request_ctrl_.OnHMIResponse(correlation_id); + (*(message.get()))[strings::params][strings::correlation_id].asUInt(); + const int32_t function_id = + (*(message.get()))[strings::params][strings::function_id].asInt(); + request_ctrl_.OnHMIResponse(correlation_id, function_id); } return true; } diff --git a/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc b/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc index 8bdfa7dd81..db7477aae2 100644 --- a/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc +++ b/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc @@ -128,7 +128,8 @@ void AudioStartStreamRequest::on_event(const event_engine::Event& event) { void AudioStartStreamRequest::onTimeOut() { RetryStartSession(); - application_manager_.TerminateRequest(connection_key(), correlation_id()); + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } void AudioStartStreamRequest::RetryStartSession() { diff --git a/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc b/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc index 0c03f19bdd..38a38e9329 100644 --- a/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc +++ b/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc @@ -129,7 +129,8 @@ void NaviStartStreamRequest::on_event(const event_engine::Event& event) { void NaviStartStreamRequest::onTimeOut() { RetryStartSession(); - application_manager_.TerminateRequest(connection_key(), correlation_id()); + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } void NaviStartStreamRequest::RetryStartSession() { diff --git a/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc b/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc index c338c66672..39e6676d61 100644 --- a/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc +++ b/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc @@ -370,7 +370,8 @@ void CreateInteractionChoiceSetRequest::onTimeOut() { // according to SDLAQ-CRS-2976 sync_primitives::AutoLock timeout_lock_(is_timed_out_lock_); is_timed_out_ = true; - application_manager_.TerminateRequest(connection_key(), correlation_id()); + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } void CreateInteractionChoiceSetRequest::DeleteChoices() { @@ -420,7 +421,8 @@ void CreateInteractionChoiceSetRequest::OnAllHMIResponsesReceived() { DeleteChoices(); } - application_manager_.TerminateRequest(connection_key(), correlation_id()); + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } } // namespace commands diff --git a/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc b/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc index 373a0cf039..2b289b6fff 100644 --- a/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc +++ b/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc @@ -403,7 +403,8 @@ void UnsubscribeVehicleDataRequest::UpdateHash() const { "Application with connection_key = " << connection_key() << " doesn't exist."); } - application_manager_.TerminateRequest(connection_key(), correlation_id()); + application_manager_.TerminateRequest( + connection_key(), correlation_id(), function_id()); } } // namespace commands diff --git a/src/components/application_manager/src/request_controller.cc b/src/components/application_manager/src/request_controller.cc index 9010232f5c..cdf1616e42 100644 --- a/src/components/application_manager/src/request_controller.cc +++ b/src/components/application_manager/src/request_controller.cc @@ -227,37 +227,45 @@ void RequestController::removeNotification( LOG4CXX_DEBUG(logger_, "Cant find notification"); } -void RequestController::terminateRequest(const uint32_t& correlation_id, - const uint32_t& connection_key, +void RequestController::TerminateRequest(const uint32_t correlation_id, + const uint32_t connection_key, + const int32_t function_id, bool force_terminate) { LOG4CXX_AUTO_TRACE(logger_); LOG4CXX_DEBUG(logger_, "correlation_id = " << correlation_id << " connection_key = " << connection_key + << " function_id = " << function_id << " force_terminate = " << force_terminate); RequestInfoPtr request = waiting_for_response_.Find(connection_key, correlation_id); - if (request) { - if (force_terminate || request->request()->AllowedToTerminate()) { - waiting_for_response_.RemoveRequest(request); - } else { - LOG4CXX_WARN(logger_, "Request was not terminated"); - } - UpdateTimer(); + if (!request) { + LOG4CXX_WARN(logger_, "Request was not found in waiting_for_response"); + return; + } + if (request->request()->function_id() != function_id) { + LOG4CXX_ERROR(logger_, "Request and response function_id's don't match"); + return; + } + if (force_terminate || request->request()->AllowedToTerminate()) { + waiting_for_response_.RemoveRequest(request); } else { - LOG4CXX_WARN(logger_, "Request not found in waiting_for_response_"); + LOG4CXX_WARN(logger_, "Request was not terminated"); } + UpdateTimer(); } -void RequestController::OnMobileResponse(const uint32_t& mobile_correlation_id, - const uint32_t& connection_key) { +void RequestController::OnMobileResponse(const uint32_t mobile_correlation_id, + const uint32_t connection_key, + const int32_t function_id) { LOG4CXX_AUTO_TRACE(logger_); - terminateRequest(mobile_correlation_id, connection_key); + TerminateRequest(mobile_correlation_id, connection_key, function_id); } -void RequestController::OnHMIResponse(const uint32_t& correlation_id) { +void RequestController::OnHMIResponse(const uint32_t correlation_id, + const int32_t function_id) { LOG4CXX_AUTO_TRACE(logger_); - terminateRequest(correlation_id, RequestInfo::HmiConnectoinKey); + TerminateRequest(correlation_id, RequestInfo::HmiConnectoinKey, function_id); } void RequestController::terminateWaitingForExecutionAppRequests( diff --git a/src/components/application_manager/test/include/application_manager/mock_application_manager.h b/src/components/application_manager/test/include/application_manager/mock_application_manager.h index 683da7c6d6..851592cc32 100644 --- a/src/components/application_manager/test/include/application_manager/mock_application_manager.h +++ b/src/components/application_manager/test/include/application_manager/mock_application_manager.h @@ -173,8 +173,10 @@ class MockApplicationManager : public application_manager::ApplicationManager { int32_t audio_type)); MOCK_METHOD0(StartDevicesDiscovery, void()); MOCK_METHOD1(StopAudioPassThru, void(int32_t application_key)); - MOCK_METHOD2(TerminateRequest, - void(uint32_t connection_key, uint32_t corr_id)); + MOCK_METHOD3(TerminateRequest, + void(const uint32_t connection_key, + const uint32_t corr_id, + const int32_t function_id)); MOCK_METHOD4(UnregisterApplication, void(const uint32_t&, mobile_apis::Result::eType, bool, bool)); MOCK_METHOD3(updateRequestTimeout, |