Skip to contentSkip to conversation

Add parser for card reader status objects

PATCH In review Yang Gu 2 participants 16 messages Apr 2, 2010

lore
Share & tools
lore

Yang Gu

author
#0 lore raw

PATCH 1/15 Add parser for card reader status objects

---
 src/stkutil.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
src/stkutil.c +11 -0
index b61ff39..5b258ab 100644
@@ -762,6 +762,15 @@ static gboolean parse_dataobj_item_icon_id_list(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.33 */
+static gboolean parse_dataobj_card_reader_status(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	unsigned char *byte = user;
+
+	return parse_dataobj_common_byte(iter, byte);
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -866,6 +875,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_icon_id;
 	case STK_DATA_OBJECT_TYPE_ITEM_ICON_ID_LIST:
 		return parse_dataobj_item_icon_id_list;
+	case STK_DATA_OBJECT_TYPE_CARD_READER_STATUS:
+		return parse_dataobj_card_reader_status;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
Signature · 1 line
1.6.3.3
author
#1 lore raw

PATCH 2/15 Add parser for card atr objects

---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    9 +++++++++
 2 files changed, 29 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index 5b258ab..a96132c 100644
@@ -771,6 +771,24 @@ static gboolean parse_dataobj_card_reader_status(
 	return parse_dataobj_common_byte(iter, byte);
 }
 
+/* Defined in TS 102.223 Section 8.34 */
+static gboolean parse_dataobj_card_atr(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_card_atr *ca = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if ((len < 1) || (len > sizeof(ca->atr)))
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	ca->len = len;
+	memcpy(ca->atr, data, len);
+
+	return TRUE;
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -877,6 +895,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_item_icon_id_list;
 	case STK_DATA_OBJECT_TYPE_CARD_READER_STATUS:
 		return parse_dataobj_card_reader_status;
+	case STK_DATA_OBJECT_TYPE_CARD_ATR:
+		return parse_dataobj_card_atr;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
src/stkutil.h +9 -0
index 4ff8c4b..8047ed1 100644
@@ -460,6 +460,15 @@ struct stk_item_icon_id_list {
 };
 
 /*
+ * According to 102.223 Section 8.34 the length of CTLV is 1 byte. This means
+ * that the maximum size is 127 according to the rules of CTLVs.
+ */
+struct stk_card_atr {
+	unsigned char atr[127];
+	unsigned int len;
+};
+
+/*
  * According to 102.223 Section 8.72 the length of text attribute CTLV is 1
  * byte.  This means that the maximum size is 127 according to the rules
  * of CTLVs.  Empty attribute options will have len of 0.
Signature · 1 line
1.6.3.3
author
#2 lore raw

PATCH 3/15 Add parser for c-apdu objects

---
 src/stkutil.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 src/stkutil.h |   15 +++++++++++++++
 2 files changed, 59 insertions(+), 0 deletions(-)
src/stkutil.c +44 -0
index a96132c..99e6622 100644
@@ -789,6 +789,48 @@ static gboolean parse_dataobj_card_atr(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.35 */
+static gboolean parse_dataobj_c_apdu(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_c_apdu *ca = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if ((len < 4) || (len > 241))
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	ca->cla = data[0];
+	ca->ins = data[1];
+	ca->p1 = data[2];
+	ca->p2 = data[3];
+
+	/* lc is 0 has the same meaning as lc is absent. But le is 0 means
+	 * the maximum number of bytes expected in the response data field
+	 * is 256. So we need to rely on has_le to know if it presents.
+	 */
+	if (len > 5) {
+		ca->lc = data[4];
+		if (ca->lc > sizeof(ca->data))
+			return FALSE;
+
+		memcpy(ca->data, data+5, ca->lc);
+
+		if ((len - ca->lc) == 6) {
+			ca->le = data[len-1];
+			ca->has_le = TRUE;
+		} else if (len - ca->lc != 5)
+			return FALSE;
+	} else if (len == 5) {
+		ca->lc = 0;
+		ca->le = data[4];
+		ca->has_le = TRUE;
+	}
+
+	return TRUE;
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -897,6 +939,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_card_reader_status;
 	case STK_DATA_OBJECT_TYPE_CARD_ATR:
 		return parse_dataobj_card_atr;
+	case STK_DATA_OBJECT_TYPE_C_APDU:
+		return parse_dataobj_c_apdu;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
src/stkutil.h +15 -0
index 8047ed1..c6bd4e1 100644
@@ -469,6 +469,21 @@ struct stk_card_atr {
 };
 
 /*
+ * Defined in TS 102.223 Section 8.35. According to it, the maximum size
+ * of data is 236.
+ */
+struct stk_c_apdu {
+	unsigned char cla;
+	unsigned char ins;
+	unsigned char p1;
+	unsigned char p2;
+	unsigned char lc;
+	unsigned char data[236];
+	ofono_bool_t has_le;
+	unsigned char le;
+};
+
+/*
  * According to 102.223 Section 8.72 the length of text attribute CTLV is 1
  * byte.  This means that the maximum size is 127 according to the rules
  * of CTLVs.  Empty attribute options will have len of 0.
Signature · 1 line
1.6.3.3
author
#3 lore raw

PATCH 4/15 Add parser for r-apdu objects

---
 src/stkutil.c |   26 ++++++++++++++++++++++++++
 src/stkutil.h |   10 ++++++++++
 2 files changed, 36 insertions(+), 0 deletions(-)
src/stkutil.c +26 -0
index 99e6622..2efa5a4 100644
@@ -831,6 +831,30 @@ static gboolean parse_dataobj_c_apdu(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.36 */
+static gboolean parse_dataobj_r_apdu(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_r_apdu *ra = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if ((len < 2) || (len > 239))
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	ra->sw1 = data[len-2];
+	ra->sw2 = data[len-1];
+
+	if (len > 2) {
+		ra->len = len - 2;
+		memcpy(ra->data, data, ra->len);
+	} else
+		ra->len = 0;
+
+	return TRUE;
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -941,6 +965,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_card_atr;
 	case STK_DATA_OBJECT_TYPE_C_APDU:
 		return parse_dataobj_c_apdu;
+	case STK_DATA_OBJECT_TYPE_R_APDU:
+		return parse_dataobj_r_apdu;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
src/stkutil.h +10 -0
index c6bd4e1..1cbf407 100644
@@ -483,6 +483,16 @@ struct stk_c_apdu {
 	unsigned char le;
 };
 
+/* Defined in TS 102.223 Section 8.36. According to it, the maximum size
+ * of data is 237.
+ */
+struct stk_r_apdu {
+	unsigned char sw1;
+	unsigned char sw2;
+	unsigned char data[237];
+	unsigned int len;
+};
+
 /*
  * According to 102.223 Section 8.72 the length of text attribute CTLV is 1
  * byte.  This means that the maximum size is 127 according to the rules
Signature · 1 line
1.6.3.3
author
#4 lore raw

PATCH 5/15 Add parser for timer identifier objects

---
 src/stkutil.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
src/stkutil.c +11 -0
index 2efa5a4..d999846 100644
@@ -855,6 +855,15 @@ static gboolean parse_dataobj_r_apdu(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.37 */
+static gboolean parse_dataobj_timer_id(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	unsigned char *byte = user;
+
+	return parse_dataobj_common_byte(iter, byte);
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -967,6 +976,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_c_apdu;
 	case STK_DATA_OBJECT_TYPE_R_APDU:
 		return parse_dataobj_r_apdu;
+	case STK_DATA_OBJECT_TYPE_TIMER_ID:
+		return parse_dataobj_timer_id;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
Signature · 1 line
1.6.3.3
author
#5 lore raw

PATCH 6/15 Refactor function decode_scts to use semi octet decoder

---
 src/smsutil.c |   17 +++++++++++------
 src/smsutil.h |    2 ++
 2 files changed, 13 insertions(+), 6 deletions(-)
src/smsutil.c +11 -6
index baa7ebe..64cd6fb 100644
@@ -372,6 +372,11 @@ static gboolean encode_scts(const struct sms_scts *in, unsigned char *pdu,
 	return TRUE;
 }
 
+guint8 sms_decode_semi_octet(guint8 in)
+{
+	return (in & 0x0f) * 10 + (in >> 4);
+}
+
 static gboolean decode_scts(const unsigned char *pdu, int len,
 				int *offset, struct sms_scts *out)
 {
@@ -381,22 +386,22 @@ static gboolean decode_scts(const unsigned char *pdu, int len,
 		return FALSE;
 
 	next_octet(pdu, len, offset, &oct);
-	out->year = (oct & 0x0f) * 10 + ((oct & 0xf0) >> 4);
+	out->year = sms_decode_semi_octet(oct);
 
 	next_octet(pdu, len, offset, &oct);
-	out->month = (oct & 0x0f) * 10 + ((oct & 0xf0) >> 4);
+	out->month = sms_decode_semi_octet(oct);
 
 	next_octet(pdu, len, offset, &oct);
-	out->day = (oct & 0x0f) * 10 + ((oct & 0xf0) >> 4);
+	out->day = sms_decode_semi_octet(oct);
 
 	next_octet(pdu, len, offset, &oct);
-	out->hour = (oct & 0x0f) * 10 + ((oct & 0xf0) >> 4);
+	out->hour = sms_decode_semi_octet(oct);
 
 	next_octet(pdu, len, offset, &oct);
-	out->minute = (oct & 0x0f) * 10 + ((oct & 0xf0) >> 4);
+	out->minute = sms_decode_semi_octet(oct);
 
 	next_octet(pdu, len, offset, &oct);
-	out->second = (oct & 0x0f) * 10 + ((oct & 0xf0) >> 4);
+	out->second = sms_decode_semi_octet(oct);
 
 	next_octet(pdu, len, offset, &oct);
 
src/smsutil.h +2 -0
index c28a6da..fd80c8f 100644
@@ -422,6 +422,8 @@ gboolean sms_decode_address_field(const unsigned char *pdu, int len,
 gboolean sms_encode_address_field(const struct sms_address *in, gboolean sc,
 					unsigned char *pdu, int *offset);
 
+guint8 sms_decode_semi_octet(guint8 in);
+
 int sms_udl_in_bytes(guint8 ud_len, guint8 dcs);
 
 time_t sms_scts_to_time(const struct sms_scts *scts, struct tm *remote);
Signature · 1 line
1.6.3.3
author
#6 lore raw

PATCH 7/15 Add parser for timer value objects

---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    7 +++++++
 2 files changed, 27 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index d999846..5fea3a5 100644
@@ -864,6 +864,24 @@ static gboolean parse_dataobj_timer_id(
 	return parse_dataobj_common_byte(iter, byte);
 }
 
+/* Defined in TS 102.223 Section 8.38 */
+static gboolean parse_dataobj_timer_value(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_timer_value *tv = user;
+	const unsigned char *data;
+
+	if (comprehension_tlv_iter_get_length(iter) != 3)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	tv->hour = sms_decode_semi_octet(data[0]);
+	tv->minute = sms_decode_semi_octet(data[1]);
+	tv->second = sms_decode_semi_octet(data[2]);
+
+	return TRUE;
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -978,6 +996,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_r_apdu;
 	case STK_DATA_OBJECT_TYPE_TIMER_ID:
 		return parse_dataobj_timer_id;
+	case STK_DATA_OBJECT_TYPE_TIMER_VALUE:
+		return parse_dataobj_timer_value;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
src/stkutil.h +7 -0
index 1cbf407..0d22bea 100644
@@ -493,6 +493,13 @@ struct stk_r_apdu {
 	unsigned int len;
 };
 
+/* Defined in TS 102.223 Section 8.38 */
+struct stk_timer_value {
+	unsigned char hour;
+	unsigned char minute;
+	unsigned char second;
+};
+
 /*
  * According to 102.223 Section 8.72 the length of text attribute CTLV is 1
  * byte.  This means that the maximum size is 127 according to the rules
Signature · 1 line
1.6.3.3
author
#7 lore raw

PATCH 8/15 Make function decode_scts public

---
 src/smsutil.c |   12 ++++++------
 src/smsutil.h |    3 +++
 2 files changed, 9 insertions(+), 6 deletions(-)
src/smsutil.c +6 -6
index 64cd6fb..17e0e0e 100644
@@ -377,7 +377,7 @@ guint8 sms_decode_semi_octet(guint8 in)
 	return (in & 0x0f) * 10 + (in >> 4);
 }
 
-static gboolean decode_scts(const unsigned char *pdu, int len,
+gboolean sms_decode_scts(const unsigned char *pdu, int len,
 				int *offset, struct sms_scts *out)
 {
 	unsigned char oct = 0;
@@ -433,7 +433,7 @@ static gboolean decode_validity_period(const unsigned char *pdu, int len,
 
 		return TRUE;
 	case SMS_VALIDITY_PERIOD_FORMAT_ABSOLUTE:
-		if (!decode_scts(pdu, len, offset, &vp->absolute))
+		if (!sms_decode_scts(pdu, len, offset, &vp->absolute))
 			return FALSE;
 
 		return TRUE;
@@ -718,7 +718,7 @@ static gboolean decode_deliver(const unsigned char *pdu, int len,
 	if (!next_octet(pdu, len, &offset, &out->deliver.dcs))
 		return FALSE;
 
-	if (!decode_scts(pdu, len, &offset, &out->deliver.scts))
+	if (!sms_decode_scts(pdu, len, &offset, &out->deliver.scts))
 		return FALSE;
 
 	if (!next_octet(pdu, len, &offset, &out->deliver.udl))
@@ -849,7 +849,7 @@ static gboolean decode_submit_report(const unsigned char *pdu, int len,
 
 	pi = octet & 0x07;
 
-	if (!decode_scts(pdu, len, &offset, scts))
+	if (!sms_decode_scts(pdu, len, &offset, scts))
 		return FALSE;
 
 	if (pi & 0x01) {
@@ -976,10 +976,10 @@ static gboolean decode_status_report(const unsigned char *pdu, int len,
 					&out->status_report.raddr))
 		return FALSE;
 
-	if (!decode_scts(pdu, len, &offset, &out->status_report.scts))
+	if (!sms_decode_scts(pdu, len, &offset, &out->status_report.scts))
 		return FALSE;
 
-	if (!decode_scts(pdu, len, &offset, &out->status_report.dt))
+	if (!sms_decode_scts(pdu, len, &offset, &out->status_report.dt))
 		return FALSE;
 
 	if (!next_octet(pdu, len, &offset, &octet))
src/smsutil.h +3 -0
index fd80c8f..469a49e 100644
@@ -424,6 +424,9 @@ gboolean sms_encode_address_field(const struct sms_address *in, gboolean sc,
 
 guint8 sms_decode_semi_octet(guint8 in);
 
+gboolean sms_decode_scts(const unsigned char *pdu, int len,
+				int *offset, struct sms_scts *out);
+
 int sms_udl_in_bytes(guint8 ud_len, guint8 dcs);
 
 time_t sms_scts_to_time(const struct sms_scts *scts, struct tm *remote);
Signature · 1 line
1.6.3.3
author
#8 lore raw

PATCH 9/15 Add parser for date-time and time zone objects

---
 src/stkutil.c |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)
src/stkutil.c +19 -0
index 5fea3a5..1846092 100644
@@ -882,6 +882,23 @@ static gboolean parse_dataobj_timer_value(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.39 */
+static gboolean parse_dataobj_datetime_timezone(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct sms_scts *scts = user;
+	const unsigned char *data;
+	int offset = 0;
+
+	if (comprehension_tlv_iter_get_length(iter) != 7)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	sms_decode_scts(data, 7, &offset, scts);
+
+	return TRUE;
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -998,6 +1015,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_timer_id;
 	case STK_DATA_OBJECT_TYPE_TIMER_VALUE:
 		return parse_dataobj_timer_value;
+	case STK_DATA_OBJECT_TYPE_DATETIME_TIMEZONE:
+		return parse_dataobj_datetime_timezone;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
Signature · 1 line
1.6.3.3
author
#9 lore raw

PATCH 10/15 Add parser for at command objects

---
 src/stkutil.c |   32 ++++++++++++++++++++++++++++++++
 1 files changed, 32 insertions(+), 0 deletions(-)
src/stkutil.c +32 -0
index 1846092..c7154c1 100644
@@ -112,6 +112,28 @@ static gboolean parse_dataobj_common_byte(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* For data object that only has text terminated by '\0' */
+static gboolean parse_dataobj_common_text(struct comprehension_tlv_iter *iter,
+					unsigned char **text)
+{
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if (len < 1)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	*text = g_try_malloc(len + 1);
+	if (*text == NULL)
+		return FALSE;
+
+	memcpy(*text, data, len);
+	(*text)[len] = '\0';
+
+	return TRUE;
+}
+
 /* For data object that only has a byte array with undetermined length */
 static gboolean parse_dataobj_common_byte_array(
 			struct comprehension_tlv_iter *iter,
@@ -899,6 +921,14 @@ static gboolean parse_dataobj_datetime_timezone(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.40 */
+static gboolean parse_dataobj_at_command(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	unsigned char **command = user;
+	return parse_dataobj_common_text(iter, command);
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1017,6 +1047,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_timer_value;
 	case STK_DATA_OBJECT_TYPE_DATETIME_TIMEZONE:
 		return parse_dataobj_datetime_timezone;
+	case STK_DATA_OBJECT_TYPE_AT_COMMAND:
+		return parse_dataobj_at_command;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
Signature · 1 line
1.6.3.3
author
#10 lore raw

PATCH 11/15 Add parser for at response objects

---
 src/stkutil.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index c7154c1..f6da42b 100644
@@ -929,6 +929,14 @@ static gboolean parse_dataobj_at_command(
 	return parse_dataobj_common_text(iter, command);
 }
 
+/* Defined in TS 102.223 Section 8.41 */
+static gboolean parse_dataobj_at_response(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	unsigned char **response = user;
+	return parse_dataobj_common_text(iter, response);
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1049,6 +1057,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_datetime_timezone;
 	case STK_DATA_OBJECT_TYPE_AT_COMMAND:
 		return parse_dataobj_at_command;
+	case STK_DATA_OBJECT_TYPE_AT_RESPONSE:
+		return parse_dataobj_at_response;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
Signature · 1 line
1.6.3.3
author
#11 lore raw

PATCH 12/15 Add parser for bc repeat indicator objects

---
 src/stkutil.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index f6da42b..f205ce6 100644
@@ -937,6 +937,14 @@ static gboolean parse_dataobj_at_response(
 	return parse_dataobj_common_text(iter, response);
 }
 
+/* Defined in TS 102.223 Section 8.42 */
+static gboolean parse_dataobj_bc_repeat_indicator(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	unsigned char *byte = user;
+	return parse_dataobj_common_byte(iter, byte);
+}
+
 /* Defined in 102.223 Section 8.43 */
 static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1059,6 +1067,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_at_command;
 	case STK_DATA_OBJECT_TYPE_AT_RESPONSE:
 		return parse_dataobj_at_response;
+	case STK_DATA_OBJECT_TYPE_BC_REPEAT_INDICATOR:
+		return parse_dataobj_bc_repeat_indicator;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
Signature · 1 line
1.6.3.3
author
#12 lore raw

PATCH 13/15 Add parser for dtmf string objects

---
 src/stkutil.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
src/stkutil.c +24 -0
index f205ce6..4951df3 100644
@@ -953,6 +953,28 @@ static gboolean parse_dataobj_imm_resp(struct comprehension_tlv_iter *iter,
 	return parse_dataobj_common_bool(iter, ret);
 }
 
+/* Defined in 102.223 Section 8.44 */
+static gboolean parse_dataobj_dtmf_string(struct comprehension_tlv_iter *iter,
+					void *user)
+{
+	char **dtmf = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if (len < 1)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	*dtmf = g_try_malloc(len * 2 + 1);
+	if (*dtmf == NULL)
+		return FALSE;
+
+	extract_bcd_number(data, len, *dtmf);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1071,6 +1093,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_bc_repeat_indicator;
 	case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
 		return parse_dataobj_imm_resp;
+	case STK_DATA_OBJECT_TYPE_DTMF_STRING:
+		return parse_dataobj_dtmf_string;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
Signature · 1 line
1.6.3.3
author
#13 lore raw

PATCH 14/15 Add parser for language objects

---
 src/stkutil.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
src/stkutil.c +21 -0
index 4951df3..0e42ece 100644
@@ -975,6 +975,25 @@ static gboolean parse_dataobj_dtmf_string(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* Defined in 102.223 Section 8.45 */
+static gboolean parse_dataobj_language(struct comprehension_tlv_iter *iter,
+					void *user)
+{
+	char **lang = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if (len != 2)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	/* Assume network measurement result is 2 bytes long */
+	memcpy(*lang, data, len);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1095,6 +1114,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_imm_resp;
 	case STK_DATA_OBJECT_TYPE_DTMF_STRING:
 		return parse_dataobj_dtmf_string;
+	case STK_DATA_OBJECT_TYPE_LANGUAGE:
+		return parse_dataobj_language;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
Signature · 1 line
1.6.3.3
author
#14 lore raw

PATCH 15/15 Add parser for browser identity objects

---
 src/stkutil.c |   10 ++++++++++
 src/stkutil.h |    8 ++++++++
 2 files changed, 18 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index 0e42ece..b23409e 100644
@@ -994,6 +994,14 @@ static gboolean parse_dataobj_language(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* Defined in 102.223 Section 8.47 */
+static gboolean parse_dataobj_browser_id(struct comprehension_tlv_iter *iter,
+					void *user)
+{
+	unsigned char *byte = user;
+	return parse_dataobj_common_byte(iter, byte);
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1116,6 +1124,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_dtmf_string;
 	case STK_DATA_OBJECT_TYPE_LANGUAGE:
 		return parse_dataobj_language;
+	case STK_DATA_OBJECT_TYPE_BROWSER_ID:
+		return parse_dataobj_browser_id;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +8 -0
index 0d22bea..3f96159 100644
@@ -301,6 +301,14 @@ enum stk_icon_qualifier {
 	STK_ICON_QUALIFIER_TYPE_NON_SELF_EXPLANATORY =	0x01
 };
 
+enum stk_browser_id {
+	STK_BROWSER_ID_DEFAULT =	0x00,
+	STK_BROWSER_ID_WML =		0x01,
+	STK_BROWSER_ID_HTML =		0x02,
+	STK_BROWSER_ID_XHTML =		0x03,
+	STK_BROWSER_ID_CHTML =		0x04
+};
+
 /* For data object that only has a byte array with undetermined length */
 struct stk_common_byte_array {
 	unsigned char *array;
Signature · 1 line
1.6.3.3
#15 lore raw
In reply to Yang Gu

Hi Yang,

Quoted 3 lines
---
 src/stkutil.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

All 15 patches have been applied with some minor fixes afterwards.

Regards,
-Denis