From cff4ab61c152f708a0dac1d87e1deaf700693ab0 Mon Sep 17 00:00:00 2001 From: sinikang Date: Fri, 7 Sep 2018 16:43:21 +0900 Subject: [PATCH] Reduce the complexity of ps_handle_hook function Change-Id: Idbe24ff67c831411567910e1a094d09d91ce8f5a --- src/ps_hook.c | 211 ++++++++++++++++++++++++++--------------------- src/ps_tcore-interface.c | 136 ++++++++++++++++-------------- 2 files changed, 189 insertions(+), 158 deletions(-) diff --git a/src/ps_hook.c b/src/ps_hook.c index 5666cf5..e31e4cf 100644 --- a/src/ps_hook.c +++ b/src/ps_hook.c @@ -552,6 +552,121 @@ static void __ps_handle_waiting_job(UserRequest *ur, enum tcore_request_command tcore_user_request_unref(ur); } +static enum tcore_hook_return __ps_handle_network_search_modem_changed(ps_modem_t *modem, CoreObject *co_ps, + UserRequest *ur, enum tcore_request_command cmd) +{ + gboolean ret = FALSE; + TReturn rv = TCORE_RETURN_FAILURE; + + GHashTableIter iter; + gpointer key, service; + guint job_cnt = 0; + int value = 0; + + if (!modem || !co_ps || !ur) + return TCORE_HOOK_RETURN_CONTINUE; + + if (FALSE == tcore_ps_any_context_activating_activated(co_ps, &value)) { + ps_dbg_ex_modem(modem, "No activating/activated context present"); + /* Block PS always-on while network operations. */ + __ps_modem_set_hook_flag(modem, cmd); + tcore_user_request_set_response_hook(ur, __ps_hook_response_cb, modem); + return TCORE_HOOK_RETURN_CONTINUE; + } + + ps_info_ex_modem(modem, "Value returned [%d]", value); + if (CONTEXT_STATE_ACTIVATED == value) { + ps_dbg_ex_modem(modem, "Internet/mms/tethering Activated/Activating context present need to deactivate them"); + if (cmd == TREQ_NETWORK_SEARCH) { + g_hash_table_iter_init(&iter, modem->services); + while (g_hash_table_iter_next(&iter, &key, &service) == TRUE) + _ps_service_disconnect_internet_mms_tethering_contexts(service); + } else { + rv = tcore_ps_deactivate_contexts(co_ps); + if (rv != TCORE_RETURN_SUCCESS) { + ps_dbg_ex_modem(modem, "fail to deactivation"); + return TCORE_HOOK_RETURN_CONTINUE; + } + } + } else if (CONTEXT_STATE_ACTIVATING == value) { + if (cmd == TREQ_MODEM_SET_FLIGHTMODE) { + ps_info_ex_modem(modem, "No need to stop these request for pdp in activating state "); + return TCORE_HOOK_RETURN_CONTINUE; + } + ps_dbg_ex_modem(modem, "For rest command will wait for activation successful "); + } + if (!modem->work_queue) { + ps_err_ex_modem(modem, "no queue present unable to handle request"); + return TCORE_HOOK_RETURN_CONTINUE; + } + + job_cnt = ps_util_get_waiting_job_count(modem->work_queue, cmd); + if (job_cnt) { + ps_err_ex_modem(modem, "duplicated job for cmd(%d)", cmd); + + if (cmd == TREQ_NETWORK_SEARCH) { + struct tresp_network_search search_rsp; + memset(&search_rsp, 0, sizeof(struct tresp_network_search)); + + search_rsp.result = TCORE_RETURN_OPERATION_ABORTED; + search_rsp.list_count = 0; + tcore_user_request_send_response(ur, TRESP_NETWORK_SEARCH, + sizeof(struct tresp_network_search), &search_rsp); + } else if (cmd == TREQ_MODEM_SET_FLIGHTMODE) { + struct tresp_modem_set_flightmode set_flight_mode; + memset(&set_flight_mode, 0, sizeof(struct tresp_modem_set_flightmode)); + + set_flight_mode.result = TCORE_RETURN_OPERATION_ABORTED; + tcore_user_request_send_response(ur, TRESP_MODEM_SET_FLIGHTMODE, + sizeof(struct tresp_modem_set_flightmode), &set_flight_mode); + } + + tcore_user_request_unref(ur); + return TCORE_HOOK_RETURN_STOP_PROPAGATION; + } + ret = ps_util_add_waiting_job(modem->work_queue, cmd, ur); + if (!ret) { + ps_err_ex_modem(modem, "fail to add the request to queue"); + return TCORE_HOOK_RETURN_CONTINUE; + } + + __ps_modem_get_mode_pref_change(modem, ur); + __ps_modem_set_hook_flag(modem, cmd); + return TCORE_HOOK_RETURN_STOP_PROPAGATION; + +} + +static enum tcore_hook_return __ps_handle_cancel_manual_search_modem_changed(ps_modem_t *modem, UserRequest *ur) +{ + UserRequest *ur_pending = NULL; + ur_pending = ps_util_pop_waiting_job(modem->work_queue, TREQ_NETWORK_SEARCH); + + if (!ur_pending) { + ps_dbg_ex_modem(modem, "no pendig search request"); + tcore_user_request_set_response_hook(ur, __ps_hook_response_cb, modem); + return TCORE_HOOK_RETURN_CONTINUE; + } else { + struct tresp_network_search search_rsp; + struct tresp_network_set_cancel_manual_search search_cancel_rsp; + + memset(&search_rsp, 0, sizeof(struct tresp_network_search)); + memset(&search_cancel_rsp, 0, sizeof(struct tresp_network_set_cancel_manual_search)); + + search_rsp.list_count = 0; + ps_dbg_ex_modem(modem, "send search response to upper layer"); + tcore_user_request_send_response(ur_pending, TRESP_NETWORK_SEARCH, sizeof(struct tresp_network_search), &search_rsp); + tcore_user_request_unref(ur_pending); + + tcore_user_request_set_response_hook(ur, __ps_hook_response_cb, modem); + search_cancel_rsp.result = TCORE_RETURN_SUCCESS; + tcore_user_request_send_response(ur, TRESP_NETWORK_SET_CANCEL_MANUAL_SEARCH, + sizeof(struct tresp_network_set_cancel_manual_search), &search_cancel_rsp); + + return TCORE_HOOK_RETURN_STOP_PROPAGATION; + } + return TCORE_HOOK_RETURN_CONTINUE; +} + static void __ps_handle_cancel_manual_search(ps_modem_t *modem, UserRequest *ur, UserRequest *ur_pending) { struct tresp_network_search search_rsp; @@ -607,101 +722,9 @@ static enum tcore_hook_return ps_handle_hook(Server *s, UserRequest *ur, void *u ps_err_ex_modem(modem, "No ps core object present "); return TCORE_HOOK_RETURN_CONTINUE; } - - if (FALSE == tcore_ps_any_context_activating_activated(co_ps, &value)) { - ps_dbg_ex_modem(modem, "No activating/activated context present"); - /* Block PS always-on while network operations. */ - __ps_modem_set_hook_flag(modem, cmd); - tcore_user_request_set_response_hook(ur, __ps_hook_response_cb, modem); - return TCORE_HOOK_RETURN_CONTINUE; - } - - ps_info_ex_modem(modem, "Value returned [%d]", value); - if (CONTEXT_STATE_ACTIVATED == value) { - ps_dbg_ex_modem(modem, "Internet/mms/tethering Activated/Activating context present need to deactivate them"); - if (cmd == TREQ_NETWORK_SEARCH) { - g_hash_table_iter_init(&iter, modem->services); - while (g_hash_table_iter_next(&iter, &key, &service) == TRUE) - _ps_service_disconnect_internet_mms_tethering_contexts(service); - } else { - rv = tcore_ps_deactivate_contexts(co_ps); - if (rv != TCORE_RETURN_SUCCESS) { - ps_dbg_ex_modem(modem, "fail to deactivation"); - return TCORE_HOOK_RETURN_CONTINUE; - } - } - } else if (CONTEXT_STATE_ACTIVATING == value) { - if (cmd == TREQ_MODEM_SET_FLIGHTMODE) { - ps_info_ex_modem(modem, "No need to stop these request for pdp in activating state "); - return TCORE_HOOK_RETURN_CONTINUE; - } - ps_dbg_ex_modem(modem, "For rest command will wait for activation successful "); - } - if (!modem->work_queue) { - ps_err_ex_modem(modem, "no queue present unable to handle request"); - return TCORE_HOOK_RETURN_CONTINUE; - } - - job_cnt = ps_util_get_waiting_job_count(modem->work_queue, cmd); - if (job_cnt) { - ps_err_ex_modem(modem, "duplicated job for cmd(%d)", cmd); - - if (cmd == TREQ_NETWORK_SEARCH) { - struct tresp_network_search search_rsp; - memset(&search_rsp, 0, sizeof(struct tresp_network_search)); - - search_rsp.result = TCORE_RETURN_OPERATION_ABORTED; - search_rsp.list_count = 0; - tcore_user_request_send_response(ur, TRESP_NETWORK_SEARCH, - sizeof(struct tresp_network_search), &search_rsp); - } else if (cmd == TREQ_MODEM_SET_FLIGHTMODE) { - struct tresp_modem_set_flightmode set_flight_mode; - memset(&set_flight_mode, 0, sizeof(struct tresp_modem_set_flightmode)); - - set_flight_mode.result = TCORE_RETURN_OPERATION_ABORTED; - tcore_user_request_send_response(ur, TRESP_MODEM_SET_FLIGHTMODE, - sizeof(struct tresp_modem_set_flightmode), &set_flight_mode); - } - - tcore_user_request_unref(ur); - return TCORE_HOOK_RETURN_STOP_PROPAGATION; - } - ret = ps_util_add_waiting_job(modem->work_queue, cmd, ur); - if (!ret) { - ps_err_ex_modem(modem, "fail to add the request to queue"); - return TCORE_HOOK_RETURN_CONTINUE; - } - - __ps_modem_get_mode_pref_change(modem, ur); - __ps_modem_set_hook_flag(modem, cmd); - return TCORE_HOOK_RETURN_STOP_PROPAGATION; + return __ps_handle_network_search_modem_changed(modem, co_ps, ur, cmd); } else if (cmd == TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH) { - UserRequest *ur_pending = NULL; - ur_pending = ps_util_pop_waiting_job(modem->work_queue, TREQ_NETWORK_SEARCH); - - if (!ur_pending) { - ps_dbg_ex_modem(modem, "no pendig search request"); - tcore_user_request_set_response_hook(ur, __ps_hook_response_cb, modem); - return TCORE_HOOK_RETURN_CONTINUE; - } else { - struct tresp_network_search search_rsp; - struct tresp_network_set_cancel_manual_search search_cancel_rsp; - - memset(&search_rsp, 0, sizeof(struct tresp_network_search)); - memset(&search_cancel_rsp, 0, sizeof(struct tresp_network_set_cancel_manual_search)); - - search_rsp.list_count = 0; - ps_dbg_ex_modem(modem, "send search response to upper layer"); - tcore_user_request_send_response(ur_pending, TRESP_NETWORK_SEARCH, sizeof(struct tresp_network_search), &search_rsp); - tcore_user_request_unref(ur_pending); - - tcore_user_request_set_response_hook(ur, __ps_hook_response_cb, modem); - search_cancel_rsp.result = TCORE_RETURN_SUCCESS; - tcore_user_request_send_response(ur, TRESP_NETWORK_SET_CANCEL_MANUAL_SEARCH, - sizeof(struct tresp_network_set_cancel_manual_search), &search_cancel_rsp); - - return TCORE_HOOK_RETURN_STOP_PROPAGATION; - } + return __ps_handle_cancel_manual_search_modem_changed(modem, ur); } return TCORE_HOOK_RETURN_CONTINUE; } diff --git a/src/ps_tcore-interface.c b/src/ps_tcore-interface.c index 5b758ef..2fbb921 100644 --- a/src/ps_tcore-interface.c +++ b/src/ps_tcore-interface.c @@ -207,6 +207,77 @@ static void __on_call_status_for_prepaid_sim(ps_service_t *service, ps_context_t } #endif +static void __on_hook_status_NO_carrier(ps_modem_t *modem, ps_service_t *service, + CoreObject *co_ps, struct tnoti_ps_call_status *cstatus) +{ + ps_context_t *def_context = NULL, *ims_context = NULL; + unsigned char def_cid = 0, ims_cid = 0; + int value = 0; + gboolean retry = TRUE; + + if (!modem || !service || !cstatus) + return; + + retry = ps_util_check_permanent_reject_cause(cstatus->result, _ps_modem_get_roaming(modem)); + /* if retry not permitted by network */ + if (FALSE == retry) { + ps_dbg_ex_modem(modem, "DO NOT RETRY NETWORK CONNECTION AUTOMATICALLY"); + ps_info_ex_modem(modem, "permanent reject cause (%d), roaming(%d)", cstatus->result, _ps_modem_get_roaming(modem)); + + def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET); + if (def_context) { + CoreObject *co_context = _ps_context_ref_co_context(def_context); + def_cid = tcore_context_get_id(co_context); + } + + ims_context = _ps_service_return_default_context(service, CONTEXT_ROLE_IMS); + if (ims_context) { + CoreObject *co_context = _ps_context_ref_co_context(ims_context); + ims_cid = tcore_context_get_id(co_context); + } + } + + _ps_service_set_ps_defined(service, FALSE, cstatus->context_id); + tcore_ps_set_cid_active(co_ps, cstatus->context_id, FALSE); + tcore_ps_set_cid_connected(co_ps, cstatus->context_id, FALSE); + _ps_service_set_connected(service, cstatus, FALSE); + + if (FALSE == tcore_ps_any_internet_mms_tethering_context_activating_activated(co_ps, &value)) { + ps_dbg_ex_modem(modem, "No context open connections, publish disconnected signal"); +#ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL + /* Handle any pending request if present */ + modem = _ps_service_ref_modem(service); + _ps_hook_send_pending_user_request(modem); +#endif + /* Ensured that set_reset_profile is always done default thread's context */ + if (_ps_modem_get_reset_profile(modem) == TRUE) { + /* Initiate Reset Profile */ + ps_info_ex_modem(modem, "Profiles are being reset"); + /* Shouldn't invoke set profile directly, as it will remove hooks registered to server while being hook callback*/ + if (NULL == _ps_modem_get_profile_reset_gsource(modem)) { + GSource *gsource = NULL; + gsource = ps_util_gsource_dispatch(g_main_context_default(), G_PRIORITY_LOW, (GSourceFunc)_ps_modem_initiate_reset_profile, modem); + _ps_modem_set_profile_reset_gsource(modem, gsource); + } + } + } + +#ifdef PREPAID_SIM_APN_SUPPORT + __on_call_status_for_prepaid_sim(service, def_context, modem); +#endif + + ps_info_ex_modem(modem, "Any context activating or activated [%d]", value); + if (FALSE == retry) { + if (cstatus->context_id == def_cid) { + _ps_service_reset_connection_timer(def_context); + _ps_context_set_alwayson_enable(def_context, FALSE); + } else if (cstatus->context_id == ims_cid) { + _ps_service_reset_connection_timer(ims_context); + _ps_context_set_alwayson_enable(ims_context, FALSE); + } + } +} + static enum tcore_hook_return __on_hook_call_status(Server *s, CoreObject *source, enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) @@ -357,70 +428,7 @@ static enum tcore_hook_return __on_hook_call_status(Server *s, CoreObject *sourc } } } else if (cstatus->state == PS_CALL_STATE_RESULT_NO_CARRIER) { /* DISCONNECTED-NO CARRIER */ - ps_context_t *def_context = NULL, *ims_context = NULL; - unsigned char def_cid = 0, ims_cid = 0; - int value = 0; - gboolean retry = TRUE; - - retry = ps_util_check_permanent_reject_cause(cstatus->result, _ps_modem_get_roaming(modem)); - /* if retry not permitted by network */ - if (FALSE == retry) { - ps_dbg_ex_modem(modem, "DO NOT RETRY NETWORK CONNECTION AUTOMATICALLY"); - ps_info_ex_modem(modem, "permanent reject cause (%d), roaming(%d)", cstatus->result, _ps_modem_get_roaming(modem)); - - def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET); - if (def_context) { - CoreObject *co_context = _ps_context_ref_co_context(def_context); - def_cid = tcore_context_get_id(co_context); - } - - ims_context = _ps_service_return_default_context(service, CONTEXT_ROLE_IMS); - if (ims_context) { - CoreObject *co_context = _ps_context_ref_co_context(ims_context); - ims_cid = tcore_context_get_id(co_context); - } - } - - _ps_service_set_ps_defined(service, FALSE, cstatus->context_id); - tcore_ps_set_cid_active(co_ps, cstatus->context_id, FALSE); - tcore_ps_set_cid_connected(co_ps, cstatus->context_id, FALSE); - _ps_service_set_connected(service, cstatus, FALSE); - - if (FALSE == tcore_ps_any_internet_mms_tethering_context_activating_activated(co_ps, &value)) { - ps_dbg_ex_modem(modem, "No context open connections, publish disconnected signal"); -#ifdef TIZEN_SUPPORT_REQUEST_HOOK_PDP_CONTROL - /* Handle any pending request if present */ - modem = _ps_service_ref_modem(service); - _ps_hook_send_pending_user_request(modem); -#endif - /* Ensured that set_reset_profile is always done default thread's context */ - if (_ps_modem_get_reset_profile(modem) == TRUE) { - /* Initiate Reset Profile */ - ps_info_ex_modem(modem, "Profiles are being reset"); - /* Shouldn't invoke set profile directly, as it will remove hooks registered to server while being hook callback*/ - if (NULL == _ps_modem_get_profile_reset_gsource(modem)) { - GSource *gsource = NULL; - gsource = ps_util_gsource_dispatch(g_main_context_default(), G_PRIORITY_LOW, (GSourceFunc)_ps_modem_initiate_reset_profile, modem); - _ps_modem_set_profile_reset_gsource(modem, gsource); - } - } - } - - -#ifdef PREPAID_SIM_APN_SUPPORT - __on_call_status_for_prepaid_sim(service, def_context, modem); -#endif - - ps_info_ex_modem(modem, "Any context activating or activated [%d]", value); - if (FALSE == retry) { - if (cstatus->context_id == def_cid) { - _ps_service_reset_connection_timer(def_context); - _ps_context_set_alwayson_enable(def_context, FALSE); - } else if (cstatus->context_id == ims_cid) { - _ps_service_reset_connection_timer(ims_context); - _ps_context_set_alwayson_enable(ims_context, FALSE); - } - } + __on_hook_status_NO_carrier(modem, service, co_ps, cstatus); } /* disconnected case */ return TCORE_HOOK_RETURN_CONTINUE; -- 2.7.4