summaryrefslogtreecommitdiff
path: root/src/smsutil.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2018-12-21 15:48:46 -0600
committerDenis Kenzior <denkenz@gmail.com>2018-12-27 18:18:51 -0600
commit44415e754b4606043c9975cb56eb66e945067ed2 (patch)
treebaddd79603cea352d820499efc56043d0bf641a4 /src/smsutil.c
parent77271f33d29ee79255167275add471ec7fc96d23 (diff)
downloadofono-44415e754b4606043c9975cb56eb66e945067ed2.tar.gz
smsutil: Use l_utf8_from_utf16 instead of g_convert
Diffstat (limited to 'src/smsutil.c')
-rw-r--r--src/smsutil.c32
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);