---
src/stkutil.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 0d4be68..69d5a4a 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1243,6 +1243,18 @@ static gboolean parse_dataobj_aid(struct comprehension_tlv_iter
*iter,
return TRUE;
}
+/*
+ * Defined in TS 102.223 Section 8.61. According to it, the technology field
+ * can have at most 127 bytes. However, all the defined values are only 1 byte,
+ * so we just use 1 byte to represent it.
+ */
+static gboolean parse_dataobj_access_technology(
+ 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)
@@ -1393,6 +1405,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:
--
1.7.0.4
Show replies by date
---
src/stkutil.c | 20 ++++++++++++++++++++
src/stkutil.h | 7 +++++++
2 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 69d5a4a..d569f16 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1255,6 +1255,24 @@ static gboolean parse_dataobj_access_technology(
return parse_dataobj_common_byte(iter, byte);
}
+/* 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)
@@ -1407,6 +1425,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index 67e7ef7..3cf9caa 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -599,6 +599,13 @@ struct stk_aid {
unsigned int 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
--
1.7.0.4
---
src/stkutil.c | 28 ++++++++++++++++++++++++++++
src/stkutil.h | 16 ++++++++++++++++
2 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index d569f16..0e0135f 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1273,6 +1273,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)
@@ -1427,6 +1453,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index 3cf9caa..581d947 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -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;
@@ -606,6 +614,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
--
1.7.0.4
---
src/stkutil.c | 29 +++++++++++++++++++++++++++++
src/stkutil.h | 7 +++++++
2 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 0e0135f..d6c7235 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1299,6 +1299,33 @@ 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 < 1)
+ return FALSE;
+
+ if (len == 1)
+ return TRUE;
+
+ 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)
@@ -1455,6 +1482,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index 581d947..cc2915d 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -622,6 +622,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
--
1.7.0.4
---
src/stkutil.c | 29 +++++++++++++++++++++++++++++
src/stkutil.h | 7 +++++++
2 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index d6c7235..fdeeee2 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1326,6 +1326,33 @@ 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 < 1)
+ return FALSE;
+
+ if (len == 1)
+ return TRUE;
+
+ 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)
@@ -1484,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index cc2915d..57952ba 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -629,6 +629,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
--
1.7.0.4
---
src/stkutil.c | 29 +++++++++++++++++++++++++++++
src/stkutil.h | 7 +++++++
2 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index fdeeee2..ca32e08 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1353,6 +1353,33 @@ 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 < 1)
+ return FALSE;
+
+ if (len == 1)
+ return TRUE;
+
+ 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 +1540,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index 57952ba..f15f38d 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -636,6 +636,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
--
1.7.0.4
---
src/stkutil.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index ca32e08..f9d4ce7 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1380,6 +1380,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)
@@ -1542,6 +1550,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:
--
1.7.0.4
---
src/stkutil.c | 31 +++++++++++++++++++++++++++++++
src/stkutil.h | 12 ++++++++++++
2 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index f9d4ce7..33bdb21 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1388,6 +1388,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)
@@ -1552,6 +1581,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index f15f38d..39d159b 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -644,6 +644,18 @@ 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.
+ */
+struct stk_remote_entity_address {
+ unsigned char coding_type;
+ union {
+ unsigned char ieee802[6];
+ unsigned char irda[4];
+ } addr;
+};
+
+/*
* 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.
--
1.7.0.4
---
src/stkutil.c | 21 +++++++++++++++++++++
1 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 33bdb21..1856c93 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1417,6 +1417,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)
@@ -1583,6 +1602,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:
--
1.7.0.4
---
src/stkutil.c | 20 ++++++++++++++++++++
src/stkutil.h | 9 +++++++++
2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 1856c93..6b3500e 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1436,6 +1436,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)
@@ -1604,6 +1622,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index 39d159b..9e3cbf5 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -656,6 +656,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.
--
1.7.0.4
---
src/stkutil.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 6b3500e..b1ba4d4 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1454,6 +1454,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)
@@ -1624,6 +1632,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:
--
1.7.0.4
---
src/stkutil.c | 21 +++++++++++++++++++++
src/stkutil.h | 11 +++++++++++
2 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index b1ba4d4..4d6722d 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1483,6 +1483,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)
@@ -1636,6 +1655,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index 9e3cbf5..d973251 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -674,6 +674,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;
--
1.7.0.4
---
src/stkutil.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 4d6722d..8582b9f 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1502,6 +1502,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)
@@ -1657,6 +1700,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:
--
1.7.0.4
---
src/stkutil.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index 8582b9f..fcc396b 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1545,6 +1545,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)
@@ -1702,6 +1710,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:
--
1.7.0.4
---
src/stkutil.c | 10 ++++++++++
src/stkutil.h | 8 ++++++++
2 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index fcc396b..eec3fc2 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -1553,6 +1553,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)
@@ -1712,6 +1720,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:
diff --git a/src/stkutil.h b/src/stkutil.h
index d973251..98da709 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -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;
--
1.7.0.4
Hi Yang,
---
src/stkutil.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
All 15 patches have been applied with some trivial fixes in between.
Regards,
-Denis