diff --git a/src/message-waiting.c b/src/message-waiting.c index 31cc0a33..36668751 100644 --- a/src/message-waiting.c +++ b/src/message-waiting.c @@ -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]) { diff --git a/src/sim.c b/src/sim.c index f76d4ed7..6f8406b2 100644 --- a/src/sim.c +++ b/src/sim.c @@ -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); diff --git a/src/simutil.c b/src/simutil.c index 99f28bda..9c8b44bf 100644 --- a/src/simutil.c +++ b/src/simutil.c @@ -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; } diff --git a/src/simutil.h b/src/simutil.h index 9bb53238..dccbe7bc 100644 --- a/src/simutil.h +++ b/src/simutil.h @@ -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);