mirror of git://git.sysmocom.de/ofono
Decode and encode alpha-identifier fields
Add identifier argument to sim_adn_parse and sim_adn_build. Also fix the number length passed to extract_bcd_number in sim_adn_parse.
This commit is contained in:
parent
6552bc668d
commit
f21930f04e
|
@ -213,7 +213,7 @@ static DBusMessage *set_mbdn(struct ofono_message_waiting *mw, int mailbox,
|
|||
string_to_phone_number(number, &req->number);
|
||||
req->msg = dbus_message_ref(msg);
|
||||
|
||||
sim_adn_build(efmbdn, req->mw->efmbdn_length, &req->number);
|
||||
sim_adn_build(efmbdn, req->mw->efmbdn_length, &req->number, NULL);
|
||||
|
||||
if (ofono_sim_write(req->mw->sim, SIM_EFMBDN_FILEID, mbdn_set_cb,
|
||||
OFONO_SIM_FILE_STRUCTURE_FIXED,
|
||||
|
@ -386,7 +386,8 @@ static void mw_mbdn_read_cb(int ok,
|
|||
if (i == 5)
|
||||
return;
|
||||
|
||||
if (sim_adn_parse(data, record_length, &mw->mailbox_number[i]) == FALSE)
|
||||
if (sim_adn_parse(data, record_length, &mw->mailbox_number[i], NULL) ==
|
||||
FALSE)
|
||||
mw->mailbox_number[i].number[0] = '\0';
|
||||
|
||||
if (mw_mailbox_property_name[i]) {
|
||||
|
|
|
@ -219,7 +219,8 @@ static gboolean set_own_numbers(struct ofono_sim *sim,
|
|||
for (record = 1; record <= sim->efmsisdn_records; record++) {
|
||||
if (new_numbers) {
|
||||
number = new_numbers->data;
|
||||
sim_adn_build(efmsisdn, sim->efmsisdn_length, number);
|
||||
sim_adn_build(efmsisdn, sim->efmsisdn_length,
|
||||
number, NULL);
|
||||
new_numbers = new_numbers->next;
|
||||
} else
|
||||
memset(efmsisdn, 0xff, sim->efmsisdn_length);
|
||||
|
@ -370,7 +371,7 @@ static void sim_msisdn_read_cb(int ok,
|
|||
sim->efmsisdn_length = record_length;
|
||||
sim->efmsisdn_records = total;
|
||||
|
||||
if (sim_adn_parse(data, record_length, &ph) == TRUE) {
|
||||
if (sim_adn_parse(data, record_length, &ph, NULL) == TRUE) {
|
||||
struct ofono_phone_number *own;
|
||||
|
||||
own = g_new(struct ofono_phone_number, 1);
|
||||
|
|
|
@ -403,7 +403,7 @@ const struct sim_eons_operator_info *sim_eons_lookup_with_lac(
|
|||
}
|
||||
|
||||
gboolean sim_adn_parse(const unsigned char *data, int length,
|
||||
struct ofono_phone_number *ph)
|
||||
struct ofono_phone_number *ph, char **identifier)
|
||||
{
|
||||
int number_len;
|
||||
int ton_npi;
|
||||
|
@ -411,19 +411,31 @@ gboolean sim_adn_parse(const unsigned char *data, int length,
|
|||
if (length < 14)
|
||||
return FALSE;
|
||||
|
||||
/* Skip Alpha-Identifier field */
|
||||
/* Alpha-Identifier field */
|
||||
if (identifier) {
|
||||
if (length > 14)
|
||||
*identifier = sim_string_to_utf8(data, length - 14);
|
||||
else
|
||||
*identifier = NULL;
|
||||
}
|
||||
data += length - 14;
|
||||
|
||||
number_len = *data++;
|
||||
ton_npi = *data++;
|
||||
|
||||
if (number_len > 11 || ton_npi == 0xff)
|
||||
if (number_len > 11 || ton_npi == 0xff) {
|
||||
if (identifier && *identifier) {
|
||||
g_free(*identifier);
|
||||
*identifier = NULL;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ph->type = ton_npi;
|
||||
|
||||
/* BCD coded, however the TON/NPI is given by the first byte */
|
||||
number_len = (number_len - 1) * 2;
|
||||
number_len -= 1;
|
||||
|
||||
extract_bcd_number(data, number_len, ph->number);
|
||||
|
||||
|
@ -431,13 +443,33 @@ gboolean sim_adn_parse(const unsigned char *data, int length,
|
|||
}
|
||||
|
||||
void sim_adn_build(unsigned char *data, int length,
|
||||
const struct ofono_phone_number *ph)
|
||||
const struct ofono_phone_number *ph,
|
||||
const char *identifier)
|
||||
{
|
||||
int number_len = strlen(ph->number);
|
||||
unsigned char *gsm_identifier;
|
||||
long gsm_bytes;
|
||||
|
||||
/* Alpha-Identifier field */
|
||||
if (length > 14) {
|
||||
memset(data, 0xff, length - 14);
|
||||
|
||||
if (identifier) {
|
||||
/* TODO: figure out when the identifier needs to
|
||||
* be encoded in UCS2 and do this.
|
||||
*/
|
||||
gsm_identifier = convert_utf8_to_gsm(identifier,
|
||||
-1, NULL, &gsm_bytes, 0);
|
||||
|
||||
if (gsm_identifier) {
|
||||
if (gsm_bytes > length - 14)
|
||||
gsm_bytes = length - 14;
|
||||
|
||||
memcpy(data, gsm_identifier, gsm_bytes);
|
||||
g_free(gsm_identifier);
|
||||
}
|
||||
}
|
||||
|
||||
data += length - 14;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,6 +83,7 @@ static inline enum sim_file_access file_access_condition_decode(int bcd)
|
|||
}
|
||||
|
||||
gboolean sim_adn_parse(const unsigned char *data, int length,
|
||||
struct ofono_phone_number *ph);
|
||||
struct ofono_phone_number *ph, char **identifier);
|
||||
void sim_adn_build(unsigned char *data, int length,
|
||||
const struct ofono_phone_number *ph);
|
||||
const struct ofono_phone_number *ph,
|
||||
const char *identifier);
|
||||
|
|
Loading…
Reference in New Issue