Add several proactive command parsers

This commit is contained in:
Yang Gu 2010-06-13 17:43:17 +08:00 committed by Denis Kenzior
parent 8cf6750f06
commit 090c93fbdf
2 changed files with 566 additions and 0 deletions

View File

@ -3057,6 +3057,440 @@ static gboolean parse_launch_browser(struct stk_command *command,
return TRUE;
}
/* TODO: parse_open_channel */
static void destroy_close_channel(struct stk_command *command)
{
g_free(command->close_channel.alpha_id);
}
static gboolean parse_close_channel(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_close_channel *obj = &command->close_channel;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_close_channel;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static void destroy_receive_data(struct stk_command *command)
{
g_free(command->receive_data.alpha_id);
}
static gboolean parse_receive_data(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_receive_data *obj = &command->receive_data;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if ((command->dst < STK_DEVICE_IDENTITY_TYPE_CHANNEL_1) ||
(command->dst > STK_DEVICE_IDENTITY_TYPE_CHANNEL_7))
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_CHANNEL_DATA_LENGTH,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->data_len,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_receive_data;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static void destroy_send_data(struct stk_command *command)
{
g_free(command->send_data.alpha_id);
g_free(command->send_data.data.array);
}
static gboolean parse_send_data(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_send_data *obj = &command->send_data;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if ((command->dst < STK_DEVICE_IDENTITY_TYPE_CHANNEL_1) ||
(command->dst > STK_DEVICE_IDENTITY_TYPE_CHANNEL_7))
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_CHANNEL_DATA,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->data,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_send_data;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static gboolean parse_get_channel_status(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
return TRUE;
}
static void destroy_service_search(struct stk_command *command)
{
g_free(command->service_search.alpha_id);
g_free(command->service_search.serv_search.ser_search);
g_free(command->service_search.dev_filter.dev_filter);
}
static gboolean parse_service_search(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_service_search *obj = &command->service_search;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_SERVICE_SEARCH,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->serv_search,
STK_DATA_OBJECT_TYPE_DEVICE_FILTER, 0,
&obj->dev_filter,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_service_search;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static void destroy_get_service_info(struct stk_command *command)
{
g_free(command->get_service_info.alpha_id);
g_free(command->get_service_info.attr_info.attr_info);
}
static gboolean parse_get_service_info(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_get_service_info *obj = &command->get_service_info;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_ATTRIBUTE_INFO,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->attr_info,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_get_service_info;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static void destroy_declare_service(struct stk_command *command)
{
g_free(command->declare_service.serv_rec.serv_rec);
}
static gboolean parse_declare_service(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_declare_service *obj = &command->declare_service;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_SERVICE_RECORD,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->serv_rec,
STK_DATA_OBJECT_TYPE_UICC_TE_INTERFACE, 0,
&obj->intf,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_declare_service;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static gboolean parse_set_frames(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_set_frames *obj = &command->set_frames;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_FRAME_ID,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_FRAME_LAYOUT, 0,
&obj->frame_layout,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id_default,
STK_DATA_OBJECT_TYPE_INVALID);
if (ret == FALSE)
return FALSE;
return TRUE;
}
static gboolean parse_get_frames_status(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
return TRUE;
}
static void destroy_retrieve_mms(struct stk_command *command)
{
g_free(command->retrieve_mms.alpha_id);
g_slist_foreach(command->retrieve_mms.mms_rec_files,
(GFunc)g_free, NULL);
g_slist_free(command->retrieve_mms.mms_rec_files);
}
static gboolean parse_retrieve_mms(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_retrieve_mms *obj = &command->retrieve_mms;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_NETWORK)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_MMS_REFERENCE,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->mms_ref,
STK_DATA_OBJECT_TYPE_FILE_LIST,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->mms_rec_files,
STK_DATA_OBJECT_TYPE_MMS_CONTENT_ID,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->mms_content_id,
STK_DATA_OBJECT_TYPE_MMS_ID, 0,
&obj->mms_id,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_retrieve_mms;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static void destroy_submit_mms(struct stk_command *command)
{
g_free(command->submit_mms.alpha_id);
g_slist_foreach(command->submit_mms.mms_subm_files,
(GFunc)g_free, NULL);
g_slist_free(command->submit_mms.mms_subm_files);
}
static gboolean parse_submit_mms(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_submit_mms *obj = &command->submit_mms;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_NETWORK)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID, 0,
&obj->alpha_id,
STK_DATA_OBJECT_TYPE_ICON_ID, 0,
&obj->icon_id,
STK_DATA_OBJECT_TYPE_FILE_LIST,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->mms_subm_files,
STK_DATA_OBJECT_TYPE_MMS_ID, 0,
&obj->mms_id,
STK_DATA_OBJECT_TYPE_TEXT_ATTRIBUTE, 0,
&obj->text_attr,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_submit_mms;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static void destroy_display_mms(struct stk_command *command)
{
g_slist_foreach(command->display_mms.mms_subm_files,
(GFunc)g_free, NULL);
g_slist_free(command->display_mms.mms_subm_files);
}
static gboolean parse_display_mms(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_display_mms *obj = &command->display_mms;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_FILE_LIST,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->mms_subm_files,
STK_DATA_OBJECT_TYPE_MMS_ID,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->mms_id,
STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE, 0,
&obj->imd_resp,
STK_DATA_OBJECT_TYPE_FRAME_ID, 0,
&obj->frame_id,
STK_DATA_OBJECT_TYPE_INVALID);
command->destructor = destroy_display_mms;
if (ret == FALSE)
return FALSE;
return TRUE;
}
static gboolean parse_activate(struct stk_command *command,
struct comprehension_tlv_iter *iter)
{
struct stk_command_activate *obj = &command->activate;
gboolean ret;
if (command->src != STK_DEVICE_IDENTITY_TYPE_UICC)
return FALSE;
if (command->dst != STK_DEVICE_IDENTITY_TYPE_TERMINAL)
return FALSE;
ret = parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ACTIVATE_DESCRIPTOR,
DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
&obj->actv_desc,
STK_DATA_OBJECT_TYPE_INVALID);
if (ret == FALSE)
return FALSE;
return TRUE;
}
struct stk_command *stk_command_new_from_pdu(const unsigned char *pdu,
unsigned int len)
{
@ -3190,6 +3624,45 @@ struct stk_command *stk_command_new_from_pdu(const unsigned char *pdu,
case STK_COMMAND_TYPE_LAUNCH_BROWSER:
ok = parse_launch_browser(command, &iter);
break;
case STK_COMMAND_TYPE_CLOSE_CHANNEL:
ok = parse_close_channel(command, &iter);
break;
case STK_COMMAND_TYPE_RECEIVE_DATA:
ok = parse_receive_data(command, &iter);
break;
case STK_COMMAND_TYPE_SEND_DATA:
ok = parse_send_data(command, &iter);
break;
case STK_COMMAND_TYPE_GET_CHANNEL_STATUS:
ok = parse_get_channel_status(command, &iter);
break;
case STK_COMMAND_TYPE_SERVICE_SEARCH:
ok = parse_service_search(command, &iter);
break;
case STK_COMMAND_TYPE_GET_SERVICE_INFO:
ok = parse_get_service_info(command, &iter);
break;
case STK_COMMAND_TYPE_DECLARE_SERVICE:
ok = parse_declare_service(command, &iter);
break;
case STK_COMMAND_TYPE_SET_FRAMES:
ok = parse_set_frames(command, &iter);
break;
case STK_COMMAND_TYPE_GET_FRAMES_STATUS:
ok = parse_get_frames_status(command, &iter);
break;
case STK_COMMAND_TYPE_RETRIEVE_MMS:
ok = parse_retrieve_mms(command, &iter);
break;
case STK_COMMAND_TYPE_SUBMIT_MMS:
ok = parse_submit_mms(command, &iter);
break;
case STK_COMMAND_TYPE_DISPLAY_MMS:
ok = parse_display_mms(command, &iter);
break;
case STK_COMMAND_TYPE_ACTIVATE:
ok = parse_activate(command, &iter);
break;
default:
ok = FALSE;
break;

View File

@ -1171,6 +1171,88 @@ struct stk_command_launch_browser {
char *text_passwd;
};
struct stk_command_close_channel {
char *alpha_id;
struct stk_icon_id icon_id;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_receive_data {
char *alpha_id;
struct stk_icon_id icon_id;
unsigned char data_len;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_send_data {
char *alpha_id;
struct stk_icon_id icon_id;
struct stk_common_byte_array data;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_service_search {
char *alpha_id;
struct stk_icon_id icon_id;
struct stk_service_search serv_search;
struct stk_device_filter dev_filter;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_get_service_info {
char *alpha_id;
struct stk_icon_id icon_id;
struct stk_attribute_info attr_info;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_declare_service {
struct stk_service_record serv_rec;
struct stk_uicc_te_interface intf;
};
struct stk_command_set_frames {
struct stk_frame_id frame_id;
struct stk_frame_layout frame_layout;
struct stk_frame_id frame_id_default;
};
struct stk_command_retrieve_mms {
char *alpha_id;
struct stk_icon_id icon_id;
struct stk_mms_reference mms_ref;
GSList *mms_rec_files;
struct stk_mms_content_id mms_content_id;
struct stk_mms_id mms_id;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_submit_mms {
char *alpha_id;
struct stk_icon_id icon_id;
GSList *mms_subm_files;
struct stk_mms_id mms_id;
struct stk_text_attribute text_attr;
struct stk_frame_id frame_id;
};
struct stk_command_display_mms {
GSList *mms_subm_files;
struct stk_mms_id mms_id;
ofono_bool_t imd_resp;
struct stk_frame_id frame_id;
};
struct stk_command_activate {
unsigned char actv_desc;
};
struct stk_command {
unsigned char number;
unsigned char type;
@ -1198,6 +1280,17 @@ struct stk_command {
struct stk_command_send_dtmf send_dtmf;
struct stk_command_language_notification language_notification;
struct stk_command_launch_browser launch_browser;
struct stk_command_close_channel close_channel;
struct stk_command_receive_data receive_data;
struct stk_command_send_data send_data;
struct stk_command_service_search service_search;
struct stk_command_get_service_info get_service_info;
struct stk_command_declare_service declare_service;
struct stk_command_set_frames set_frames;
struct stk_command_retrieve_mms retrieve_mms;
struct stk_command_submit_mms submit_mms;
struct stk_command_display_mms display_mms;
struct stk_command_activate activate;
};
void (*destructor)(struct stk_command *command);