Skip to contentSkip to conversation

Add parser for item text attribute list objects

PATCH In review Yang Gu 3 participants 24 messages Apr 20, 2010 – Apr 21, 2010

lore
Share & tools
lore

Yang Gu

author
#0 lore raw

PATCH 1/17 Add parser for item text attribute list objects

---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    6 ++++++
 2 files changed, 26 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index 43c06cd..5b97aeb 100644
@@ -1207,6 +1207,24 @@ static gboolean parse_dataobj_other_address(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.59 */
+static gboolean parse_dataobj_uicc_te_interface(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_uicc_te_interface *uti = user;
+	const unsigned char *data;
+	unsigned char len = comprehension_tlv_iter_get_length(iter);
+
+	if (len != 3)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	uti->protocol = data[0];
+	uti->port = (data[1] << 8) + data[2];
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1353,6 +1371,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_card_reader_id;
 	case STK_DATA_OBJECT_TYPE_OTHER_ADDRESS:
 		return parse_dataobj_other_address;
+	case STK_DATA_OBJECT_TYPE_UICC_TE_INTERFACE:
+		return parse_dataobj_uicc_te_interface;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +6 -0
index 1c05440..1c7c970 100644
@@ -570,6 +570,12 @@ struct stk_other_address {
 	unsigned char type;
 };
 
+/* Defined in TS 102.223 Section 8.59 */
+struct stk_uicc_te_interface {
+	unsigned char protocol;
+	unsigned short port;
+};
+
 /*
  * 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.7.0.4
author
#1 lore raw

PATCH 2/17 Add parser for aid objects

---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |   23 +++++++++++++++++++++++
 2 files changed, 43 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index 5b97aeb..0d4be68 100644
@@ -1225,6 +1225,24 @@ static gboolean parse_dataobj_uicc_te_interface(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.60 */
+static gboolean parse_dataobj_aid(struct comprehension_tlv_iter *iter,
+					void *user)
+{
+	struct stk_aid *aid = user;
+	const unsigned char *data;
+	unsigned char len = comprehension_tlv_iter_get_length(iter);
+
+	if ((len > 16) || (len < 12))
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	aid->len = len;
+	memcpy(aid->aid, 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)
@@ -1373,6 +1391,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_other_address;
 	case STK_DATA_OBJECT_TYPE_UICC_TE_INTERFACE:
 		return parse_dataobj_uicc_te_interface;
+	case STK_DATA_OBJECT_TYPE_AID:
+		return parse_dataobj_aid;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +23 -0
index 1c7c970..67e7ef7 100644
@@ -337,6 +337,18 @@ enum stk_address_type {
 	STK_ADDRESS_IPV6 = 	0x57
 };
 
+enum stk_access_technology_type {
+	STK_ACCESS_TECHNOLOGY_GSM = 		0x00,
+	STK_ACCESS_TECHNOLOGY_TIA_EIA_553 =	0x01,
+	STK_ACCESS_TECHNOLOGY_TIA_EIA_136_C =	0x02,
+	STK_ACCESS_TECHNOLOGY_UTRAN = 		0x03,
+	STK_ACCESS_TECHNOLOGY_TETRA = 		0x04,
+	STK_ACCESS_TECHNOLOGY_TIA_EIA_95 = 	0x05,
+	STK_ACCESS_TECHNOLOGY_CDMA2000_1X =	0x06,
+	STK_ACCESS_TECHNOLOGY_CDMA2000_HRPD = 	0x07,
+	STK_ACCESS_TECHNOLOGY_EUTRAN = 		0x08
+};
+
 /* For data object that only has a byte array with undetermined length */
 struct stk_common_byte_array {
 	unsigned char *array;
@@ -577,6 +589,17 @@ struct stk_uicc_te_interface {
 };
 
 /*
+ * Defined in TS 102.223 Section 8.60.
+ * According to 101.220, Section 4, aid contains two fields RID and PIX.
+ * RID has 5 bytes, while PIX contains information between 7 to 11 bytes.
+ * So the maximum size of aid is 16 bytes.
+ */
+struct stk_aid {
+	unsigned char aid[16];
+	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.7.0.4
#2 lore raw

Re: [PATCH 02/17] Add parser for aid objects

Hi Yang,

Quoted 4 lines
---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |   23 +++++++++++++++++++++++
 2 files changed, 43 insertions(+), 0 deletions(-)

This patch has been applied. Can you fix / rebase the other patches and resubmit?

Regards,
-Denis

author
#3 lore raw

PATCH 3/17 Add parser for access technology objects

In reply to Yang Gu
---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    9 +++++++++
 2 files changed, 29 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index 0d4be68..d690f51 100644
@@ -1243,6 +1243,24 @@ static gboolean parse_dataobj_aid(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.61 */
+static gboolean parse_dataobj_access_technology(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_access_technology *at = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if (len == 0)
+		return TRUE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	at->len = len;
+	memcpy(at->tech, 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)
@@ -1393,6 +1411,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_uicc_te_interface;
 	case STK_DATA_OBJECT_TYPE_AID:
 		return parse_dataobj_aid;
+	case STK_DATA_OBJECT_TYPE_ACCESS_TECHNOLOGY:
+		return parse_dataobj_access_technology;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +9 -0
index 67e7ef7..1e75533 100644
@@ -600,6 +600,15 @@ struct stk_aid {
 };
 
 /*
+ * According to 102.223 Section 8.61 the length of CTLV is 1 byte. This means
+ * that the maximum size is 127 according to the rules of CTLVs.
+ */
+struct stk_access_technology {
+	unsigned char tech[127];
+	unsigned char 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.7.0.4
#4 lore raw

Re: [PATCH 03/17] Add parser for access technology objects

Hi Yang,

Quoted 9 lines
---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    9 +++++++++
 2 files changed, 29 insertions(+), 0 deletions(-)
src/stkutil.c +0 -0
index 0d4be68..d690f51 100644

src/stkutil.c

Quoted 9 lines
src/stkutil.c +7 -0
 /*
+ * According to 102.223 Section 8.61 the length of CTLV is 1 byte. This
 means + * that the maximum size is 127 according to the rules of CTLVs.
+ */
+struct stk_access_technology {
+	unsigned char tech[127];
+	unsigned char len;
+};
+

Please look at 3GPP TS 31.124, my interpretation is that access technology is a single byte. 102.223 is not really helping here.

Regards,
-Denis

author
#5 lore raw

PATCH 4/17 Add parser for display parameters objects

In reply to Yang Gu
---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    7 +++++++
 2 files changed, 27 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index d690f51..1d5d1b4 100644
@@ -1261,6 +1261,24 @@ static gboolean parse_dataobj_access_technology(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.62 */
+static gboolean parse_dataobj_display_parameters(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_display_parameters *dp = user;
+	const unsigned char *data;
+
+	if (comprehension_tlv_iter_get_length(iter) != 3)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	dp->height = data[0];
+	dp->width = data[1];
+	dp->effects = data[2];
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1413,6 +1431,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_aid;
 	case STK_DATA_OBJECT_TYPE_ACCESS_TECHNOLOGY:
 		return parse_dataobj_access_technology;
+	case STK_DATA_OBJECT_TYPE_DISPLAY_PARAMETERS:
+		return parse_dataobj_display_parameters;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +7 -0
index 1e75533..2cfbc83 100644
@@ -608,6 +608,13 @@ struct stk_access_technology {
 	unsigned char len;
 };
 
+/* Defined in TS 102.223 Section 8.62 */
+struct stk_display_parameters {
+	unsigned char height;
+	unsigned char width;
+	unsigned char effects;
+};
+
 /*
  * 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.7.0.4
author
#6 lore raw

PATCH 5/17 Add parser for service record objects

In reply to Yang Gu
---
 src/stkutil.c |   28 ++++++++++++++++++++++++++++
 src/stkutil.h |   16 ++++++++++++++++
 2 files changed, 44 insertions(+), 0 deletions(-)
src/stkutil.c +28 -0
index 1d5d1b4..ecfa32b 100644
@@ -1279,6 +1279,32 @@ static gboolean parse_dataobj_display_parameters(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.63 */
+static gboolean parse_dataobj_service_record(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_service_record *sr = user;
+	const unsigned char *data;
+	unsigned int len;
+
+	len = comprehension_tlv_iter_get_length(iter);
+	if (len < 3)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	sr->tech_id = data[0];
+	sr->serv_id = data[1];
+	sr->len = len - 2;
+
+	sr->serv_rec = g_try_malloc(sr->len);
+	if (sr->serv_rec == NULL)
+		return FALSE;
+
+	memcpy(sr->serv_rec, data + 2, sr->len);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1433,6 +1459,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_access_technology;
 	case STK_DATA_OBJECT_TYPE_DISPLAY_PARAMETERS:
 		return parse_dataobj_display_parameters;
+	case STK_DATA_OBJECT_TYPE_SERVICE_RECORD:
+		return parse_dataobj_service_record;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +16 -0
index 2cfbc83..524d763 100644
@@ -349,6 +349,14 @@ enum stk_access_technology_type {
 	STK_ACCESS_TECHNOLOGY_EUTRAN = 		0x08
 };
 
+enum stk_technology_id {
+	STK_TECHNOLOGY_INDEPENDENT = 	0x00,
+	STK_TECHNOLOGY_BLUETOOTH = 	0x01,
+	STK_TECHNOLOGY_IRDA = 		0x02,
+	STK_TECHNOLOGY_RS232 = 		0x03,
+	STK_TECHNOLOGY_USB = 		0x04
+};
+
 /* For data object that only has a byte array with undetermined length */
 struct stk_common_byte_array {
 	unsigned char *array;
@@ -615,6 +623,14 @@ struct stk_display_parameters {
 	unsigned char effects;
 };
 
+/* Defined in TS 102.223 Section 8.63 */
+struct stk_service_record {
+	unsigned char tech_id;
+	unsigned char serv_id;
+	unsigned char *serv_rec;
+	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.7.0.4
#7 lore raw

Re: [PATCH 05/17] Add parser for service record objects

Hi Yang,

src/stkutil.c static gboolean parse_dataobj_display_parameters( · line 1301

Quoted 3 lines
src/stkutil.c +3 -0
+	sr->serv_rec = g_try_malloc(sr->len);
+	if (sr->serv_rec == NULL)
+		return FALSE;

I suggest not trying to allocate 0 bytes.

Regards,
-Denis

#8 lore raw

RE: [PATCH 05/17] Add parser for service record objects

Hi Denis,

Quoted 7 lines

-----Original Message-----
From: ofono-bounces(a)ofono.org [mailto:ofono-bounces(a)ofono.org] On Behalf Of Denis Kenzior
Sent: Wednesday, April 21, 2010 5:56 AM
To: ofono(a)ofono.org
Subject: Re: [PATCH 05/17] Add parser for service record objects

Quoted 7 lines

Hi Yang,

src/stkutil.c static gboolean parse_dataobj_display_parameters( · line 1301

Quoted 3 lines
src/stkutil.c +3 -0
+	sr->serv_rec = g_try_malloc(sr->len);
+	if (sr->serv_rec == NULL)
+		return FALSE;

I suggest not trying to allocate 0 bytes.

The service record field is either meaningful value or "00", so it will never allocate 0 byte. Other patches are modified following this comment.

Quoted 7 lines

Regards,
-Denis
_______________________________________________
ofono mailing list
ofono(a)ofono.org
http://lists.ofono.org/listinfo/ofono

Regards,
-Yang

author
#9 lore raw

PATCH 6/17 Add parser for device filter objects

In reply to Yang Gu
---
 src/stkutil.c |   26 ++++++++++++++++++++++++++
 src/stkutil.h |    7 +++++++
 2 files changed, 33 insertions(+), 0 deletions(-)
src/stkutil.c +26 -0
index ecfa32b..827ea9c 100644
@@ -1305,6 +1305,30 @@ static gboolean parse_dataobj_service_record(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.64 */
+static gboolean parse_dataobj_device_filter(struct comprehension_tlv_iter *iter,
+						void *user)
+{
+	struct stk_device_filter *df = 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);
+	df->tech_id = data[0];
+	df->len = len - 1;
+
+	df->dev_filter = g_try_malloc(df->len);
+	if (df->dev_filter == NULL)
+		return FALSE;
+
+	memcpy(df->dev_filter, data + 1, df->len);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1461,6 +1485,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_display_parameters;
 	case STK_DATA_OBJECT_TYPE_SERVICE_RECORD:
 		return parse_dataobj_service_record;
+	case STK_DATA_OBJECT_TYPE_DEVICE_FILTER:
+		return parse_dataobj_device_filter;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +7 -0
index 524d763..96c4363 100644
@@ -631,6 +631,13 @@ struct stk_service_record {
 	unsigned int len;
 };
 
+/* Defined in TS 102.223 Section 8.64 */
+struct stk_device_filter {
+	unsigned char tech_id;
+	unsigned char *dev_filter;
+	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.7.0.4
#10 lore raw

Re: [PATCH 06/17] Add parser for device filter objects

Hi Yang,

src/stkutil.c static gboolean parse_dataobj_service_record( · line 1325

Quoted 3 lines
src/stkutil.c +3 -0
+	df->dev_filter = g_try_malloc(df->len);
+	if (df->dev_filter == NULL)
+		return FALSE;

Again, you might want to handle 0 byte objects here or error out.

Regards,
-Denis

author
#11 lore raw

PATCH 7/17 Add parser for service search objects

In reply to Yang Gu
---
 src/stkutil.c |   26 ++++++++++++++++++++++++++
 src/stkutil.h |    7 +++++++
 2 files changed, 33 insertions(+), 0 deletions(-)
src/stkutil.c +26 -0
index 827ea9c..2baaeab 100644
@@ -1329,6 +1329,30 @@ static gboolean parse_dataobj_device_filter(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.65 */
+static gboolean parse_dataobj_service_search(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_service_search *ss = 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);
+	ss->tech_id = data[0];
+	ss->len = len - 1;
+
+	ss->ser_search = g_try_malloc(ss->len);
+	if (ss->ser_search == NULL)
+		return FALSE;
+
+	memcpy(ss->ser_search, data + 1, ss->len);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1487,6 +1511,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_service_record;
 	case STK_DATA_OBJECT_TYPE_DEVICE_FILTER:
 		return parse_dataobj_device_filter;
+	case STK_DATA_OBJECT_TYPE_SERVICE_SEARCH:
+		return parse_dataobj_service_search;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +7 -0
index 96c4363..9c4ff20 100644
@@ -638,6 +638,13 @@ struct stk_device_filter {
 	unsigned int len;
 };
 
+/* Defined in TS 102.223 Section 8.65 */
+struct stk_service_search {
+	unsigned char tech_id;
+	unsigned char *ser_search;
+	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.7.0.4
author
#12 lore raw

PATCH 8/17 Add parser for attribute information objects

In reply to Yang Gu
---
 src/stkutil.c |   26 ++++++++++++++++++++++++++
 src/stkutil.h |    7 +++++++
 2 files changed, 33 insertions(+), 0 deletions(-)
src/stkutil.c +26 -0
index 2baaeab..e320086 100644
@@ -1353,6 +1353,30 @@ static gboolean parse_dataobj_service_search(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.66 */
+static gboolean parse_dataobj_attribute_info(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_attribute_info *ai = 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);
+	ai->tech_id = data[0];
+	ai->len = len - 1;
+
+	ai->attr_info = g_try_malloc(ai->len);
+	if (ai->attr_info == NULL)
+		return FALSE;
+
+	memcpy(ai->attr_info, data + 1, ai->len);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1513,6 +1537,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_device_filter;
 	case STK_DATA_OBJECT_TYPE_SERVICE_SEARCH:
 		return parse_dataobj_service_search;
+	case STK_DATA_OBJECT_TYPE_ATTRIBUTE_INFO:
+		return parse_dataobj_attribute_info;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +7 -0
index 9c4ff20..8c5e6f5 100644
@@ -645,6 +645,13 @@ struct stk_service_search {
 	unsigned int len;
 };
 
+/* Defined in TS 102.223 Section 8.66 */
+struct stk_attribute_info {
+	unsigned char tech_id;
+	unsigned char *attr_info;
+	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.7.0.4
author
#13 lore raw

PATCH 9/17 Add parser for service availability objects

In reply to Yang Gu
---
 src/stkutil.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index e320086..7209842 100644
@@ -1377,6 +1377,14 @@ static gboolean parse_dataobj_attribute_info(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.67 */
+static gboolean parse_dataobj_service_availability(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_common_byte_array *array = user;
+	return parse_dataobj_common_byte_array(iter, array);
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1539,6 +1547,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_service_search;
 	case STK_DATA_OBJECT_TYPE_ATTRIBUTE_INFO:
 		return parse_dataobj_attribute_info;
+	case STK_DATA_OBJECT_TYPE_SERVICE_AVAILABILITY:
+		return parse_dataobj_service_availability;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
Signature · 1 line
1.7.0.4
author
#14 lore raw

PATCH 10/17 Add parser for remote entity address objects

In reply to Yang Gu
---
 src/stkutil.c |   31 +++++++++++++++++++++++++++++++
 src/stkutil.h |   10 ++++++++++
 2 files changed, 41 insertions(+), 0 deletions(-)
src/stkutil.c +31 -0
index 7209842..4863989 100644
@@ -1385,6 +1385,35 @@ static gboolean parse_dataobj_service_availability(
 	return parse_dataobj_common_byte_array(iter, array);
 }
 
+/* Defined in TS 102.223 Section 8.68 */
+static gboolean parse_dataobj_remote_entity_address(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_remote_entity_address *rea = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	rea->coding_type = data[0];
+	switch (rea->coding_type) {
+	case 0x00:
+		if (len != 7)
+			return FALSE;
+		break;
+	case 0x01:
+		if (len != 5)
+			return FALSE;
+		break;
+	default:
+		return FALSE;
+	}
+
+	memcpy(rea->addr, data + 1, len - 1);
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1549,6 +1578,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_attribute_info;
 	case STK_DATA_OBJECT_TYPE_SERVICE_AVAILABILITY:
 		return parse_dataobj_service_availability;
+	case STK_DATA_OBJECT_TYPE_REMOTE_ENTITY_ADDRESS:
+		return parse_dataobj_remote_entity_address;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +10 -0
index 8c5e6f5..184c098 100644
@@ -653,6 +653,16 @@ struct stk_attribute_info {
 };
 
 /*
+ * According to TS 102.223 Section 8.68, remote entity address can be either
+ * 6-bytes IEEE-802 address, or 4-bytes IrDA device address. So the maximum
+ * size of address is 6 bytes.
+ */
+struct stk_remote_entity_address {
+	unsigned char coding_type;
+	unsigned char addr[6];
+};
+
+/*
  * 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.7.0.4
#15 lore raw

Re: [PATCH 10/17] Add parser for remote entity address objects

Hi Yang,

src/stkutil.h struct stk_attribute_info { · line 664

Quoted 10 lines

/*
+ * According to TS 102.223 Section 8.68, remote entity address can be either + * 6-bytes IEEE-802 address, or 4-bytes IrDA device address. So the maximum + * size of address is 6 bytes.
+ */

src/stkutil.h +5 -0
+struct stk_remote_entity_address {
+	unsigned char coding_type;
+	unsigned char addr[6];
+};
+

I suggest you use a union here, see stk_other_address for an idea.

Regards,
-Denis

author
#16 lore raw

PATCH 11/17 Add parser for esn objects

In reply to Yang Gu
---
 src/stkutil.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
src/stkutil.c +21 -0
index 4863989..db5b8b8 100644
@@ -1414,6 +1414,25 @@ static gboolean parse_dataobj_remote_entity_address(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.69 */
+static gboolean parse_dataobj_esn(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	unsigned char **esn = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if (len != 4)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	/* Assume esn is 4 bytes long */
+	memcpy(*esn, 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)
@@ -1580,6 +1599,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_service_availability;
 	case STK_DATA_OBJECT_TYPE_REMOTE_ENTITY_ADDRESS:
 		return parse_dataobj_remote_entity_address;
+	case STK_DATA_OBJECT_TYPE_ESN:
+		return parse_dataobj_esn;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
Signature · 1 line
1.7.0.4
author
#17 lore raw

PATCH 12/17 Add parser for network access name objects

In reply to Yang Gu
---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    9 +++++++++
 2 files changed, 29 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
index db5b8b8..fd44456 100644
@@ -1433,6 +1433,24 @@ static gboolean parse_dataobj_esn(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.70 */
+static gboolean parse_dataobj_network_access_name(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_network_access_name *nan = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if (len == 0)
+		return TRUE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+	nan->len = len;
+	memcpy(nan->name, 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)
@@ -1601,6 +1619,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_remote_entity_address;
 	case STK_DATA_OBJECT_TYPE_ESN:
 		return parse_dataobj_esn;
+	case STK_DATA_OBJECT_TYPE_NETWORK_ACCESS_NAME:
+		return parse_dataobj_network_access_name;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
src/stkutil.h +9 -0
index 184c098..01597b3 100644
@@ -663,6 +663,15 @@ struct stk_remote_entity_address {
 };
 
 /*
+ * According to 102.223 Section 8.70 the length of CTLV is 1 byte. This means
+ * that the maximum size is 127 according to the rules of CTLVs.
+ */
+struct stk_network_access_name {
+	unsigned char name[127];
+	unsigned char 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.7.0.4
author
#18 lore raw

PATCH 13/17 Add parser for cdma sms tpdu objects

In reply to Yang Gu
---
 src/stkutil.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index fd44456..e6d69ef 100644
@@ -1451,6 +1451,14 @@ static gboolean parse_dataobj_network_access_name(
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.71 */
+static gboolean parse_dataobj_cdma_sms_tpdu(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_common_byte_array *array = user;
+	return parse_dataobj_common_byte_array(iter, array);
+}
+
 /* Defined in TS 102.223 Section 8.72 */
 static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1621,6 +1629,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_esn;
 	case STK_DATA_OBJECT_TYPE_NETWORK_ACCESS_NAME:
 		return parse_dataobj_network_access_name;
+	case STK_DATA_OBJECT_TYPE_CDMA_SMS_TPDU:
+		return parse_dataobj_cdma_sms_tpdu;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
Signature · 1 line
1.7.0.4
author
#19 lore raw

PATCH 14/17 Add parser for item text attribute list objects

In reply to Yang Gu
---
 src/stkutil.c |   21 +++++++++++++++++++++
 src/stkutil.h |   11 +++++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)
src/stkutil.c +21 -0
index e6d69ef..0f373f9 100644
@@ -1480,6 +1480,25 @@ static gboolean parse_dataobj_text_attr(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.73 */
+static gboolean parse_dataobj_item_text_attribute_list(
+		struct comprehension_tlv_iter *iter, void *user)
+{
+	struct stk_item_text_attribute_list *ital = user;
+	const unsigned char *data;
+	unsigned int len = comprehension_tlv_iter_get_length(iter);
+
+	if ((len > sizeof(ital->list)) || (len % 4 != 0))
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	memcpy(ital->list, data, len);
+	ital->len = len;
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.80 */
 static gboolean parse_dataobj_frame_id(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1633,6 +1652,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_cdma_sms_tpdu;
 	case STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE:
 		return parse_dataobj_text_attr;
+	case STK_DATA_OBJECT_TYPE_ITEM_TEXT_ATTRIBUTE_LIST:
+		return parse_dataobj_item_text_attribute_list;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
 		return parse_dataobj_frame_id;
 	default:
src/stkutil.h +11 -0
index 01597b3..f9cf34b 100644
@@ -681,6 +681,17 @@ struct stk_text_attribute {
 	unsigned char len;
 };
 
+/*
+ * According to 102.223 Section 8.73 the length of CTLV is 1 byte. This means
+ * that the maximum size is 127 according to the rules of CTLVs. In addition,
+ * the length should be also the number multiplied by 4, so the maximum number
+ * is 124.
+ */
+struct stk_item_text_attribute_list {
+	unsigned char list[124];
+	unsigned char len;
+};
+
 struct stk_command_display_text {
 	char *text;
 	struct stk_icon_id icon_id;
Signature · 1 line
1.7.0.4
author
#20 lore raw

PATCH 15/17 Add parser for imeisv objects

In reply to Yang Gu
---
 src/stkutil.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 45 insertions(+), 0 deletions(-)
src/stkutil.c +45 -0
index 0f373f9..17e38d3 100644
@@ -1499,6 +1499,49 @@ static gboolean parse_dataobj_item_text_attribute_list(
 	return TRUE;
 }
 
+/*
+ * Defined in TS 102.223 Section 8.74.
+ *
+ * According to 3GPP TS 24.008, Section 10.5.1.4, IMEISV is composed of
+ * 16 digits and totally 9 bytes are used to represent it.
+ *
+ * Bits 1-3 of first byte represent the type of identity, and they
+ * are 0 1 1 separately for IMEISV. Bit 4 of first byte is the odd/even
+ * indication, and it's 0 to indicate IMEISV has odd number of digits (16).
+ * The rest bytes are coded using BCD coding.
+ *
+ * For example, if the IMEISV is "1234567890123456", then it's coded as
+ * "13 32 54 76 98 10 32 54 F6".
+ */
+static gboolean parse_dataobj_imeisv(struct comprehension_tlv_iter *iter,
+					void *user)
+{
+	char **imeisv = user;
+	const unsigned char *data;
+	unsigned int len;
+	static const char digit_lut[] = "0123456789*#abc\0";
+
+	len = comprehension_tlv_iter_get_length(iter);
+	if (len != 9)
+		return FALSE;
+
+	data = comprehension_tlv_iter_get_data(iter);
+
+	if ((data[0] & 0x0f) != 0x03)
+		return FALSE;
+
+	if (data[8] >> 4 != 0x0f)
+		return FALSE;
+
+	/* Assume imeisv is at least 17 bytes long (16 for imeisv + null) */
+	(*imeisv)[0] = digit_lut[data[0] >> 4];
+	extract_bcd_number(data + 1, 7, *imeisv + 1);
+	(*imeisv)[15] = digit_lut[data[8] & 0x0f];
+	(*imeisv)[16] = '\0';
+
+	return TRUE;
+}
+
 /* Defined in TS 102.223 Section 8.80 */
 static gboolean parse_dataobj_frame_id(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1654,6 +1697,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_text_attr;
 	case STK_DATA_OBJECT_TYPE_ITEM_TEXT_ATTRIBUTE_LIST:
 		return parse_dataobj_item_text_attribute_list;
+	case STK_DATA_OBJECT_TYPE_IMEISV:
+		return parse_dataobj_imeisv;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
 		return parse_dataobj_frame_id;
 	default:
Signature · 1 line
1.7.0.4
author
#21 lore raw

PATCH 16/17 Add parser for network search mode objects

In reply to Yang Gu
---
 src/stkutil.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index 17e38d3..a3c5f47 100644
@@ -1542,6 +1542,14 @@ static gboolean parse_dataobj_imeisv(struct comprehension_tlv_iter *iter,
 	return TRUE;
 }
 
+/* Defined in TS 102.223 Section 8.75 */
+static gboolean parse_dataobj_network_search_mode(
+		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.80 */
 static gboolean parse_dataobj_frame_id(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1699,6 +1707,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_item_text_attribute_list;
 	case STK_DATA_OBJECT_TYPE_IMEISV:
 		return parse_dataobj_imeisv;
+	case STK_DATA_OBJECT_TYPE_NETWORK_SEARCH_MODE:
+		return parse_dataobj_network_search_mode;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
 		return parse_dataobj_frame_id;
 	default:
Signature · 1 line
1.7.0.4
author
#22 lore raw

PATCH 17/17 Add parser for battery state objects

In reply to Yang Gu
---
 src/stkutil.c |   10 ++++++++++
 src/stkutil.h |    8 ++++++++
 2 files changed, 18 insertions(+), 0 deletions(-)
src/stkutil.c +10 -0
index a3c5f47..832d2f8 100644
@@ -1550,6 +1550,14 @@ static gboolean parse_dataobj_network_search_mode(
 	return parse_dataobj_common_byte(iter, byte);
 }
 
+/* Defined in TS 102.223 Section 8.76 */
+static gboolean parse_dataobj_battery_state(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.80 */
 static gboolean parse_dataobj_frame_id(struct comprehension_tlv_iter *iter,
 					void *user)
@@ -1709,6 +1717,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
 		return parse_dataobj_imeisv;
 	case STK_DATA_OBJECT_TYPE_NETWORK_SEARCH_MODE:
 		return parse_dataobj_network_search_mode;
+	case STK_DATA_OBJECT_TYPE_BATTERY_STATE:
+		return parse_dataobj_battery_state;
 	case STK_DATA_OBJECT_TYPE_FRAME_ID:
 		return parse_dataobj_frame_id;
 	default:
src/stkutil.h +8 -0
index f9cf34b..6e822f8 100644
@@ -357,6 +357,14 @@ enum stk_technology_id {
 	STK_TECHNOLOGY_USB = 		0x04
 };
 
+enum stk_battery_state {
+	STK_BATTERY_VERY_LOW = 	0x00,
+	STK_BATTERY_LOW = 	0x01,
+	STK_BATTERY_AVERAGE = 	0x02,
+	STK_BATTERY_GOOD = 	0x03,
+	STK_BATTERY_FULL = 	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.7.0.4
#23 lore raw
In reply to Yang Gu

Hi Yang,

Quoted 4 lines
---
 src/stkutil.c |   20 ++++++++++++++++++++
 src/stkutil.h |    6 ++++++
 2 files changed, 26 insertions(+), 0 deletions(-)

This patch has been applied, thanks.

Regards,
-Denis