/* * This file is part of QMI-RIL. * * Copyright (C) 2017 Wolfgang Wiedmeyer * * QMI-RIL is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QMI-RIL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QMI-RIL. If not, see . */ #include #define LOG_TAG "RIL" #include #include static void get_software_version_ready(QmiClientDms *client, GAsyncResult *res, RIL_Token token) { const gchar *version; QmiMessageDmsGetSoftwareVersionOutput *output; GError *error = NULL; output = qmi_client_dms_get_software_version_finish(client, res, &error); if (!output) { RIL_LOGE("%s: error: operation failed: %s", __func__, error->message); goto error; } if (!qmi_message_dms_get_software_version_output_get_result (output, &error)) { RIL_LOGE("error: couldn't get software version: %s", error->message); goto error; } qmi_message_dms_get_software_version_output_get_version( output, &version, NULL); RIL_LOGD("Software version: %s", version); ril_request_complete(token, RIL_E_SUCCESS, (void *) version, sizeof(version)); goto complete; error: ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); complete: if (error) g_error_free(error); if (output) qmi_message_dms_get_software_version_output_unref(output); } int ril_request_baseband_version(void *data, size_t size, RIL_Token token) { struct ril_request *request; int rc; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_BASEBAND_VERSION, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; qmi_client_dms_get_software_version(ctx->DmsClient, NULL, 10, ctx->cancellable, (GAsyncReadyCallback)get_software_version_ready, token); return RIL_REQUEST_HANDLED; } static void uim_get_imsi_ready(QmiClientDms *client, GAsyncResult *res, RIL_Token token) { const gchar *str = NULL; QmiMessageDmsUimGetImsiOutput *output; GError *error = NULL; output = qmi_client_dms_uim_get_imsi_finish (client, res, &error); if (!output) { RIL_LOGE("%s: error: operation failed: %s", __func__, error->message); goto error; } if (!qmi_message_dms_uim_get_imsi_output_get_result (output, &error)) { RIL_LOGE("error: couldn't get IMSI: %s", error->message); goto error; } qmi_message_dms_uim_get_imsi_output_get_imsi(output, &str, NULL); RIL_LOGD("UIM IMSI retrieved: '%s'", str); ril_request_complete(token, RIL_E_SUCCESS, (void *) str, sizeof(str)); goto complete; error: ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); complete: if (error) g_error_free(error); if (output) qmi_message_dms_uim_get_imsi_output_unref(output); } int ril_request_get_imsi(void *data, size_t size, RIL_Token token) { struct ril_request *request; int rc; rc = ril_radio_state_check(RADIO_STATE_SIM_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_GET_IMSI, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; qmi_client_dms_uim_get_imsi(ctx->DmsClient, NULL, 10, ctx->cancellable, (GAsyncReadyCallback)uim_get_imsi_ready, token); return RIL_REQUEST_HANDLED; } static void get_ids_ready(QmiClientDms *client, GAsyncResult *res, RIL_Token token) { struct ril_request *request; const gchar *imei_buf; char *imei = NULL; char *imeisv = NULL; unsigned int imeisvlen; QmiMessageDmsGetIdsOutput *output; GError *error = NULL; output = qmi_client_dms_get_ids_finish (client, res, &error); if (!output) { RIL_LOGE("%s: error: operation failed: %s", __func__, error->message); goto error; } if (!qmi_message_dms_get_ids_output_get_result(output, &error)) { RIL_LOGE("error: couldn't get IDs: %s", error->message); goto error; } qmi_message_dms_get_ids_output_get_imei(output, &imei_buf, NULL); imei = (char*) imei_buf; // not yet a way to retrieve the IMEISV, so set 00 as SVN imeisvlen = strlen(imei) - 1 + 3; imeisv = (char*) malloc(imeisvlen); strcpy(imeisv, imei); imeisv = strcat(imeisv, "00"); imeisv[imeisvlen] = '\0'; RIL_LOGD("Device IDs retrieved:\n" "\tIMEI: '%s'\n" "\tIMEISV: '%s'", imei, imeisv); request = ril_request_find_request_status(RIL_REQUEST_GET_IMEI, RIL_REQUEST_HANDLED); if (request != NULL) ril_request_complete(request->token, RIL_E_SUCCESS, (void *) imei, sizeof(imei)); request = ril_request_find_request_status(RIL_REQUEST_GET_IMEISV, RIL_REQUEST_HANDLED); if (request != NULL) ril_request_complete(request->token, RIL_E_SUCCESS, (void *) imeisv, sizeof(imeisv)); goto complete; error: request = ril_request_find_request_status(RIL_REQUEST_GET_IMEI, RIL_REQUEST_HANDLED); if (request != NULL) ril_request_complete(request->token, RIL_E_GENERIC_FAILURE, NULL, 0); request = ril_request_find_request_status(RIL_REQUEST_GET_IMEISV, RIL_REQUEST_HANDLED); if (request != NULL) ril_request_complete(request->token, RIL_E_GENERIC_FAILURE, NULL, 0); complete: free(imei); free(imeisv); if (error) g_error_free(error); if (output) qmi_message_dms_get_ids_output_unref(output); } int ril_request_get_imei(void *data, size_t size, RIL_Token token) { struct ril_request *request; int rc; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_GET_IMEI, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; // The response to the IMEISV request will hold IMEI as well request = ril_request_find_request_status(RIL_REQUEST_GET_IMEISV, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_HANDLED; qmi_client_dms_get_ids(ctx->DmsClient, NULL, 10, ctx->cancellable, (GAsyncReadyCallback)get_ids_ready, token); return RIL_REQUEST_HANDLED; } int ril_request_get_imeisv(void *data, size_t size, RIL_Token token) { struct ril_request *request; int rc; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_GET_IMEISV, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; // The response to the IMEI request will hold IMEISV as well request = ril_request_find_request_status(RIL_REQUEST_GET_IMEI, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_HANDLED; qmi_client_dms_get_ids(ctx->DmsClient, NULL, 10, ctx->cancellable, (GAsyncReadyCallback)get_ids_ready, token); return RIL_REQUEST_HANDLED; } int ril_request_screen_state(void *data, size_t size, RIL_Token token) { int value; int rc; if (data == NULL || size < sizeof(int)) { ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); return RIL_REQUEST_COMPLETED; } rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; value = *((int *) data); if (value) ril_request_unsolicited(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED, NULL, 0); ril_request_complete(token, RIL_E_SUCCESS, NULL, 0); return RIL_REQUEST_COMPLETED; }