diff options
author | Alexander Tarasikov <alexander.tarasikov@gmail.com> | 2012-07-13 15:12:15 +0400 |
---|---|---|
committer | Alexander Tarasikov <alexander.tarasikov@gmail.com> | 2012-07-13 15:12:15 +0400 |
commit | e88c9e5ac72a03c07b67f529248dceda1eefaa49 (patch) | |
tree | 6bca6cf949ceeecdfa6dae941f3610f822675a10 /ss.c | |
parent | 4d2d1523952fb9aefa3193dfd124ab06eef69cde (diff) | |
download | hardware_ril_samsung-ril-e88c9e5ac72a03c07b67f529248dceda1eefaa49.zip hardware_ril_samsung-ril-e88c9e5ac72a03c07b67f529248dceda1eefaa49.tar.gz hardware_ril_samsung-ril-e88c9e5ac72a03c07b67f529248dceda1eefaa49.tar.bz2 |
Add UCS2 USSD decoding
Diffstat (limited to 'ss.c')
-rw-r--r-- | ss.c | 20 |
1 files changed, 18 insertions, 2 deletions
@@ -191,13 +191,29 @@ void ipc_ss_ussd(struct ipc_message_info *info) case 0x0f: LOGD("USSD Rx encoding is GSM7"); - data_dec_len = gsm72ascii(info->data + sizeof(struct ipc_ss_ussd), &data_dec, info->length - sizeof(struct ipc_ss_ussd)); + data_dec_len = gsm72ascii(info->data + + sizeof(struct ipc_ss_ussd), &data_dec, info->length - sizeof(struct ipc_ss_ussd)); asprintf(&message[1], "%s", data_dec); message[1][data_dec_len] = '\0'; break; + case 0x48: + LOGD("USSD Rx encoding is UCS2", ussd->dcs); + + data_dec_len = info->length - sizeof(struct ipc_ss_ussd); + message[1] = malloc(data_dec_len * 4 + 1); + + int i, result = 0; + char *ucs2 = info->data + sizeof(struct ipc_ss_ussd); + for (i = 0; i < data_dec_len; i += 2) { + int c = (ucs2[i] << 8) | ucs2[1 + i]; + result += utf8_write(message[1], result, c); + } + message[1][result] = '\0'; + break; default: - LOGD("USSD Rx encoding is unknown, assuming ASCII"); + LOGD("USSD Rx encoding %x is unknown, assuming ASCII", + ussd->dcs); data_dec_len = info->length - sizeof(struct ipc_ss_ussd); asprintf(&message[1], "%s", info->data + sizeof(struct ipc_ss_ussd)); |