Add parser for card reader status objects
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
@@ -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
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
@@ -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
@@ -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
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
@@ -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
@@ -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
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
@@ -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
@@ -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
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
@@ -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
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
@@ -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
@@ -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
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
@@ -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
@@ -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
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
@@ -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
@@ -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
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
@@ -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
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
@@ -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
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
@@ -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
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
@@ -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
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
@@ -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
PATCH 14/15 Add parser for language objects
--- src/stkutil.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-)
src/stkutil.c +21 -0
@@ -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
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
@@ -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
@@ -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
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