stkutil: Add Get Inkey response builder

This commit is contained in:
Andrzej Zaborowski 2010-05-16 16:05:04 +02:00 committed by Denis Kenzior
parent 60cab4354c
commit eacb4395fc
2 changed files with 102 additions and 1 deletions

View File

@ -36,7 +36,8 @@
enum stk_data_object_flag {
DATAOBJ_FLAG_MANDATORY = 1,
DATAOBJ_FLAG_MINIMUM = 2
DATAOBJ_FLAG_MINIMUM = 2,
DATAOBJ_FLAG_CR = 4
};
struct stk_file_iter {
@ -3035,6 +3036,23 @@ static inline gboolean stk_tlv_append_bytes(struct stk_tlv_builder *iter,
return TRUE;
}
/* Described in TS 102.223 Section 8.8 */
static gboolean build_dataobj_duration(struct stk_tlv_builder *tlv,
const void *data, gboolean cr)
{
const struct stk_duration *duration = data;
if (duration->interval == 0x00)
return TRUE;
return stk_tlv_open_container(tlv, cr,
STK_DATA_OBJECT_TYPE_DURATION, FALSE) &&
stk_tlv_append_byte(tlv, duration->unit) &&
stk_tlv_append_byte(tlv, duration->interval) &&
stk_tlv_close_container(tlv);
}
/* Described in TS 102.223 Section 8.12 */
static gboolean build_dataobj_result(struct stk_tlv_builder *tlv,
const void *data, gboolean cr)
{
@ -3056,6 +3074,65 @@ static gboolean build_dataobj_result(struct stk_tlv_builder *tlv,
return FALSE;
}
/* Defined in TS 102.223 Section 8.15 */
static gboolean build_dataobj_text(struct stk_tlv_builder *tlv,
const void *data, gboolean cr)
{
const struct stk_answer_text *text = data;
if (!text->text && !text->yesno)
return TRUE;
if (stk_tlv_open_container(tlv, cr, STK_DATA_OBJECT_TYPE_TEXT,
TRUE) != TRUE)
return FALSE;
if (text->yesno == TRUE) {
/* Section 6.8.5:
* When the terminal issues [...] command qualifier set
* to "Yes/No", it shall supply the value "01" when the
* answer is "positive" and the value '00' when the
* answer is "negative" in the text string data object.
*/
if (stk_tlv_append_byte(tlv, 0x04) != TRUE)
return FALSE;
if (stk_tlv_append_byte(tlv, text->text ? 0x01 : 0x00) != TRUE)
return FALSE;
} else if (text->packed) {
if (stk_tlv_append_text(tlv, 0x00, text->text) != TRUE)
return FALSE;
} else {
if (stk_tlv_append_text(tlv, -1, text->text) != TRUE)
return FALSE;
}
return stk_tlv_close_container(tlv);
}
static gboolean build_dataobj(struct stk_tlv_builder *tlv, gboolean
(*builder_func)(struct stk_tlv_builder *,
const void *, gboolean), ...)
{
va_list args;
va_start(args, builder_func);
while (builder_func) {
unsigned int flags = va_arg(args, enum stk_data_object_flag);
const void *data = va_arg(args, const void *);
gboolean cr = (flags & DATAOBJ_FLAG_CR) ? TRUE : FALSE;
if (builder_func(tlv, data, cr) != TRUE)
return FALSE;
builder_func = va_arg(args, gboolean (*)(
struct stk_tlv_builder *,
const void *, gboolean));
}
return TRUE;
}
unsigned int stk_pdu_from_response(const struct stk_response *response,
unsigned char *pdu, unsigned int size)
{
@ -3115,6 +3192,14 @@ unsigned int stk_pdu_from_response(const struct stk_response *response,
switch (response->type) {
case STK_COMMAND_TYPE_DISPLAY_TEXT:
break;
case STK_COMMAND_TYPE_GET_INKEY:
ok = build_dataobj(&builder,
build_dataobj_text, DATAOBJ_FLAG_CR,
&response->get_inkey.text,
build_dataobj_duration, 0,
&response->get_inkey.duration,
NULL);
break;
default:
return 0;
};

View File

@ -995,6 +995,21 @@ struct stk_command {
struct stk_response_generic {
};
struct stk_answer_text {
char *text;
ofono_bool_t packed;
ofono_bool_t yesno;
/* If a "Yes/No" answer was requested in a GET INKEY command,
* .yesno must be TRUE and text should be non-NULL to indicate
* a Yes response or NULL to indicate a No response.
*/
};
struct stk_response_get_inkey {
struct stk_answer_text text;
struct stk_duration duration;
};
struct stk_response {
unsigned char number;
unsigned char type;
@ -1005,6 +1020,7 @@ struct stk_response {
union {
struct stk_response_generic display_text;
struct stk_response_get_inkey get_inkey;
};
void (*destructor)(struct stk_response *response);