mirror of git://git.sysmocom.de/ofono
smsutil: Add a decoder for ussd pdus
This commit is contained in:
parent
31d29608e0
commit
179c14fe39
|
@ -3747,3 +3747,47 @@ gboolean cbs_topic_in_range(unsigned int topic, GSList *ranges)
|
||||||
return g_slist_find_custom(ranges, GUINT_TO_POINTER(topic),
|
return g_slist_find_custom(ranges, GUINT_TO_POINTER(topic),
|
||||||
cbs_topic_compare) != NULL;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -508,3 +508,5 @@ char *cbs_topic_ranges_to_string(GSList *ranges);
|
||||||
GSList *cbs_extract_topic_ranges(const char *ranges);
|
GSList *cbs_extract_topic_ranges(const char *ranges);
|
||||||
GSList *cbs_optimize_ranges(GSList *ranges);
|
GSList *cbs_optimize_ranges(GSList *ranges);
|
||||||
gboolean cbs_topic_in_range(unsigned int topic, GSList *ranges);
|
gboolean cbs_topic_in_range(unsigned int topic, GSList *ranges);
|
||||||
|
|
||||||
|
char *ussd_decode(int dcs, int len, const unsigned char *data);
|
||||||
|
|
Loading…
Reference in New Issue