Fix bug TZSP-6035/TDIS-5141 (Wrong SIM card status when PIN Code protection is activated)
[platform/core/telephony/tel-plugin-imc.git] / src / s_network.c
old mode 100644 (file)
new mode 100755 (executable)
index 7c5e8d9..17a1d02
@@ -28,6 +28,7 @@
 #include <hal.h>
 #include <core_object.h>
 #include <plugin.h>
+#include <user_request.h>
 #include <queue.h>
 #include <co_network.h>
 #include <co_ps.h>
@@ -118,18 +119,16 @@ static void on_confirmation_network_message_send(TcorePending *p, gboolean resul
        }
 }
 
-static void nwk_prepare_and_send_pending_request(TcorePlugin *plugin, char *co_name, const char *at_cmd, const char *prefix, enum tcore_at_command_type at_cmd_type, UserRequest *ur, TcorePendingResponseCallback callback)
+static void nwk_prepare_and_send_pending_request(CoreObject *co, const char *at_cmd, const char *prefix, enum tcore_at_command_type at_cmd_type, UserRequest *ur, TcorePendingResponseCallback callback)
 {
        TcoreATRequest *req = NULL;
        TcoreHal *hal;
-       CoreObject *o = NULL;
        TcorePending *pending = NULL;
        TReturn ret;
 
-       o = tcore_plugin_ref_core_object(plugin, co_name);
-       hal = tcore_object_get_hal(o);
+       hal = tcore_object_get_hal(co);
 
-       pending = tcore_pending_new(o, 0);
+       pending = tcore_pending_new(co, 0);
        req = tcore_at_request_new(at_cmd, prefix, at_cmd_type);
 
        dbg("cmd : %s, prefix(if any) :%s, cmd_len : %d", req->cmd, req->prefix, strlen(req->cmd));
@@ -244,23 +243,18 @@ static enum telephony_network_service_type _get_service_type(enum telephony_netw
 
 static void _ps_set(TcorePlugin *p, int status)
 {
-       GSList *co_list = NULL;
-
-       co_list = tcore_plugin_get_core_objects_bytype(p, CORE_OBJECT_TYPE_PS);
-       do {
-               CoreObject *o = NULL;
-               o = (CoreObject *) co_list->data;
-               if (!o)
-                       break;
+       CoreObject *co_ps;
 
-               if (status == NETWORK_SERVICE_DOMAIN_STATUS_FULL) {
-                       tcore_ps_set_online(o, TRUE);
-               } else {
-                       tcore_ps_set_online(o, FALSE);
-               }
-       } while ((co_list = g_slist_next(co_list)));
+       co_ps = tcore_plugin_ref_core_object(p, CORE_OBJECT_TYPE_PS);
+       if (co_ps == NULL) {
+               err("No PS Core Object on plugin");
+               return;
+       }
 
-       g_slist_free(co_list);
+       if (status == NETWORK_SERVICE_DOMAIN_STATUS_FULL)
+               tcore_ps_set_online(co_ps, TRUE);
+       else
+               tcore_ps_set_online(co_ps, FALSE);
 }
 
 static void on_timeout_search_network(TcorePending *p, void *user_data)
@@ -463,13 +457,10 @@ OUT:
                tcore_user_request_send_response(ur, TRESP_NETWORK_SEARCH, sizeof(struct tresp_network_search), &resp);
        }
 
-       if (tokens)
-               tcore_at_tok_free(tokens);
-
-       if (temp_plmn_info)
-               free(temp_plmn_info);
+       /* Free tokens */
+       tcore_at_tok_free(tokens);
 
-       return;
+       g_free(temp_plmn_info);
 }
 
 static void on_response_set_umts_band(TcorePending *p, int data_len, const void *data, void *user_data)
@@ -960,7 +951,7 @@ static void on_response_get_preferred_plmn(TcorePending *p, int data_len, const
                                /* EF Index */
                                if ((pResp = tcore_at_tok_nth(tokens, 0))) {
                                        dbg("Index : %s", pResp);
-                                       resp.list[i].ef_index = atoi(pResp);
+                                       resp.list[i].index = atoi(pResp);
                                }
                                /* Format */
                                if ((pResp = tcore_at_tok_nth(tokens, 1))) {
@@ -986,7 +977,7 @@ static void on_response_get_preferred_plmn(TcorePending *p, int data_len, const
                                                        if (resp.list[i].plmn[5] == '#')
                                                                resp.list[i].plmn[5] = '\0';
 
-                                                       // free(cp_plmn);
+                                                       // g_free(cp_plmn);
                                                }
                                        }
                                }
@@ -1175,10 +1166,9 @@ static void on_response_get_serving_network(TcorePending *p, int data_len, const
                                dbg("dbg.. noti.plmn  : %s", noti.plmn);
                        }
                }
-               if (long_plmn_name)
-                       free(long_plmn_name);
-               if (short_plmn_name)
-                       free(short_plmn_name);
+
+               g_free(long_plmn_name);
+               g_free(short_plmn_name);
        }
        return;
 }
@@ -1308,7 +1298,7 @@ Note: <Act> is supporting from R7 and above Protocol Stack.
                regist_status.roaming_status = tcore_network_get_roaming_state(o);
 
                tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
-                                                                          TNOTI_NETWORK_REGISTRATION_STATUS, sizeof(struct tnoti_network_registration_status), &regist_status);
+                                                                          TNOTI_NETWORK_REGISTRATION_STATUS, sizeof(regist_status), &regist_status);
 #if 0
                if (service_type == NETWORK_SERVICE_TYPE_HSDPA)
                        noti.status = TELEPHONY_HSDPA_ON;
@@ -1623,7 +1613,7 @@ minutes, seconds.*/
                dbg("new pending(AT+XOPS=0/5/6 for Nitz PLMN name)");
 
                /* Get NITZ name and plmn_id via AT+XCOPS = 0/5/6 */
-               nwk_prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+XCOPS=0;+XCOPS=5;+XCOPS=6", "+XCOPS", TCORE_AT_MULTILINE, ur, on_response_get_nitz_name);
+               nwk_prepare_and_send_pending_request(o, "AT+XCOPS=0;+XCOPS=5;+XCOPS=6", "+XCOPS", TCORE_AT_MULTILINE, ur, on_response_get_nitz_name);
        } else {
                dbg("line is  NULL");
        }
@@ -1666,6 +1656,10 @@ static void on_sim_resp_hook_get_netname(UserRequest *ur, enum tcore_response_co
                if ((resp->data.spn.display_condition & 0x03) == 0x01) {
                        tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_ANY);
                }
+
+               // fallback in case no SPN name is provided
+               if (resp->data.spn.spn[0] == '\0')
+                       tcore_network_set_network_name_priority(o, TCORE_NETWORK_NAME_PRIORITY_NETWORK);
        }
 }
 
@@ -2072,7 +2066,7 @@ AT+CPOL=
                        req_data->plmn[5] = '\0';
                }
        }
-       cmd_str = g_strdup_printf("AT+CPOL=%d,%d,\"%s\",%d,%d,%d", req_data->ef_index + 1, format, req_data->plmn, gsm_act, gsm_compact_act, utran_act);
+       cmd_str = g_strdup_printf("AT+CPOL=%d,%d,\"%s\",%d,%d,%d", req_data->index + 1, format, req_data->plmn, gsm_act, gsm_compact_act, utran_act);
 
        dbg("cmd_str - %s", cmd_str);
        atreq = tcore_at_request_new(cmd_str, "+CPOL", TCORE_AT_NO_RESULT);
@@ -2143,7 +2137,7 @@ static TReturn get_serving_network(CoreObject *o, UserRequest *ur)
 
        dbg("new pending(AT+COPS?)");
 
-       nwk_prepare_and_send_pending_request(tcore_object_ref_plugin(o), "umts_network", "AT+COPS=3,2;+COPS?;+COPS=3,0;+COPS?", "+COPS", TCORE_AT_MULTILINE, ur, on_response_get_serving_network);
+       nwk_prepare_and_send_pending_request(o, "AT+COPS=3,2;+COPS?;+COPS=3,0;+COPS?", "+COPS", TCORE_AT_MULTILINE, ur, on_response_get_serving_network);
        return TCORE_RETURN_SUCCESS;
 }
 
@@ -2165,33 +2159,29 @@ static struct tcore_network_operations network_ops = {
        .get_serving_network = get_serving_network,
 };
 
-gboolean s_network_init(TcorePlugin *p, TcoreHal *h)
+gboolean s_network_init(TcorePlugin *cp, CoreObject *co_network)
 {
-       CoreObject *o = NULL;
+       dbg("Enter");
 
-       o = tcore_network_new(p, "umts_network", &network_ops, h);
-       if (!o)
-               return FALSE;
+       tcore_network_override_ops(co_network, &network_ops);
 
-       tcore_object_add_callback(o, "+CREG", on_event_cs_network_regist, NULL);
-       tcore_object_add_callback(o, "+CGREG", on_event_ps_network_regist, NULL);
-       tcore_object_add_callback(o, "+XCIEV", on_event_network_icon_info, NULL);
+       tcore_object_override_callback(co_network, "+CREG", on_event_cs_network_regist, NULL);
+       tcore_object_override_callback(co_network, "+CGREG", on_event_ps_network_regist, NULL);
+       tcore_object_override_callback(co_network, "+XCIEV", on_event_network_icon_info, NULL);
 
        /* +CTZV: <tz>,<time> */
-       tcore_object_add_callback(o, "+CTZV", on_event_network_ctzv_time_info, NULL);
+       tcore_object_override_callback(co_network, "+CTZV", on_event_network_ctzv_time_info, NULL);
 
-       tcore_server_add_notification_hook(tcore_plugin_ref_server(p), TNOTI_SIM_STATUS, on_hook_sim_init, o);
+       tcore_server_add_notification_hook(tcore_plugin_ref_server(cp), TNOTI_SIM_STATUS, on_hook_sim_init, co_network);
 
-       _insert_mcc_mnc_oper_list(p, o);
+       _insert_mcc_mnc_oper_list(cp, co_network);
+
+       dbg("Exit");
 
        return TRUE;
 }
 
-void s_network_exit(TcorePlugin *p)
+void s_network_exit(TcorePlugin *cp, CoreObject *co_network)
 {
-       CoreObject *o;
-
-       o = tcore_plugin_ref_core_object(p, "umts_network");
-
-       tcore_network_free(o);
+       dbg("Exit");
 }