void ril_request_delete_sms_on_sim(RIL_Token token, void *data, size_t size) { struct ipc_sms_del_msg_request_data sms_del_msg_request_data; int index = 0; if (data == NULL || size < sizeof(index)) goto error; if (ril_radio_state_complete(RADIO_STATE_OFF, token)) return; index = *((int *) data); if (index <= 0 || index > 0xffff) goto error; memset(&sms_del_msg_request_data, 0, sizeof(sms_del_msg_request_data)); sms_del_msg_request_data.unknown = 0x02; sms_del_msg_request_data.index = (short) index - 1; ipc_gen_phone_res_expect_to_abort(ril_request_get_id(token), IPC_SMS_DEL_MSG); ipc_fmt_send(IPC_SMS_DEL_MSG, IPC_TYPE_EXEC, (unsigned char *) &sms_del_msg_request_data, sizeof(sms_del_msg_request_data), ril_request_get_id(token)); return; error: ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); }
void ril_request_sms_acknowledge(RIL_Token t, void *data, size_t length) { struct ipc_sms_deliver_report_request report_msg; int success, fail_cause; if (data == NULL || length < 2 * sizeof(int)) goto error; if (ril_data.state.sms_incoming_msg_tpid == ril_data.state.ril_sms_tpid) { ril_data.state.ril_sms_tpid = 0; ril_request_complete(t, RIL_E_SUCCESS, NULL, 0); ipc_sms_incoming_msg_next(); return; } if (ril_radio_state_complete(RADIO_STATE_OFF, t)) return; success = ((int *) data)[0]; fail_cause = ((int *) data)[1]; if (ril_data.state.sms_incoming_msg_tpid == 0) { RIL_LOGE("There is no SMS message to ACK!"); goto error; } report_msg.type = IPC_SMS_TYPE_STATUS_REPORT; report_msg.error = ril2ipc_sms_ack_error(success, fail_cause); report_msg.msg_tpid = ril_data.state.sms_incoming_msg_tpid; report_msg.unk = 0; ipc_gen_phone_res_expect_to_abort(ril_request_get_id(t), IPC_SMS_DELIVER_REPORT); ipc_fmt_send(IPC_SMS_DELIVER_REPORT, IPC_TYPE_EXEC, (void *) &report_msg, sizeof(report_msg), ril_request_get_id(t)); ipc_sms_incoming_msg_next(); return; error: ril_request_complete(t, RIL_E_GENERIC_FAILURE, NULL, 0); ipc_sms_incoming_msg_next(); }
void ipc_gprs_pdp_context_complete(struct ipc_message_info *info) { struct ipc_gen_phone_res *phone_res = (struct ipc_gen_phone_res *) info->data; int rc; int aseq; rc = ipc_gen_phone_res_check(phone_res); if(rc < 0) { ril_request_complete(reqGetToken(info->aseq), RIL_E_GENERIC_FAILURE, NULL, 0); LOGE("There was an error, aborting PDP context complete"); return; } /* We need to get a clean new aseq here */ aseq = ril_request_reg_id(reqGetToken(info->aseq)); /* activate the connection */ ipc_send(IPC_GPRS_PDP_CONTEXT, IPC_TYPE_SET, (void *) &(ril_state.gprs_context), sizeof(struct ipc_gprs_pdp_context), aseq); ipc_gen_phone_res_expect_to_abort(aseq, IPC_GPRS_PDP_CONTEXT); // TODO: if this aborts, last fail cause will be: PDP_FAIL_ERROR_UNSPECIFIED }
void ril_request_write_sms_to_sim(RIL_Token token, void *data, size_t size) { struct ipc_sms_save_msg_request_data *sms_save_msg_request_data; RIL_SMS_WriteArgs *args; void *buffer = NULL; size_t length; size_t data_length; size_t pdu_length = 0; size_t pdu_hex_length = 0; size_t smsc_length = 0; size_t smsc_hex_length = 0; unsigned char *p; if (data == NULL || size < sizeof(RIL_SMS_WriteArgs)) goto error; if (ril_radio_state_complete(RADIO_STATE_OFF, token)) return; args = (RIL_SMS_WriteArgs *) data; if (args->pdu != NULL) { pdu_length = strlen(args->pdu); pdu_hex_length = pdu_length % 2 == 0 ? pdu_length / 2 : (pdu_length ^ 1) / 2; } if (args->smsc != NULL) { smsc_length = strlen(args->smsc); smsc_hex_length = smsc_length % 2 == 0 ? smsc_length / 2 : (smsc_length ^ 1) / 2; } data_length = pdu_hex_length + smsc_hex_length; if (data_length == 0 || data_length > 0xff) goto error; length = sizeof(struct ipc_sms_save_msg_request_data) + data_length; buffer = malloc(length); sms_save_msg_request_data = (struct ipc_sms_save_msg_request_data *) buffer; memset(sms_save_msg_request_data, 0, sizeof(struct ipc_sms_save_msg_request_data)); sms_save_msg_request_data->unknown = 0x02; sms_save_msg_request_data->index = 12 - 1; sms_save_msg_request_data->status = ril2ipc_sms_save_msg_status(args->status); sms_save_msg_request_data->length = (unsigned char) (data_length & 0xff); p = (unsigned char *) buffer + sizeof(struct ipc_sms_save_msg_request_data); if (args->smsc != NULL && smsc_length > 0) { hex2bin(args->smsc, smsc_length, p); p += smsc_hex_length; } if (args->pdu != NULL && pdu_length > 0) { hex2bin(args->pdu, pdu_length, p); p += pdu_hex_length; } ipc_gen_phone_res_expect_to_abort(ril_request_get_id(token), IPC_SMS_SAVE_MSG); ipc_fmt_send(IPC_SMS_SAVE_MSG, IPC_TYPE_EXEC, buffer, length, ril_request_get_id(token)); goto complete; error: ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); complete: if (buffer != NULL) free(buffer); }