diff options
author | Yang Gu <yang.gu@intel.com> | 2010-06-17 18:35:07 +0800 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-06-18 13:18:12 -0500 |
commit | 179c14fe3982c11e11a858c7d0f53459ab9463d9 (patch) | |
tree | 14699a36a1455faef498ba3eda7e46ecd2884a95 /src/smsutil.c | |
parent | 31d29608e0972a66b576e66ff34f7dc1f2dd356a (diff) | |
download | ofono-179c14fe3982c11e11a858c7d0f53459ab9463d9.tar.bz2 |
smsutil: Add a decoder for ussd pdus
Diffstat (limited to 'src/smsutil.c')
-rw-r--r-- | src/smsutil.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/smsutil.c b/src/smsutil.c index 95eca061..5fa4be5c 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -3747,3 +3747,47 @@ gboolean cbs_topic_in_range(unsigned int topic, GSList *ranges) return g_slist_find_custom(ranges, GUINT_TO_POINTER(topic), cbs_topic_compare) != NULL; } + +char *ussd_decode(int dcs, int len, const unsigned char *data) +{ + gboolean udhi; + enum sms_charset charset; + gboolean compressed; + gboolean iso639; + char *utf8; + + if (!cbs_dcs_decode(dcs, &udhi, NULL, &charset, + &compressed, NULL, &iso639)) + return NULL; + + if (udhi || compressed || iso639) + return NULL; + + switch (charset) { + case SMS_CHARSET_7BIT: + { + long written; + unsigned char *unpacked = unpack_7bit(data, len, 0, TRUE, 0, + &written, 0); + if (unpacked == NULL) + return NULL; + + utf8 = convert_gsm_to_utf8(unpacked, written, NULL, NULL, 0); + g_free(unpacked); + + break; + } + case SMS_CHARSET_8BIT: + utf8 = convert_gsm_to_utf8(data, len, NULL, NULL, 0); + break; + case SMS_CHARSET_UCS2: + utf8 = g_convert((const gchar *) data, len, + "UTF-8//TRANSLIT", "UCS-2BE", + NULL, NULL, NULL); + break; + default: + utf8 = NULL; + } + + return utf8; +} |