diff options
author | Denis Kenzior <denkenz@gmail.com> | 2018-12-21 15:48:46 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2018-12-27 18:18:51 -0600 |
commit | 44415e754b4606043c9975cb56eb66e945067ed2 (patch) | |
tree | baddd79603cea352d820499efc56043d0bf641a4 /src/smsutil.c | |
parent | 77271f33d29ee79255167275add471ec7fc96d23 (diff) | |
download | ofono-44415e754b4606043c9975cb56eb66e945067ed2.tar.gz |
smsutil: Use l_utf8_from_utf16 instead of g_convert
Diffstat (limited to 'src/smsutil.c')
-rw-r--r-- | src/smsutil.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/smsutil.c b/src/smsutil.c index 7ac8f872..23472e84 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -2219,7 +2219,8 @@ char *sms_decode_text(GSList *sms_list) const struct sms *sms; int guess_size = g_slist_length(sms_list); char *utf8; - GByteArray *utf16 = 0; + void *utf16 = NULL; + size_t utf16_size = 0; if (guess_size == 1) guess_size = 160; @@ -2303,7 +2304,7 @@ char *sms_decode_text(GSList *sms_list) * Header is odd, the maximum length of the whole TP-UD * field is 139 octets */ - gssize num_ucs2_chars = (udl_in_bytes - taken) >> 1; + size_t num_ucs2_chars = (udl_in_bytes - taken) >> 1; num_ucs2_chars = num_ucs2_chars << 1; /* @@ -2314,25 +2315,32 @@ char *sms_decode_text(GSList *sms_list) * character in the middle. So accumulate the * entire message before converting to UTF-8. */ - if (!utf16) - utf16 = g_byte_array_new(); - - g_byte_array_append(utf16, from, num_ucs2_chars); + utf16 = l_realloc(utf16, utf16_size + num_ucs2_chars); + memcpy(utf16 + utf16_size, from, num_ucs2_chars); + utf16_size += num_ucs2_chars; } } if (utf16) { - char *converted = g_convert_with_fallback((const gchar *) - utf16->data, utf16->len, - "UTF-8//TRANSLIT", "UTF-16BE", - NULL, NULL, NULL, NULL); + char *converted; + + /* Strings are in UTF16-BE, so convert if needed */ + if (L_CPU_TO_BE16(0x8000) != 0x8000) { + size_t i; + uint16_t *p = utf16; + + for (i = 0; i < utf16_size / 2; i++) + p[i] = __builtin_bswap16(p[i]); + } + + converted = l_utf8_from_utf16(utf16, utf16_size); if (converted) { g_string_append(str, converted); - g_free(converted); + l_free(converted); } - g_byte_array_free(utf16, TRUE); + l_free(utf16); } utf8 = g_string_free(str, FALSE); |