summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Kutsan (GitHub) <akutsan@luxoft.com>2016-10-12 13:54:22 +0300
committerGitHub <noreply@github.com>2016-10-12 13:54:22 +0300
commitdb5af6c8d99159b5d2b427557ac4ef4cb67143b8 (patch)
tree43e5a9ed6aeb1278f303dce90df219cda4795bf9
parentbce24f3ee2211c27cd9c8dae4c6a7f76773a1aa2 (diff)
parent9d172a224153e970e81d460d6cb9b734c4599768 (diff)
downloadsdl_core-db5af6c8d99159b5d2b427557ac4ef4cb67143b8.tar.gz
Merge pull request #891 from LuxoftAKutsan/fix/response_function_id_check
Add function_id check in request controller
-rw-r--r--src/components/application_manager/include/application_manager/application_manager.h5
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h5
-rw-r--r--src/components/application_manager/include/application_manager/request_controller.h13
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc18
-rw-r--r--src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc3
-rw-r--r--src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc3
-rw-r--r--src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc6
-rw-r--r--src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc3
-rw-r--r--src/components/application_manager/src/request_controller.cc38
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_application_manager.h6
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,