Add parser for file list objects

This commit is contained in:
Yang Gu 2010-03-23 12:33:49 +08:00 committed by Denis Kenzior
parent 0ff704e488
commit 0ef68e31e2
2 changed files with 99 additions and 0 deletions

View File

@ -416,6 +416,92 @@ static gboolean parse_dataobj_tone(struct comprehension_tlv_iter *iter,
return TRUE;
}
/* Defined in TS 102.223 Section 8.18 */
static gboolean parse_dataobj_file_list(struct comprehension_tlv_iter *iter,
void *user)
{
GSList **fl = user;
const unsigned char *data;
unsigned int len;
unsigned int i;
unsigned int start = 0;
struct stk_file *sf;
unsigned char last_type = 0x2f;
if (comprehension_tlv_iter_get_tag(iter) !=
STK_DATA_OBJECT_TYPE_FILE_LIST)
return FALSE;
len = comprehension_tlv_iter_get_length(iter);
if (len < 5)
return FALSE;
data = comprehension_tlv_iter_get_data(iter);
for (i = 1; i < len; i += 2) {
/* Check the validity of file type.
* According to TS 11.11, each file id contains of two bytes,
* in which the first byte is the type of file. For GSM is:
* 0x3f: master file
* 0x7f: 1st level dedicated file
* 0x5f: 2nd level dedicated file
* 0x2f: elementary file under the master file
* 0x6f: elementary file under 1st level dedicated file
* 0x4f: elementary file under 2nd level dedicated file
*/
if (data[i] == 0x3f) {
if ((last_type != 0x2f) && (last_type != 0x6f) &&
(last_type != 0x4f))
goto error;
start = i;
} else if (data[i] == 0x2f) {
if (last_type != 0x3f)
goto error;
} else if (data[i] == 0x6f) {
if (last_type != 0x7f)
goto error;
} else if (data[i] == 0x4f) {
if (last_type != 0x5f)
goto error;
} else if (data[i] == 0x7f) {
if (last_type != 0x3f)
goto error;
} else if (data[i] == 0x5f) {
if (last_type != 0x7f)
goto error;
} else
goto error;
if ((data[i] == 0x2f) || (data[i] == 0x6f) ||
(data[i] == 0x4f)) {
if (i + 1 >= len)
goto error;
sf = g_try_new0(struct stk_file, 1);
if (sf == NULL)
goto error;
sf->len = i - start + 2;
memcpy(sf->file, data + start, i - start + 2);
*fl = g_slist_prepend(*fl, sf);
}
last_type = data[i];
}
if ((data[len - 2] != 0x2f) && (data[len - 2] != 0x6f) &&
(data[len - 2] != 0x4f))
goto error;
*fl = g_slist_reverse(*fl);
return TRUE;
error:
g_slist_foreach(*fl, (GFunc)g_free, NULL);
g_slist_free(*fl);
return FALSE;
}
/* Defined in TS 102.223 Section 8.31 */
static gboolean parse_dataobj_icon_id(struct comprehension_tlv_iter *iter,
void *user)
@ -533,6 +619,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
return parse_dataobj_text;
case STK_DATA_OBJECT_TYPE_TONE:
return parse_dataobj_tone;
case STK_DATA_OBJECT_TYPE_FILE_LIST:
return parse_dataobj_file_list;
case STK_DATA_OBJECT_TYPE_ICON_ID:
return parse_dataobj_icon_id;
case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:

View File

@ -345,6 +345,17 @@ struct stk_result {
unsigned char *additional;
};
/* Define the struct of single file in TS102.223 Section 8.18.
* According to TS 11.11 Section 6.2, each file id has two bytes, and the
* maximum Dedicated File level is 2. So the maximum size of file is 8, which
* contains two bytes of Master File, 2 bytes of 1st level Dedicated File,
* 2 bytes of 2nd level Dedicated File and 2 bytes of Elementary File.
*/
struct stk_file {
unsigned char file[8];
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