diff options
Diffstat (limited to 'misc.c')
-rw-r--r-- | misc.c | 289 |
1 files changed, 289 insertions, 0 deletions
@@ -0,0 +1,289 @@ +/* + * This file is part of QMI-RIL. + * + * Copyright (C) 2017 Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> + +#define LOG_TAG "RIL" +#include <utils/Log.h> + +#include <qmi-ril.h> + +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; +} |