summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/stkutil.c41
-rw-r--r--src/stkutil.h7
2 files changed, 48 insertions, 0 deletions
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);