From: Alexander Tarasikov Date: Fri, 13 Jul 2012 11:12:15 +0000 (+0400) Subject: Add UCS2 USSD decoding X-Git-Url: http://git.legacy.paulk.fr/gitweb/?p=samsung-ril.git;a=commitdiff_plain;h=e88c9e5ac72a03c07b67f529248dceda1eefaa49 Add UCS2 USSD decoding --- diff --git a/ss.c b/ss.c index 44a16cc..1cfff44 100644 --- a/ss.c +++ b/ss.c @@ -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));