summaryrefslogtreecommitdiffstats
path: root/src/stkutil.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-03-30 10:20:12 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-03-30 10:21:57 -0500
commitf60e6ce1345d697f17cffb1242178d70a2ee2529 (patch)
treee6ab8a2d9fed550856e40b25d8617c70ffe5eb2d /src/stkutil.c
parent402c27f914ebad8d7ee36a16b9aa042e21b42310 (diff)
downloadofono-f60e6ce1345d697f17cffb1242178d70a2ee2529.tar.bz2
Refactor: Text / Default text parsing
Diffstat (limited to 'src/stkutil.c')
-rw-r--r--src/stkutil.c90
1 files changed, 35 insertions, 55 deletions
diff --git a/src/stkutil.c b/src/stkutil.c
index 710379fd..c737395e 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -337,68 +337,25 @@ static gboolean parse_dataobj_text(struct comprehension_tlv_iter *iter,
void *user)
{
char **text = user;
- unsigned int len;
- enum stk_data_object_type tag;
-
- 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);
+ 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;
- 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;
-
+ if (len == 0) {
*text = NULL;
+ return TRUE;
}
+ utf8 = decode_text(data[0], len - 1, data + 1);
+
+ if (utf8 == NULL)
+ return FALSE;
+
+ *text = utf8;
return TRUE;
}
@@ -613,6 +570,28 @@ static gboolean parse_dataobj_network_measurement_results(
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 */
static gboolean parse_dataobj_icon_id(struct comprehension_tlv_iter *iter,
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:
return parse_dataobj_gsm_sms_tpdu;
case STK_DATA_OBJECT_TYPE_TEXT:
- case STK_DATA_OBJECT_TYPE_DEFAULT_TEXT:
return parse_dataobj_text;
case STK_DATA_OBJECT_TYPE_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;
case STK_DATA_OBJECT_TYPE_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:
return parse_dataobj_icon_id;
case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE: