Reduce the complexity of ps_handle_hook function 79/188679/1 accepted/tizen/5.0/unified/20181102.021730 accepted/tizen/unified/20180910.172029 submit/tizen/20180907.083718 submit/tizen_5.0/20181101.000004
authorsinikang <sinikang@samsung.com>
Fri, 7 Sep 2018 07:43:21 +0000 (16:43 +0900)
committersinikang <sinikang@samsung.com>
Fri, 7 Sep 2018 07:43:21 +0000 (16:43 +0900)
Change-Id: Idbe24ff67c831411567910e1a094d09d91ce8f5a

src/ps_hook.c
src/ps_tcore-interface.c

index 5666cf5..e31e4cf 100644 (file)
@@ -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;
        }
index 5b758ef..2fbb921 100644 (file)
@@ -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;