Add parser for access technology objects
PATCH 1/15 Add parser for access technology objects
--- src/stkutil.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)
src/stkutil.c +14 -0
@@ -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 :
Signature · 1 line
1.7.0.4
PATCH 2/15 Add parser for display parameters objects
--- src/stkutil.c | 20 ++++++++++++++++++++ src/stkutil.h | 7 +++++++ 2 files changed, 27 insertions(+), 0 deletions(-)
src/stkutil.c +20 -0
@@ -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 :
src/stkutil.h +7 -0
@@ -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
Signature · 1 line
1.7.0.4
PATCH 3/15 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
@@ -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 :
src/stkutil.h +16 -0
@@ -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
Signature · 1 line
1.7.0.4
PATCH 4/15 Add parser for device filter objects
In reply to Yang Gu--- src/stkutil.c | 29 +++++++++++++++++++++++++++++ src/stkutil.h | 7 +++++++ 2 files changed, 36 insertions(+), 0 deletions(-)
src/stkutil.c +29 -0
@@ -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 :
src/stkutil.h +7 -0
@@ -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
Signature · 1 line
1.7.0.4
PATCH 5/15 Add parser for service search objects
In reply to Yang Gu--- src/stkutil.c | 29 +++++++++++++++++++++++++++++ src/stkutil.h | 7 +++++++ 2 files changed, 36 insertions(+), 0 deletions(-)
src/stkutil.c +29 -0
@@ -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 :
src/stkutil.h +7 -0
@@ -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
Signature · 1 line
1.7.0.4
PATCH 6/15 Add parser for attribute information objects
In reply to Yang Gu--- src/stkutil.c | 29 +++++++++++++++++++++++++++++ src/stkutil.h | 7 +++++++ 2 files changed, 36 insertions(+), 0 deletions(-)
src/stkutil.c +29 -0
@@ -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 :
src/stkutil.h +7 -0
@@ -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
Signature · 1 line
1.7.0.4
PATCH 7/15 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
@@ -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 :
Signature · 1 line
1.7.0.4
PATCH 8/15 Add parser for remote entity address objects
In reply to Yang Gu--- src/stkutil.c | 31 +++++++++++++++++++++++++++++++ src/stkutil.h | 12 ++++++++++++ 2 files changed, 43 insertions(+), 0 deletions(-)
src/stkutil.c +31 -0
@@ -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 :
src/stkutil.h +12 -0
@@ -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.
Signature · 1 line
1.7.0.4
PATCH 9/15 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
@@ -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 :
Signature · 1 line
1.7.0.4
PATCH 10/15 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
@@ -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 :
src/stkutil.h +9 -0
@@ -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.
Signature · 1 line
1.7.0.4
PATCH 11/15 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
@@ -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 :
Signature · 1 line
1.7.0.4
PATCH 12/15 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
@@ -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 :
src/stkutil.h +11 -0
@@ -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;
Signature · 1 line
1.7.0.4
PATCH 13/15 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
@@ -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 :
Signature · 1 line
1.7.0.4
PATCH 14/15 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
@@ -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 :
Signature · 1 line
1.7.0.4
PATCH 15/15 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
@@ -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 :
src/stkutil.h +8 -0
@@ -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
Hi Yang,
Quoted 4 lines
--- 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