Update Search state in response for both Success and Failure cases.
[platform/core/telephony/tel-plugin-imc.git] / src / imc_sim.c
index 94f9ca4..f670077 100644 (file)
@@ -460,11 +460,9 @@ gboolean __imc_sim_get_sim_type(CoreObject *co,
        ret = tcore_at_prepare_and_send_request(co,
                "AT+XUICC?", "+XUICC:",
                TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               TCORE_PENDING_PRIORITY_DEFAULT,
                NULL,
                __on_response_imc_sim_get_sim_type, resp_cb_data,
-               on_send_imc_request, NULL,
-               0, NULL, NULL);
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get SIM Type");
 
        return ret;
@@ -668,11 +666,9 @@ static gboolean __imc_sim_get_sim_status(CoreObject *co,
        ret = tcore_at_prepare_and_send_request(co,
                "AT+XSIMSTATE?", "+XSIMSTATE:",
                TCORE_AT_COMMAND_TYPE_SINGLELINE,
-               TCORE_PENDING_PRIORITY_DEFAULT,
                NULL,
                __on_response_imc_sim_get_sim_status, resp_cb_data,
-               on_send_imc_request, NULL,
-               0, NULL, NULL);
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get SIM Status");
 
        return TRUE;
@@ -847,9 +843,23 @@ static void __imc_sim_next_from_read_binary(CoreObject *co, ImcRespCbData *resp_
                        resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data.iccid, resp_cb_data->cb_data);
        break;
 
+       case TEL_SIM_EF_SPDI: {
+               guint i;
+               dbg("spdi count[%d]", file_meta->files.data.spdi.count);
+
+               if (resp_cb_data->cb)
+                       resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
+
+               /* Free resources */
+               for (i = 0; i < file_meta->files.data.spdi.count; i++)
+                       tcore_free(file_meta->files.data.spdi.list[i].plmn);
+
+               tcore_free(file_meta->files.data.spdi.list);
+       }
+       break;
+
        case TEL_SIM_EF_SST:
        case TEL_SIM_EF_SPN:
-       case TEL_SIM_EF_SPDI:
        case TEL_SIM_EF_OPLMN_ACT:
        case TEL_SIM_EF_CPHS_CPHS_INFO:
        case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS:
@@ -916,6 +926,7 @@ static void __imc_sim_next_from_get_response(CoreObject *co, ImcRespCbData *resp
                break;
 
        case TEL_SIM_EF_LP:
+       case TEL_SIM_EF_USIM_LI:
                if (sim_result == TEL_SIM_RESULT_SUCCESS) {
                        dbg("[SIM DATA] exist EFLP/LI(0x6F05)");
                        __imc_sim_read_binary(co, resp_cb_data);
@@ -1874,23 +1885,26 @@ static void __on_response_imc_sim_get_response(TcorePending *p,
        dbg("Exit");
 }
 
-static TelReturn __imc_sim_update_file(CoreObject *co, ImcRespCbData *resp_cb_data, int cmd, TelSimFileId ef,
-                                       int p1, int p2, int p3, char *encoded_data)
+static TelReturn __imc_sim_update_file(CoreObject *co,
+       ImcRespCbData *resp_cb_data, int cmd, TelSimFileId ef,
+       int p1, int p2, int p3, char *encoded_data)
 {
        char *cmd_str = NULL;
        TelReturn ret = TEL_RETURN_FAILURE;
-       ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
+       ImcSimMetaInfo *file_meta =
+               (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
 
        dbg("Entry File-id:[0x%02x]", file_meta->file_id);
 
-       cmd_str = g_strdup_printf("AT+CRSM=%d,%d,%d,%d,%d,\"%s\"", cmd, ef, p1, p2, p3, encoded_data);
-
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+CRSM:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                                               __on_response_imc_sim_update_file, resp_cb_data,
-                                               on_send_imc_request, NULL, 0, NULL, NULL);
+       cmd_str = g_strdup_printf("AT+CRSM=%d,%d,%d,%d,%d,\"%s\"",
+               cmd, ef, p1, p2, p3, encoded_data);
 
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+CRSM:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               __on_response_imc_sim_update_file, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Update SIM File");
 
        tcore_free(encoded_data);
@@ -1926,12 +1940,12 @@ static void __imc_sim_read_record(CoreObject *co, ImcRespCbData *resp_cb_data)
        at_cmd = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d",
                                IMC_SIM_ACCESS_READ_RECORD, file_meta->file_id, p1, p2, p3);
 
-       ret = tcore_at_prepare_and_send_request(co, at_cmd, "+CRSM:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                                               __on_response_imc_sim_read_data, resp_cb_data,
-                                               on_send_imc_request, NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               at_cmd, "+CRSM:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               __on_response_imc_sim_read_data, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Record");
 
        dbg("ret:[%d]", ret);
@@ -1968,12 +1982,12 @@ static void __imc_sim_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data)
        at_cmd = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d",
                                IMC_SIM_ACCESS_READ_BINARY, file_meta->file_id, p1, p2, p3);
 
-       ret = tcore_at_prepare_and_send_request(co, at_cmd, "+CRSM:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                                               __on_response_imc_sim_read_data, resp_cb_data,
-                                               on_send_imc_request, NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               at_cmd, "+CRSM:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               __on_response_imc_sim_read_data, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Data");
 
        dbg("ret:[%d]", ret);
@@ -1995,12 +2009,11 @@ static TelReturn __imc_sim_get_response(CoreObject *co, ImcRespCbData *resp_cb_d
                IMC_SIM_ACCESS_GET_RESPONSE, file_meta->file_id);
 
        ret = tcore_at_prepare_and_send_request(co,
-                               at_cmd, "+CRSM:",
-                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                               __on_response_imc_sim_get_response, resp_cb_data,
-                               on_send_imc_request, NULL,
-                               0, NULL, NULL);
+               at_cmd, "+CRSM:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               __on_response_imc_sim_get_response, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Info");
 
        g_free(at_cmd);
@@ -2221,16 +2234,14 @@ static TelReturn __imc_sim_get_retry_count(CoreObject *co,
                }
        cmd_str = g_strdup_printf("AT+XPINCNT=%d", lock_type);
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, NULL,
-                                       TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                       TCORE_PENDING_PRIORITY_DEFAULT,
-                                       NULL,
-                                       __on_response_imc_sim_get_retry_count,
-                                       resp_cb_data,
-                                       on_send_imc_request,
-                                       NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, NULL,
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               __on_response_imc_sim_get_retry_count, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get Retry Count");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3189,7 +3200,6 @@ static TelReturn imc_sim_get_language (CoreObject *co,
        dbg("Entry");
 
        IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_LP, ret);
-
        return ret;
 }
 
@@ -3200,8 +3210,6 @@ static TelReturn imc_sim_set_language (CoreObject *co,
        ImcSimMetaInfo file_meta = {0, };
        TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
        ImcRespCbData *resp_cb_data = NULL;
-       char *tmp = NULL;
-       int tmp_len = 0;
        char *encoded_data = NULL;
        int encoded_data_len = 0;
        int p1 = 0;
@@ -3219,34 +3227,41 @@ static TelReturn imc_sim_set_language (CoreObject *co,
 
        if (TEL_SIM_CARD_TYPE_GSM == card_type) {
                dbg("2G");
-               tcore_sim_encode_lp(language, &tmp, &tmp_len);
+
+               tcore_sim_encode_lp(language, &encoded_data, &encoded_data_len);
        } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
+               gchar *tmp;
                dbg("3G");
-               tcore_sim_encode_li(language, &tmp, &tmp_len);
+
+               if (tcore_sim_encode_li(language, &tmp, &encoded_data_len)) {
+                       encoded_data = g_strdup_printf("%02x%02x", tmp[0], tmp[1]);
+                       g_free(tmp);
+               }
+               else {
+                       err("Failed to encode Language [%d]", language);
+                       return TEL_RETURN_FAILURE;
+               }
        } else {
                err("Invalid card_type:[%d]", card_type);
                return TEL_RETURN_OPERATION_NOT_SUPPORTED;
        }
-       if (!tmp_len) {
+
+       if (!encoded_data_len) {
                err("Failed to encode Language [%d]", language);
                return TEL_RETURN_FAILURE;
        }
-       dbg("Encoded Language [%s]", tmp);
-
-       encoded_data_len = 2 * tmp_len;
-       encoded_data = (char *)tcore_malloc0(encoded_data_len + 1);
-       tcore_util_byte_to_hex(tmp, encoded_data, tmp_len);
-       tcore_free(tmp);
+       dbg("Encoded Language [%s] len[%d]", encoded_data, encoded_data_len);
 
        p1 = 0;
        p2 = 0;
        p3 = encoded_data_len;
-       dbg("encoded_data - [%s], encoded_data_len - %d", encoded_data, encoded_data_len);
 
-       resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo));
+       resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
+               &file_meta, sizeof(ImcSimMetaInfo));
 
-       return __imc_sim_update_file(co, resp_cb_data, IMC_SIM_ACCESS_UPDATE_BINARY,
-                                       TEL_SIM_EF_LP, p1, p2, p3, encoded_data);
+       return __imc_sim_update_file(co, resp_cb_data,
+               IMC_SIM_ACCESS_UPDATE_BINARY, TEL_SIM_EF_LP,
+               p1, p2, p3, encoded_data);
 }
 
 static TelReturn imc_sim_get_callforwarding_info (CoreObject *co,
@@ -3473,13 +3488,14 @@ static TelReturn imc_sim_req_authentication (CoreObject *co,
 
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data, (void *)&request->auth_type, sizeof(TelSimAuthenticationType));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+XAUTH:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                                               on_response_imc_sim_req_authentication, resp_cb_data,
-                                               on_send_imc_request, NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+XAUTH:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_req_authentication, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim request authentication");
+
 EXIT:
        g_free(cmd_str);
        tcore_free(convert_rand);
@@ -3534,16 +3550,14 @@ static TelReturn imc_sim_verify_pins(CoreObject *co, const TelSimSecPinPw *reque
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
                        &sec_op, sizeof(sec_op));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, NULL,
-                                               TCORE_AT_COMMAND_TYPE_NO_RESULT,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_verify_pins,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, NULL,
+               TCORE_AT_COMMAND_TYPE_NO_RESULT,
+               NULL,
+               on_response_imc_sim_verify_pins, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Verify Pins");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3574,16 +3588,14 @@ static TelReturn imc_sim_verify_puks(CoreObject *co, const TelSimSecPukPw *reque
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
                        &sec_op, sizeof(sec_op));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, NULL,
-                                               TCORE_AT_COMMAND_TYPE_NO_RESULT,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_verify_puks,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, NULL,
+               TCORE_AT_COMMAND_TYPE_NO_RESULT,
+               NULL,
+               on_response_imc_sim_verify_puks, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Verify Puks");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3637,16 +3649,14 @@ static TelReturn imc_sim_change_pins(CoreObject *co, const TelSimSecChangePinPw
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
                        &sec_op, sizeof(sec_op));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, NULL,
-                                               TCORE_AT_COMMAND_TYPE_NO_RESULT,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_change_pins,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, NULL,
+               TCORE_AT_COMMAND_TYPE_NO_RESULT,
+               NULL,
+               on_response_imc_sim_change_pins, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Change Pins");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3702,16 +3712,14 @@ static TelReturn imc_sim_disable_facility(CoreObject *co, const TelSimFacilityPw
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
                        &sec_op, sizeof(sec_op));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+CLCK:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_disable_facility,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+CLCK:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_disable_facility, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Disable Facility");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3739,16 +3747,14 @@ static TelReturn imc_sim_enable_facility(CoreObject *co, const TelSimFacilityPw
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
                        &sec_op, sizeof(sec_op));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+CLCK:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_enable_facility,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+CLCK:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_enable_facility, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Disable Facility");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3775,16 +3781,14 @@ static TelReturn imc_sim_get_facility(CoreObject *co, TelSimLockType lock_type,
        resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
                                &sec_op, sizeof(sec_op));
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+CLCK:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_get_facility,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+CLCK:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_get_facility, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Get Facility");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3836,16 +3840,14 @@ static TelReturn imc_sim_get_lock_info(CoreObject *co, TelSimLockType lock_type,
 
        cmd_str = g_strdup_printf("AT+XPINCNT=%d", lockType);
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+XPINCNT:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT,
-                                               NULL,
-                                               on_response_imc_sim_get_lock_info,
-                                               resp_cb_data,
-                                               on_send_imc_request,
-                                               NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+XPINCNT:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_get_lock_info, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Get Lock Info");
+
        g_free(cmd_str);
        return ret;
 }
@@ -3866,12 +3868,12 @@ static TelReturn imc_sim_req_apdu (CoreObject *co, const TelSimApdu *request, Tc
 
        cmd_str = g_strdup_printf("AT+CSIM=%d,\"%s\"", strlen((const char *)apdu), apdu);
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+CSIM:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                                               on_response_imc_sim_req_apdu, resp_cb_data,
-                                               on_send_imc_request, NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+CSIM:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_req_apdu, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Request APDU");
 
        g_free(cmd_str);
@@ -3893,12 +3895,12 @@ static TelReturn imc_sim_req_atr (CoreObject *co, TcoreObjectResponseCallback cb
 
        cmd_str = g_strdup_printf("AT+XGATR");
 
-       ret = tcore_at_prepare_and_send_request(co, cmd_str, "+XGATR:",
-                                               TCORE_AT_COMMAND_TYPE_SINGLELINE,
-                                               TCORE_PENDING_PRIORITY_DEFAULT, NULL,
-                                               on_response_imc_sim_req_atr, resp_cb_data,
-                                               on_send_imc_request, NULL, 0, NULL, NULL);
-
+       ret = tcore_at_prepare_and_send_request(co,
+               cmd_str, "+XGATR:",
+               TCORE_AT_COMMAND_TYPE_SINGLELINE,
+               NULL,
+               on_response_imc_sim_req_atr, resp_cb_data,
+               on_send_imc_request, NULL);
        IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Request ATR");
 
        g_free(cmd_str);