mirror of git://git.sysmocom.de/ofono
Refactor: Text / Default text parsing
This commit is contained in:
parent
402c27f914
commit
f60e6ce134
|
@ -337,68 +337,25 @@ static gboolean parse_dataobj_text(struct comprehension_tlv_iter *iter,
|
||||||
void *user)
|
void *user)
|
||||||
{
|
{
|
||||||
char **text = user;
|
char **text = user;
|
||||||
unsigned int len;
|
unsigned int len = comprehension_tlv_iter_get_length(iter);
|
||||||
enum stk_data_object_type tag;
|
const unsigned char *data = comprehension_tlv_iter_get_data(iter);
|
||||||
|
char *utf8;
|
||||||
tag = comprehension_tlv_iter_get_tag(iter);
|
|
||||||
|
|
||||||
if (tag != STK_DATA_OBJECT_TYPE_TEXT &&
|
|
||||||
tag != STK_DATA_OBJECT_TYPE_DEFAULT_TEXT)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
len = comprehension_tlv_iter_get_length(iter);
|
|
||||||
|
|
||||||
/* DCS followed by some text, cannot be 1 */
|
/* DCS followed by some text, cannot be 1 */
|
||||||
if (len == 1)
|
if (len == 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (len > 0) {
|
if (len == 0) {
|
||||||
const unsigned char *data =
|
|
||||||
comprehension_tlv_iter_get_data(iter);
|
|
||||||
unsigned char dcs = data[0];
|
|
||||||
char *utf8;
|
|
||||||
|
|
||||||
switch (dcs) {
|
|
||||||
case 0x00:
|
|
||||||
{
|
|
||||||
long written;
|
|
||||||
unsigned long max_to_unpack = (len - 1) * 8 / 7;
|
|
||||||
unsigned char *unpacked = unpack_7bit(data + 1, len - 1,
|
|
||||||
0, FALSE,
|
|
||||||
max_to_unpack,
|
|
||||||
&written, 0);
|
|
||||||
if (unpacked == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
utf8 = convert_gsm_to_utf8(unpacked, written,
|
|
||||||
NULL, NULL, 0);
|
|
||||||
g_free(unpacked);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x04:
|
|
||||||
utf8 = convert_gsm_to_utf8(data + 1, len - 1,
|
|
||||||
NULL, NULL, 0);
|
|
||||||
break;
|
|
||||||
case 0x08:
|
|
||||||
utf8 = g_convert((const gchar *) data + 1, len - 1,
|
|
||||||
"UTF-8//TRANSLIT", "UCS-2BE",
|
|
||||||
NULL, NULL, NULL);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (utf8 == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
*text = utf8;
|
|
||||||
} else {
|
|
||||||
if (tag == STK_DATA_OBJECT_TYPE_DEFAULT_TEXT)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
*text = NULL;
|
*text = NULL;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
utf8 = decode_text(data[0], len - 1, data + 1);
|
||||||
|
|
||||||
|
if (utf8 == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
*text = utf8;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,6 +570,28 @@ static gboolean parse_dataobj_network_measurement_results(
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Defined in TS 102.223 Section 8.23 */
|
||||||
|
static gboolean parse_dataobj_default_text(struct comprehension_tlv_iter *iter,
|
||||||
|
void *user)
|
||||||
|
{
|
||||||
|
char **text = user;
|
||||||
|
unsigned int len = comprehension_tlv_iter_get_length(iter);
|
||||||
|
const unsigned char *data = comprehension_tlv_iter_get_data(iter);
|
||||||
|
char *utf8;
|
||||||
|
|
||||||
|
/* DCS followed by some text, cannot be 1 */
|
||||||
|
if (len <= 1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
utf8 = decode_text(data[0], len - 1, data + 1);
|
||||||
|
|
||||||
|
if (utf8 == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
*text = utf8;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Defined in TS 102.223 Section 8.31 */
|
/* Defined in TS 102.223 Section 8.31 */
|
||||||
static gboolean parse_dataobj_icon_id(struct comprehension_tlv_iter *iter,
|
static gboolean parse_dataobj_icon_id(struct comprehension_tlv_iter *iter,
|
||||||
void *user)
|
void *user)
|
||||||
|
@ -704,7 +683,6 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
|
||||||
case STK_DATA_OBJECT_TYPE_GSM_SMS_TPDU:
|
case STK_DATA_OBJECT_TYPE_GSM_SMS_TPDU:
|
||||||
return parse_dataobj_gsm_sms_tpdu;
|
return parse_dataobj_gsm_sms_tpdu;
|
||||||
case STK_DATA_OBJECT_TYPE_TEXT:
|
case STK_DATA_OBJECT_TYPE_TEXT:
|
||||||
case STK_DATA_OBJECT_TYPE_DEFAULT_TEXT:
|
|
||||||
return parse_dataobj_text;
|
return parse_dataobj_text;
|
||||||
case STK_DATA_OBJECT_TYPE_TONE:
|
case STK_DATA_OBJECT_TYPE_TONE:
|
||||||
return parse_dataobj_tone;
|
return parse_dataobj_tone;
|
||||||
|
@ -718,6 +696,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
|
||||||
return parse_dataobj_help_request;
|
return parse_dataobj_help_request;
|
||||||
case STK_DATA_OBJECT_TYPE_NETWORK_MEASUREMENT_RESULTS:
|
case STK_DATA_OBJECT_TYPE_NETWORK_MEASUREMENT_RESULTS:
|
||||||
return parse_dataobj_network_measurement_results;
|
return parse_dataobj_network_measurement_results;
|
||||||
|
case STK_DATA_OBJECT_TYPE_DEFAULT_TEXT:
|
||||||
|
return parse_dataobj_default_text;
|
||||||
case STK_DATA_OBJECT_TYPE_ICON_ID:
|
case STK_DATA_OBJECT_TYPE_ICON_ID:
|
||||||
return parse_dataobj_icon_id;
|
return parse_dataobj_icon_id;
|
||||||
case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
|
case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
|
||||||
|
|
Loading…
Reference in New Issue