mirror of git://git.sysmocom.de/ofono
Add parser for file list objects
This commit is contained in:
parent
0ff704e488
commit
0ef68e31e2
|
@ -416,6 +416,92 @@ static gboolean parse_dataobj_tone(struct comprehension_tlv_iter *iter,
|
||||||
return TRUE;
|
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 */
|
/* Defined in TS 102.223 Section 8.31 */
|
||||||
static gboolean parse_dataobj_icon_id(struct comprehension_tlv_iter *iter,
|
static gboolean parse_dataobj_icon_id(struct comprehension_tlv_iter *iter,
|
||||||
void *user)
|
void *user)
|
||||||
|
@ -533,6 +619,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
|
||||||
return parse_dataobj_text;
|
return parse_dataobj_text;
|
||||||
case STK_DATA_OBJECT_TYPE_TONE:
|
case STK_DATA_OBJECT_TYPE_TONE:
|
||||||
return parse_dataobj_tone;
|
return parse_dataobj_tone;
|
||||||
|
case STK_DATA_OBJECT_TYPE_FILE_LIST:
|
||||||
|
return parse_dataobj_file_list;
|
||||||
case STK_DATA_OBJECT_TYPE_ICON_ID:
|
case STK_DATA_OBJECT_TYPE_ICON_ID:
|
||||||
return parse_dataobj_icon_id;
|
return parse_dataobj_icon_id;
|
||||||
case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
|
case STK_DATA_OBJECT_TYPE_IMMEDIATE_RESPONSE:
|
||||||
|
|
|
@ -345,6 +345,17 @@ struct stk_result {
|
||||||
unsigned char *additional;
|
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
|
* 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
|
* byte. This means that the maximum size is 127 according to the rules
|
||||||
|
|
Loading…
Reference in New Issue