/* * 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 void dms_event_report_indication_cb(QmiClientDms *client, QmiIndicationDmsEventReportOutput *output) { QmiDmsOperatingMode mode; qmi_indication_dms_event_report_output_get_operating_mode( output, &mode, NULL); RIL_LOGD("Got operating mode indication:\n" "\tMode: '%s'", qmi_dms_operating_mode_get_string(mode)); switch (mode) { case QMI_DMS_OPERATING_MODE_LOW_POWER: RIL_LOGD("Power state is low power mode"); ril_radio_state_update(RADIO_STATE_OFF); break; case QMI_DMS_OPERATING_MODE_SHUTTING_DOWN: RIL_LOGD("Power: device is in the process of shutting down"); ril_radio_state_update(RADIO_STATE_OFF); break; case QMI_DMS_OPERATING_MODE_ONLINE: RIL_LOGD("Power state is normal"); ril_radio_state_update(RADIO_STATE_SIM_NOT_READY); break; default: RIL_LOGE("Unknown power state"); } } static void set_operating_mode_ready(QmiClientDms *client, GAsyncResult *res, RIL_Token token) { QmiMessageDmsSetOperatingModeOutput *output; GError *error = NULL; output = qmi_client_dms_set_operating_mode_finish(client, res, &error); if (!output) { RIL_LOGE("%s: error: operation failed: %s", __func__, error->message); goto error; } if (!qmi_message_dms_set_operating_mode_output_get_result( output, &error)) { RIL_LOGE("error: couldn't set operating mode: %s", error->message); goto error; } RIL_LOGD("Operating mode set successfully"); ril_request_complete(token, RIL_E_SUCCESS, NULL, 0); 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_set_operating_mode_output_unref(output); } int ril_request_radio_power(void *data, size_t size, RIL_Token token) { struct ril_request *request; int power_state; QmiMessageDmsSetOperatingModeInput *input = NULL; QmiDmsOperatingMode mode; GError *error = NULL; int rc; if (data == NULL || size < sizeof(power_state)) goto error; request = ril_request_find_request_status(RIL_REQUEST_RADIO_POWER, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; power_state = *((int *)data); if (power_state > 0) { RIL_LOGD("Requesting normal power state"); mode = QMI_DMS_OPERATING_MODE_ONLINE; } else { RIL_LOGD("Requesting low power mode power state"); mode = QMI_DMS_OPERATING_MODE_LOW_POWER; } input = qmi_message_dms_set_operating_mode_input_new(); if (!qmi_message_dms_set_operating_mode_input_set_mode( input, mode, &error)) { RIL_LOGE("error: couldn't create input data bundle: '%s'", error->message); goto error; } qmi_client_dms_set_operating_mode(ctx->DmsClient, input, 10, ctx->cancellable, (GAsyncReadyCallback)set_operating_mode_ready, token); rc = RIL_REQUEST_HANDLED; goto complete; error: ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: if (error) g_error_free(error); if (input) qmi_message_dms_set_operating_mode_input_unref(input); return rc; }