From 268ac562eb5171fbb360858b5c2efcf493b6dfa0 Mon Sep 17 00:00:00 2001 From: Andrzej Zaborowski Date: Thu, 27 May 2010 06:59:48 +0200 Subject: [PATCH] stkutil: Add the Timer Management response builder --- src/stkutil.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/stkutil.h | 7 +++++++ 2 files changed, 48 insertions(+) diff --git a/src/stkutil.c b/src/stkutil.c index dda47def..dbcb0e13 100644 --- a/src/stkutil.c +++ b/src/stkutil.c @@ -947,6 +947,7 @@ static gboolean parse_dataobj_timer_value(struct comprehension_tlv_iter *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]); + tv->has_value = TRUE; return TRUE; } @@ -3540,6 +3541,36 @@ static gboolean build_dataobj_cc_requested_action(struct stk_tlv_builder *tlv, stk_tlv_builder_close_container(tlv); } +/* Described in TS 102.223 Section 8.37 */ +static gboolean build_dataobj_timer_id(struct stk_tlv_builder *tlv, + const void *data, gboolean cr) +{ + const unsigned char *id = data; + unsigned char tag = STK_DATA_OBJECT_TYPE_TIMER_ID; + + return id[0] == 0 || + (stk_tlv_builder_open_container(tlv, cr, tag, FALSE) && + stk_tlv_builder_append_byte(tlv, id[0]) && + stk_tlv_builder_close_container(tlv)); +} + +/* Described in TS 102.223 Section 8.38 */ +static gboolean build_dataobj_timer_value(struct stk_tlv_builder *tlv, + const void *data, gboolean cr) +{ + const struct stk_timer_value *value = data; + unsigned char tag = STK_DATA_OBJECT_TYPE_TIMER_VALUE; + + return value->has_value == FALSE || + (stk_tlv_builder_open_container(tlv, cr, tag, FALSE) && +#define TO_BCD(bin) ((((bin) / 10) & 0xf) | (((bin) % 10) << 4)) + stk_tlv_builder_append_byte(tlv, TO_BCD(value->hour)) && + stk_tlv_builder_append_byte(tlv, TO_BCD(value->minute)) && + stk_tlv_builder_append_byte(tlv, TO_BCD(value->second)) && +#undef TO_BCD + stk_tlv_builder_close_container(tlv)); +} + /* Described in TS 102.223 Section 8.39 */ static gboolean build_dataobj_datetime_timezone(struct stk_tlv_builder *tlv, const void *data, gboolean cr) @@ -4006,6 +4037,16 @@ unsigned int stk_pdu_from_response(const struct stk_response *response, break; case STK_COMMAND_TYPE_SETUP_EVENT_LIST: break; + case STK_COMMAND_TYPE_TIMER_MANAGEMENT: + ok = build_dataobj(&builder, + build_dataobj_timer_id, + DATAOBJ_FLAG_CR, + &response->timer_mgmt.id, + build_dataobj_timer_value, + DATAOBJ_FLAG_CR, + &response->timer_mgmt.value, + NULL); + break; default: return 0; }; diff --git a/src/stkutil.h b/src/stkutil.h index caadf652..153da658 100644 --- a/src/stkutil.h +++ b/src/stkutil.h @@ -643,6 +643,7 @@ struct stk_r_apdu { /* Defined in TS 102.223 Section 8.38 */ struct stk_timer_value { + ofono_bool_t has_value; unsigned char hour; unsigned char minute; unsigned char second; @@ -1129,6 +1130,11 @@ struct stk_response_local_info { }; }; +struct stk_response_timer_mgmt { + unsigned char id; + struct stk_timer_value value; +}; + struct stk_response { unsigned char number; unsigned char type; @@ -1151,6 +1157,7 @@ struct stk_response { struct stk_response_generic polling_off; struct stk_response_local_info provide_local_info; struct stk_response_generic set_up_event_list; + struct stk_response_timer_mgmt timer_mgmt; }; void (*destructor)(struct stk_response *response);