Reduce the complexity 43/188643/2
authorsinikang <sinikang@samsung.com>
Fri, 7 Sep 2018 04:33:27 +0000 (13:33 +0900)
committersinikang <sinikang@samsung.com>
Fri, 7 Sep 2018 04:53:22 +0000 (13:53 +0900)
Change-Id: I51c4a05418e79f15a8a1ee03fda8b75b49fff0b8

packaging/tel-plugin-packetservice.spec
src/ps_hook.c
src/ps_master.c
src/ps_tcore-interface.c

index 48b6d45ca32cab71620c86fac3ef49bbe972589b..e38a77819ab4f4f6411e56663d70d048e5c9a8cb 100644 (file)
@@ -4,7 +4,7 @@
 
 %define major 0
 %define minor 4
-%define patchlevel 24
+%define patchlevel 25
 
 Name:           tel-plugin-packetservice
 Version:        %{major}.%{minor}.%{patchlevel}
index 0d293a2648968add009d3d79000409c57ceadd2a..5666cf53d06b93258879dc4faa4e7082a9162ad6 100644 (file)
@@ -458,6 +458,119 @@ static void __ps_modem_set_hook_flag(ps_modem_t *modem, enum tcore_request_comma
        ps_info_ex_modem(modem, "After set - FLAG %x", modem->hook_flag);
 }
 
+static enum tcore_hook_return __ps_handle_modem_power_on(ps_modem_t *modem, UserRequest *ur)
+{
+       if (modem->powered == PS_MODEM_STATE_ONLINE) {
+               struct tresp_modem_power_on set_power_on;
+               memset(&set_power_on, 0, sizeof(struct tresp_modem_power_on));
+               ps_dbg_ex_modem(modem, "FLAG: 0x%x", modem->hook_flag);
+
+               if (modem->hook_flag & PS_NETWORK_SET_POWER_LOW) {
+                       ps_dbg_ex_modem(modem, "LOW power request is pending, send abort response");
+                       set_power_on.result = TCORE_RETURN_OPERATION_ABORTED;
+                       tcore_user_request_send_response(ur, TRESP_MODEM_POWER_ON,
+                                                        sizeof(struct tresp_modem_power_on), &set_power_on);
+               } else {
+                       ps_dbg_ex_modem(modem, "No pending LOW power request, send success response.");
+                       set_power_on.result = TCORE_RETURN_EALREADY;
+                       tcore_user_request_send_response(ur, TRESP_MODEM_POWER_ON,
+                                                        sizeof(struct tresp_modem_power_on), &set_power_on);
+               }
+               tcore_user_request_unref(ur);
+               return TCORE_HOOK_RETURN_STOP_PROPAGATION;
+       }
+       return TCORE_HOOK_RETURN_CONTINUE;
+}
+
+static void __ps_handle_waiting_job(UserRequest *ur, enum tcore_request_command 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_NETWORK_SET_PLMN_SELECTION_MODE) {
+               struct tresp_network_set_plmn_selection_mode set_plmn_mode_rsp;
+               memset(&set_plmn_mode_rsp, 0, sizeof(struct tresp_network_set_plmn_selection_mode));
+
+               set_plmn_mode_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_NETWORK_SET_PLMN_SELECTION_MODE,
+                                                sizeof(struct tresp_network_set_plmn_selection_mode), &set_plmn_mode_rsp);
+       } else if (cmd == TREQ_NETWORK_SET_MODE) {
+               struct tresp_network_set_mode setmode_rsp;
+               memset(&setmode_rsp, 0, sizeof(struct tresp_network_set_mode));
+
+               setmode_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_NETWORK_SET_MODE,
+                                                sizeof(struct tresp_network_set_mode), &setmode_rsp);
+       } else if (cmd == TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH) {
+               struct tresp_network_set_cancel_manual_search search_cancel_rsp;
+               memset(&search_cancel_rsp, 0, sizeof(struct tresp_network_set_cancel_manual_search));
+
+               search_cancel_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_NETWORK_SET_CANCEL_MANUAL_SEARCH,
+                                                sizeof(struct tresp_network_set_cancel_manual_search), &search_cancel_rsp);
+       } else if (cmd == TREQ_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION) {
+               struct tresp_network_set_default_data_subscription default_data_rsp;
+               memset(&default_data_rsp, 0, sizeof(struct tresp_network_set_default_data_subscription));
+
+               default_data_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION,
+                                                sizeof(struct tresp_network_set_default_data_subscription), &default_data_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);
+       } else if (cmd == TREQ_MODEM_POWER_OFF) {
+               struct tresp_modem_power_off set_power_off;
+               memset(&set_power_off, 0, sizeof(struct tresp_modem_power_off));
+
+               set_power_off.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_MODEM_POWER_OFF,
+                                                sizeof(struct tresp_modem_power_off), &set_power_off);
+       } else if (cmd == TREQ_MODEM_POWER_LOW) {
+               struct tresp_modem_power_low set_power_low;
+               memset(&set_power_low, 0, sizeof(struct tresp_modem_power_low));
+
+               set_power_low.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_MODEM_POWER_LOW,
+                                                sizeof(struct tresp_modem_power_low), &set_power_low);
+       } else if (cmd == TREQ_SIM_SET_POWERSTATE) {
+               struct tresp_sim_set_powerstate set_power;
+               memset(&set_power, 0, sizeof(struct tresp_sim_set_powerstate));
+
+               set_power.result = TCORE_RETURN_OPERATION_ABORTED;
+               tcore_user_request_send_response(ur, TRESP_SIM_SET_POWERSTATE,
+                                                sizeof(struct tresp_sim_set_powerstate), &set_power);
+       }
+       tcore_user_request_unref(ur);
+}
+
+static void __ps_handle_cancel_manual_search(ps_modem_t *modem, UserRequest *ur, UserRequest *ur_pending)
+{
+       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);
+}
+
 static enum tcore_hook_return ps_handle_hook(Server *s, UserRequest *ur, void *user_data)
 {
        gboolean ret = FALSE;
@@ -601,26 +714,7 @@ static enum tcore_hook_return ps_handle_hook(Server *s, UserRequest *ur, void *u
                return TCORE_HOOK_RETURN_CONTINUE;
 
        if (cmd == TREQ_MODEM_POWER_ON) {
-               if (modem->powered == PS_MODEM_STATE_ONLINE) {
-                       struct tresp_modem_power_on set_power_on;
-                       memset(&set_power_on, 0, sizeof(struct tresp_modem_power_on));
-                       ps_dbg_ex_modem(modem, "FLAG: 0x%x", modem->hook_flag);
-
-                       if (modem->hook_flag & PS_NETWORK_SET_POWER_LOW) {
-                               ps_dbg_ex_modem(modem, "LOW power request is pending, send abort response");
-                               set_power_on.result = TCORE_RETURN_OPERATION_ABORTED;
-                               tcore_user_request_send_response(ur, TRESP_MODEM_POWER_ON,
-                                                                sizeof(struct tresp_modem_power_on), &set_power_on);
-                       } else {
-                               ps_dbg_ex_modem(modem, "No pending LOW power request, send success response.");
-                               set_power_on.result = TCORE_RETURN_EALREADY;
-                               tcore_user_request_send_response(ur, TRESP_MODEM_POWER_ON,
-                                                                sizeof(struct tresp_modem_power_on), &set_power_on);
-                       }
-                       tcore_user_request_unref(ur);
-                       return TCORE_HOOK_RETURN_STOP_PROPAGATION;
-               }
-               return TCORE_HOOK_RETURN_CONTINUE;
+               return __ps_handle_modem_power_on(modem, ur);
        }
        if (FALSE == tcore_ps_any_context_activating_activated(co_ps, &value)) {
                ps_dbg_ex_modem(modem, "No activating/activated context present");
@@ -664,75 +758,7 @@ static enum tcore_hook_return ps_handle_hook(Server *s, UserRequest *ur, void *u
        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_NETWORK_SET_PLMN_SELECTION_MODE) {
-                       struct tresp_network_set_plmn_selection_mode set_plmn_mode_rsp;
-                       memset(&set_plmn_mode_rsp, 0, sizeof(struct tresp_network_set_plmn_selection_mode));
-
-                       set_plmn_mode_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_NETWORK_SET_PLMN_SELECTION_MODE,
-                                                        sizeof(struct tresp_network_set_plmn_selection_mode), &set_plmn_mode_rsp);
-               } else if (cmd == TREQ_NETWORK_SET_MODE) {
-                       struct tresp_network_set_mode setmode_rsp;
-                       memset(&setmode_rsp, 0, sizeof(struct tresp_network_set_mode));
-
-                       setmode_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_NETWORK_SET_MODE,
-                                                        sizeof(struct tresp_network_set_mode), &setmode_rsp);
-               } else if (cmd == TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH) {
-                       struct tresp_network_set_cancel_manual_search search_cancel_rsp;
-                       memset(&search_cancel_rsp, 0, sizeof(struct tresp_network_set_cancel_manual_search));
-
-                       search_cancel_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_NETWORK_SET_CANCEL_MANUAL_SEARCH,
-                                                        sizeof(struct tresp_network_set_cancel_manual_search), &search_cancel_rsp);
-               } else if (cmd == TREQ_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION) {
-                       struct tresp_network_set_default_data_subscription default_data_rsp;
-                       memset(&default_data_rsp, 0, sizeof(struct tresp_network_set_default_data_subscription));
-
-                       default_data_rsp.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_NETWORK_SET_DEFAULT_DATA_SUBSCRIPTION,
-                                                        sizeof(struct tresp_network_set_default_data_subscription), &default_data_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);
-               } else if (cmd == TREQ_MODEM_POWER_OFF) {
-                       struct tresp_modem_power_off set_power_off;
-                       memset(&set_power_off, 0, sizeof(struct tresp_modem_power_off));
-
-                       set_power_off.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_MODEM_POWER_OFF,
-                                                        sizeof(struct tresp_modem_power_off), &set_power_off);
-
-               } else if (cmd == TREQ_MODEM_POWER_LOW) {
-                       struct tresp_modem_power_low set_power_low;
-                       memset(&set_power_low, 0, sizeof(struct tresp_modem_power_low));
-
-                       set_power_low.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_MODEM_POWER_LOW,
-                                                        sizeof(struct tresp_modem_power_low), &set_power_low);
-
-               } else if (cmd == TREQ_SIM_SET_POWERSTATE) {
-                       struct tresp_sim_set_powerstate set_power;
-                       memset(&set_power, 0, sizeof(struct tresp_sim_set_powerstate));
-
-                       set_power.result = TCORE_RETURN_OPERATION_ABORTED;
-                       tcore_user_request_send_response(ur, TRESP_SIM_SET_POWERSTATE,
-                                                        sizeof(struct tresp_sim_set_powerstate), &set_power);
-
-               }
-               tcore_user_request_unref(ur);
+               __ps_handle_waiting_job(ur, cmd);
                return TCORE_HOOK_RETURN_STOP_PROPAGATION;
        }
 
@@ -747,22 +773,7 @@ static enum tcore_hook_return ps_handle_hook(Server *s, UserRequest *ur, void *u
                        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);
-
+                       __ps_handle_cancel_manual_search(modem, ur, ur_pending);
                        return TCORE_HOOK_RETURN_STOP_PROPAGATION;
                }
        }
index 2c3e4f319a31a1c76de99a91c6f7a914f0e8f3f2..c062bc6dd725fa59d9398b43176efb360674ab81 100644 (file)
@@ -144,49 +144,10 @@ void __remove_master(gpointer data, gpointer user_data)
        dbg("Exiting");
 }
 
-static void __ps_master_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data)
+static void __ps_master_process_key_callback(ps_master_t *master, enum tcore_storage_key key, GVariant *tmp)
 {
-       GVariant *tmp = NULL;
        GHashTableIter iter;
        gpointer h_key, h_value;
-       gboolean type_check = FALSE;
-       ps_master_t *master = (ps_master_t *)user_data;
-
-       g_return_if_fail(master != NULL);
-
-       tmp = (GVariant *)value;
-       if (G_UNLIKELY(!tmp)) {
-               err("value is null");
-               return;
-       }
-
-       switch (key) {
-       case KEY_3G_ENABLE:
-       case KEY_DATA_ROAMING_SETTING:
-       case KEY_NETWORK_RESTRICT_MODE:
-       case KEY_TELEPHONY_READY:
-               type_check = g_variant_is_of_type(tmp, G_VARIANT_TYPE_BOOLEAN);
-               if (!type_check) {
-                       err("wrong variant data type");
-                       g_variant_unref(tmp);
-                       return;
-               }
-               break;
-
-       case KEY_POWER_SAVING_MODE:
-       case KEY_PM_STATE:
-               type_check = g_variant_is_of_type(tmp, G_VARIANT_TYPE_INT32);
-               if (!type_check) {
-                       err("wrong variant data type");
-                       g_variant_unref(tmp);
-                       return;
-               }
-               break;
-
-       default:
-               warn("unknown key (0x%x)", key);
-               return;
-       }
 
        g_hash_table_iter_init(&iter, master->modems);
        while (g_hash_table_iter_next(&iter, &h_key, &h_value) == TRUE) {
@@ -269,6 +230,51 @@ static void __ps_master_storage_key_callback(enum tcore_storage_key key, void *v
                                ps_master_emit_modem_added_signal(master, h_value);
                }
        }
+}
+
+static void __ps_master_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data)
+{
+       GVariant *tmp = NULL;
+       gboolean type_check = FALSE;
+       ps_master_t *master = (ps_master_t *)user_data;
+
+       g_return_if_fail(master != NULL);
+
+       tmp = (GVariant *)value;
+       if (G_UNLIKELY(!tmp)) {
+               err("value is null");
+               return;
+       }
+
+       switch (key) {
+       case KEY_3G_ENABLE:
+       case KEY_DATA_ROAMING_SETTING:
+       case KEY_NETWORK_RESTRICT_MODE:
+       case KEY_TELEPHONY_READY:
+               type_check = g_variant_is_of_type(tmp, G_VARIANT_TYPE_BOOLEAN);
+               if (!type_check) {
+                       err("wrong variant data type");
+                       g_variant_unref(tmp);
+                       return;
+               }
+               break;
+
+       case KEY_POWER_SAVING_MODE:
+       case KEY_PM_STATE:
+               type_check = g_variant_is_of_type(tmp, G_VARIANT_TYPE_INT32);
+               if (!type_check) {
+                       err("wrong variant data type");
+                       g_variant_unref(tmp);
+                       return;
+               }
+               break;
+
+       default:
+               warn("unknown key (0x%x)", key);
+               return;
+       }
+
+       __ps_master_process_key_callback(master, key, tmp);
 
 }
 
index 85639923cf64fab1555d6ddf5bc2871a585eed3c..5b758ef8fa9ef19d18557c789d996337ec8005ad 100644 (file)
@@ -126,6 +126,87 @@ static void __ps_modem_cp_reset_handler(ps_modem_t *modem)
 #endif
 }
 
+#ifdef PREPAID_SIM_APN_SUPPORT
+static void __on_call_status_for_prepaid_sim(ps_service_t *service, ps_context_t *def_context, ps_modem_t *modem)
+{
+       unsigned char prepaid_cid = 0;
+       ps_context_t *prepaid_def_context = NULL;
+       unsigned char def_cid = 0;
+
+       if (!service) {
+               ps_err_ex_svc(service, "service does not exist");
+               return;
+       }
+
+       if (!modem) {
+               ps_err_ex_modem(modem, "modem does not exist");
+               return;
+       }
+
+       if (def_context == NULL) {
+               def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET);
+               if (def_context) {
+                       CoreObject *co_context = NULL;
+                       co_context = _ps_context_ref_co_context(def_context);
+                       def_cid = tcore_context_get_id(co_context);
+               }
+       }
+
+       prepaid_def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_PREPAID_INTERNET);
+       ps_dbg_ex_modem(modem, "prepaid_def_context[%p]", prepaid_def_context);
+       if (prepaid_def_context) {
+               CoreObject *co_context = NULL;
+               co_context = _ps_context_ref_co_context(prepaid_def_context);
+               prepaid_cid = tcore_context_get_id(co_context);
+       }
+       ps_dbg_ex_modem(modem, "prepaid_cid[%d]", prepaid_cid);
+
+       /* Has prepaid APN */
+       if (prepaid_def_context) {
+               ps_master_t * master = NULL;
+               ps_context_t *context = NULL;
+               int rv = 0;
+
+               ps_dbg_ex_modem(modem, "Context id: %d", cstatus->context_id);
+               ps_dbg_ex_modem(modem, "retry: %s", retry ? "TRUE" : "FALSE");
+
+               if (cstatus->context_id == def_cid) {
+                       ps_dbg_ex_modem(modem, "Resetting connection time for default context");
+                       _ps_service_reset_connection_timer(def_context);
+
+                       /* Connect to default prepaid internet */
+                       rv = _ps_service_connect_default_prepaid_context(service);
+                       ps_dbg_ex_modem(modem, "prepaid internet connect - rv[%d]", rv);
+               } else if (cstatus->context_id == prepaid_cid) {
+                       /* Reset connection */
+                       ps_dbg_ex_modem(modem, "Resetting connection time for prepaid internet context");
+                       _ps_service_reset_connection_timer(prepaid_def_context);
+
+                       /* Connect to default internet */
+                       rv =  _ps_service_connect_default_context(service);
+                       ps_dbg_ex_modem(modem, "default internet connect - rv[%d]", rv);
+               }
+
+               /* Reset Last connected, Profile ID and Operator vconf keys. */
+               ps_dbg_ex_modem(modem, "Reset vconf keys...");
+               master = _ps_modem_ref_master(modem);
+               _ps_master_set_storage_value_string(master, STORAGE_KEY_TELEPHONY_LAST_CONNECTED_CONTEXT_PLMN, NULL);
+               /* Get context*/
+               context = _ps_service_return_context_by_cid(service, cstatus->context_id);
+               ps_dbg_ex_modem(modem, "context[%p]", context);
+               if (context) {
+                       /* Set profile ID */
+                       ps_dbg_ex_modem(modem, "Reset profile id");
+                       _ps_master_set_storage_value_int(master, STORAGE_KEY_PDP_LAST_CONNECTED_CONTEXT_PROFILE_ID, -1);
+                       /* set vconf last connected profile */
+                       ps_dbg_ex_modem(modem, "set vconf last connected profile to FALSE");
+                       _ps_master_set_storage_value_bool(master, STORAGE_KEY_PDP_LAST_CONNECTED_CONTEXT_BOOL, FALSE);
+               }
+       }
+
+}
+#endif
+
 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)
@@ -280,10 +361,6 @@ static enum tcore_hook_return __on_hook_call_status(Server *s, CoreObject *sourc
                unsigned char def_cid = 0, ims_cid = 0;
                int value = 0;
                gboolean retry = TRUE;
-#ifdef PREPAID_SIM_APN_SUPPORT
-               unsigned char prepaid_cid = 0;
-               ps_context_t *prepaid_def_context = NULL;
-#endif
 
                retry = ps_util_check_permanent_reject_cause(cstatus->result, _ps_modem_get_roaming(modem));
                /* if retry not permitted by network */
@@ -304,26 +381,6 @@ static enum tcore_hook_return __on_hook_call_status(Server *s, CoreObject *sourc
                        }
                }
 
-#ifdef PREPAID_SIM_APN_SUPPORT
-               if (def_context == NULL) {
-                       def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_INTERNET);
-                       if (def_context) {
-                               CoreObject *co_context = NULL;
-                               co_context = _ps_context_ref_co_context(def_context);
-                               def_cid = tcore_context_get_id(co_context);
-                       }
-               }
-
-               prepaid_def_context = _ps_service_return_default_context(service, CONTEXT_ROLE_PREPAID_INTERNET);
-               ps_dbg_ex_modem(modem, "prepaid_def_context[%p]", prepaid_def_context);
-               if (prepaid_def_context) {
-                       CoreObject *co_context = NULL;
-                       co_context = _ps_context_ref_co_context(prepaid_def_context);
-                       prepaid_cid = tcore_context_get_id(co_context);
-               }
-               ps_dbg_ex_modem(modem, "prepaid_cid[%d]", prepaid_cid);
-#endif
-
                _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);
@@ -349,49 +406,9 @@ static enum tcore_hook_return __on_hook_call_status(Server *s, CoreObject *sourc
                        }
                }
 
-#ifdef PREPAID_SIM_APN_SUPPORT
-               /* Has prepaid APN */
-               if (prepaid_def_context) {
-                       ps_master_t * master = NULL;
-                       ps_context_t *context = NULL;
-                       int rv = 0;
-
-                       ps_dbg_ex_modem(modem, "Context id: %d", cstatus->context_id);
-                       ps_dbg_ex_modem(modem, "retry: %s", retry ? "TRUE" : "FALSE");
-
-                       if (cstatus->context_id == def_cid) {
-                               ps_dbg_ex_modem(modem, "Resetting connection time for default context");
-                               _ps_service_reset_connection_timer(def_context);
-
-                               /* Connect to default prepaid internet */
-                               rv = _ps_service_connect_default_prepaid_context(service);
-                               ps_dbg_ex_modem(modem, "prepaid internet connect - rv[%d]", rv);
-                       } else if (cstatus->context_id == prepaid_cid) {
-                               /* Reset connection */
-                               ps_dbg_ex_modem(modem, "Resetting connection time for prepaid internet context");
-                               _ps_service_reset_connection_timer(prepaid_def_context);
-
-                               /* Connect to default internet */
-                               rv =  _ps_service_connect_default_context(service);
-                               ps_dbg_ex_modem(modem, "default internet connect - rv[%d]", rv);
-                       }
 
-                       /* Reset Last connected, Profile ID and Operator vconf keys. */
-                       ps_dbg_ex_modem(modem, "Reset vconf keys...");
-                       master = _ps_modem_ref_master(modem);
-                       _ps_master_set_storage_value_string(master, STORAGE_KEY_TELEPHONY_LAST_CONNECTED_CONTEXT_PLMN, NULL);
-                       /* Get context*/
-                       context = _ps_service_return_context_by_cid(service, cstatus->context_id);
-                       ps_dbg_ex_modem(modem, "context[%p]", context);
-                       if (context) {
-                               /* Set profile ID */
-                               ps_dbg_ex_modem(modem, "Reset profile id");
-                               _ps_master_set_storage_value_int(master, STORAGE_KEY_PDP_LAST_CONNECTED_CONTEXT_PROFILE_ID, -1);
-                               /* set vconf last connected profile */
-                               ps_dbg_ex_modem(modem, "set vconf last connected profile to FALSE");
-                               _ps_master_set_storage_value_bool(master, STORAGE_KEY_PDP_LAST_CONNECTED_CONTEXT_BOOL, FALSE);
-                       }
-               }
+#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);