return TCORE_MANAGER_RETURN_STOP;
}
-static enum tcore_manager_return __call_handle_end_request(Server *server, UserRequest *ur)
-{
- enum tcore_manager_return ret = TCORE_MANAGER_RETURN_CONTINUE;
- enum tcore_request_command command = tcore_user_request_get_command(ur);
-
- switch (command) {
- case TREQ_CALL_END: {
- struct treq_call_end *req_data = NULL;
- int call_handle = INVALID_HANDLE;
- CoreObject *co_call = manager_util_get_core_object(server, ur, CORE_OBJECT_TYPE_CALL);
- CoreObject *co_network = manager_util_get_core_object(server, ur, CORE_OBJECT_TYPE_NETWORK);
- CallObject *call_obj = NULL;
- Manager *manager = tcore_server_ref_manager(server);
- TcorePlugin *manager_plugin = tcore_manager_get_plugin(manager);
- PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
- enum tcore_call_status call_status;
-
- if (!co_network)
- return TCORE_MANAGER_RETURN_FAILURE;
-
- if (priv_data->is_dial_noti_sent)
- priv_data->is_dial_noti_sent = FALSE;
-
- req_data = (struct treq_call_end *)tcore_user_request_ref_data(ur, NULL);
- call_handle = req_data->handle;
-
- call_obj = tcore_call_object_find_by_handle(co_call, call_handle);
- if (!call_obj) {
- err("invalid call handle - serious!");
-
- if (req_data->type == CALL_END_TYPE_ALL)
- info("END_ALL. call handle has no meaning. continue");
- else
- return TCORE_MANAGER_RETURN_FAILURE;
- }
-
- call_status = tcore_call_object_get_status(call_obj);
- if ((TCORE_CALL_STATUS_SETUP == call_status)
- || (TCORE_CALL_STATUS_SETUP_PENDING == call_status)) {
- struct tresp_call_end resp;
-
- if (tfeature_is_supported(TFEATURE_FUNCTION_NET_CHECK_ECC_RAT)) {
- enum telephony_network_ecc_rat_search_status rat_search_status;
-
- tcore_network_get_ecc_rat_search_status(co_network, &rat_search_status);
- if (tcore_call_object_get_type(call_obj) == TCORE_CALL_TYPE_E911
- && rat_search_status == NETWORK_ECC_RAT_SEARCH_STATUS_WAITING) {
- struct tnoti_call_status_idle noti_data;
-
- dbg("Call end requested during ECC RAT Searching, free call_obj");
- tcore_network_set_ecc_rat_search_status(co_network, NETWORK_ECC_RAT_SEARCH_STATUS_IDLE);
-
- resp.err = CALL_ERROR_NONE;
- resp.type = req_data->type;
- resp.handle = req_data->handle;
- tcore_user_request_send_response(ur, TRESP_CALL_END, sizeof(struct tresp_call_end), &resp);
- tcore_user_request_unref(ur);
-
- noti_data.type = CALL_TYPE_E911;
- noti_data.handle = tcore_call_object_get_handle(call_obj);
- noti_data.cause = CALL_END_CAUSE_NONE;
- tcore_call_object_free(co_call, call_obj);
-
- tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_call)),
- co_call, TNOTI_CALL_STATUS_IDLE,
- sizeof(struct tnoti_call_status_idle), ¬i_data);
- return TCORE_MANAGER_RETURN_STOP;
- }
- }
- info("call %d release requested but SETUP/PENDING state - save release request into call obj and wait for call event", call_handle);
- info("SETUP state - wait for dialing notification then send release request to CP");
- info("PENDING state - wait for precondition result then release call_obj and notify CALL_END to application");
-
- tcore_call_object_set_is_release_pending(call_obj, TRUE);
-
- resp.err = CALL_ERROR_NONE;
- resp.type = req_data->type;
- resp.handle = req_data->handle;
-
- tcore_user_request_send_response(ur, TRESP_CALL_END, sizeof(struct tresp_call_end), &resp);
- tcore_user_request_unref(ur);
- ret = TCORE_MANAGER_RETURN_STOP;
- } else {
- dbg("ordinary call release request - bypass request to modem plugin");
- if (tcore_call_object_check_cs_call_existence(co_call) == FALSE)
- ret = TCORE_MANAGER_RETURN_CONTINUE_IMS;
- else
- ret = TCORE_MANAGER_RETURN_CONTINUE;
- }
- }
- break;
-
- default:
- break;
- }
-
- return ret;
-}
-
static void on_resp_manager_silent_redial(UserRequest *ur,
enum tcore_response_command command,
unsigned int data_len, const void *data, void *user_data)
}
}
-enum tcore_manager_return manager_call_process_request(Server *server, UserRequest *ur)
+static enum tcore_manager_return __call_handle_dial_request(Server *server, UserRequest *ur)
{
enum tcore_request_command command = tcore_user_request_get_command(ur);
enum tcore_manager_return mret = TCORE_MANAGER_RETURN_CONTINUE;
if (req_data->type == CALL_TYPE_E911) {
/*
* Emergency call handling -
- * #step 1. check CS only based on Network Policy
+ * #step 1. check CS only based on Network Policy
*/
if (TRUE == __is_emergency_only_via_cs()) {
info("This device only induce emergency call to CS");
if (tfeature_is_supported(TFEATURE_FUNCTION_NET_CHECK_ECC_RAT)) {
dbg("S.LSI modem. Query RAT for Emergency call");
if (req_data->type == CALL_TYPE_E911) {
- /* For Every case request CP for ECC RAT information
+ /* For Every case request CP for ECC RAT information
enum telephony_network_access_technology act = NETWORK_ACT_UNKNOWN;
tcore_network_get_access_technology(co_network, &act);
/*
* Emergency call handling -
- * #step 2. we can go CS or PS
+ * #step 2. we can go CS or PS
*/
- /* READ) cs/ps status
+ /* READ) cs/ps status
* if) cs == NOSVC && ps == NOSVC : both No - NO SVC : FAIL : END
* if) cs is over Emergency && ps is NOSVC => GOTO CS : END
* if) cs is NOSVC && ps is over Emergency => GOTO PS : END
- * if) both available => GOTO CS : END
+ * if) both available => GOTO CS : END
*/
tcore_network_get_service_status(co_network,
TCORE_NETWORK_SERVICE_DOMAIN_TYPE_PACKET, &ps_status);
* Video : NETWORK_IMS_REG_FEATURE_TYPE_VT
*/
if ((req_data->type == CALL_TYPE_VOICE)
- && (!manager_util_is_ims_registered(server, ur, NETWORK_IMS_REG_FEATURE_TYPE_VOLTE))) {
+ && (!manager_util_is_ims_registered(server, ur, NETWORK_IMS_REG_FEATURE_TYPE_VOLTE))) {
break;
} else if ((req_data->type == CALL_TYPE_VIDEO)
- && (!manager_util_is_ims_registered(server, ur, NETWORK_IMS_REG_FEATURE_TYPE_VT))) {
+ && (!manager_util_is_ims_registered(server, ur, NETWORK_IMS_REG_FEATURE_TYPE_VT))) {
break;
}
if ((is_ignore == FALSE) && (ims_voice_status == FALSE)) {
dbg("is_ignore: [%s] ims_voice_status: [%s]",
- (is_ignore ? "TRUE" : "FALSE"),
- (ims_voice_status ? "TRUE" : "FALSE"));
+ (is_ignore ? "TRUE" : "FALSE"),
+ (ims_voice_status ? "TRUE" : "FALSE"));
break;
}
} else {
}
}
break;
+ default:
+ break;
+ }
+
+ return mret;
+}
+
+static enum tcore_manager_return __call_handle_end_request(Server *server, UserRequest *ur)
+{
+ enum tcore_manager_return ret = TCORE_MANAGER_RETURN_CONTINUE;
+ enum tcore_request_command command = tcore_user_request_get_command(ur);
+
+ switch (command) {
+ case TREQ_CALL_END: {
+ struct treq_call_end *req_data = NULL;
+ int call_handle = INVALID_HANDLE;
+ CoreObject *co_call = manager_util_get_core_object(server, ur, CORE_OBJECT_TYPE_CALL);
+ CoreObject *co_network = manager_util_get_core_object(server, ur, CORE_OBJECT_TYPE_NETWORK);
+ CallObject *call_obj = NULL;
+ Manager *manager = tcore_server_ref_manager(server);
+ TcorePlugin *manager_plugin = tcore_manager_get_plugin(manager);
+ PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
+ enum tcore_call_status call_status;
+
+ if (!co_network)
+ return TCORE_MANAGER_RETURN_FAILURE;
+
+ if (priv_data->is_dial_noti_sent)
+ priv_data->is_dial_noti_sent = FALSE;
+
+ req_data = (struct treq_call_end *)tcore_user_request_ref_data(ur, NULL);
+ call_handle = req_data->handle;
+
+ call_obj = tcore_call_object_find_by_handle(co_call, call_handle);
+ if (!call_obj) {
+ err("invalid call handle - serious!");
+
+ if (req_data->type == CALL_END_TYPE_ALL)
+ info("END_ALL. call handle has no meaning. continue");
+ else
+ return TCORE_MANAGER_RETURN_FAILURE;
+ }
+
+ call_status = tcore_call_object_get_status(call_obj);
+ if ((TCORE_CALL_STATUS_SETUP == call_status)
+ || (TCORE_CALL_STATUS_SETUP_PENDING == call_status)) {
+ struct tresp_call_end resp;
+
+ if (tfeature_is_supported(TFEATURE_FUNCTION_NET_CHECK_ECC_RAT)) {
+ enum telephony_network_ecc_rat_search_status rat_search_status;
+
+ tcore_network_get_ecc_rat_search_status(co_network, &rat_search_status);
+ if (tcore_call_object_get_type(call_obj) == TCORE_CALL_TYPE_E911
+ && rat_search_status == NETWORK_ECC_RAT_SEARCH_STATUS_WAITING) {
+ struct tnoti_call_status_idle noti_data;
+
+ dbg("Call end requested during ECC RAT Searching, free call_obj");
+ tcore_network_set_ecc_rat_search_status(co_network, NETWORK_ECC_RAT_SEARCH_STATUS_IDLE);
+
+ resp.err = CALL_ERROR_NONE;
+ resp.type = req_data->type;
+ resp.handle = req_data->handle;
+ tcore_user_request_send_response(ur, TRESP_CALL_END, sizeof(struct tresp_call_end), &resp);
+ tcore_user_request_unref(ur);
+
+ noti_data.type = CALL_TYPE_E911;
+ noti_data.handle = tcore_call_object_get_handle(call_obj);
+ noti_data.cause = CALL_END_CAUSE_NONE;
+ tcore_call_object_free(co_call, call_obj);
+
+ tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_call)),
+ co_call, TNOTI_CALL_STATUS_IDLE,
+ sizeof(struct tnoti_call_status_idle), ¬i_data);
+ return TCORE_MANAGER_RETURN_STOP;
+ }
+ }
+ info("call %d release requested but SETUP/PENDING state - save release request into call obj and wait for call event", call_handle);
+ info("SETUP state - wait for dialing notification then send release request to CP");
+ info("PENDING state - wait for precondition result then release call_obj and notify CALL_END to application");
+
+ tcore_call_object_set_is_release_pending(call_obj, TRUE);
+
+ resp.err = CALL_ERROR_NONE;
+ resp.type = req_data->type;
+ resp.handle = req_data->handle;
+
+ tcore_user_request_send_response(ur, TRESP_CALL_END, sizeof(struct tresp_call_end), &resp);
+ tcore_user_request_unref(ur);
+ ret = TCORE_MANAGER_RETURN_STOP;
+ } else {
+ dbg("ordinary call release request - bypass request to modem plugin");
+ if (tcore_call_object_check_cs_call_existence(co_call) == FALSE)
+ ret = TCORE_MANAGER_RETURN_CONTINUE_IMS;
+ else
+ ret = TCORE_MANAGER_RETURN_CONTINUE;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+enum tcore_manager_return manager_call_process_request(Server *server, UserRequest *ur)
+{
+ enum tcore_request_command command = tcore_user_request_get_command(ur);
+ enum tcore_manager_return mret = TCORE_MANAGER_RETURN_CONTINUE;
+ CoreObject *co_call = manager_util_get_core_object(server, ur, CORE_OBJECT_TYPE_CALL);
+
+ switch (command) {
+ case TREQ_CALL_DIAL: {
+ mret = __call_handle_dial_request(server, ur);
+ }
+ break;
case TREQ_CALL_END: {
mret = __call_handle_end_request(server, ur);