Attaching an updated patch.

2009/8/19 Andrzej Zaborowski <[email protected]>:
> Also fix the number length passed to extract_bcd_number in sim_adn_parse.
> ---
>  src/message-waiting.c |    5 +++--
>  src/sim.c             |    5 +++--
>  src/simutil.c         |   42 +++++++++++++++++++++++++++++++++++++-----
>  src/simutil.h         |    5 +++--
>  4 files changed, 46 insertions(+), 11 deletions(-)
...

Regards
From 1495f8e318f14c7041895aea3f44f20a96430107 Mon Sep 17 00:00:00 2001
From: Andrzej Zaborowski <[email protected]>
Date: Wed, 26 Aug 2009 03:14:06 +0200
Subject: [PATCH] Decode and encode alpha-identifier fields in EFadn format utils.

Also fix the number length passed to extract_bcd_number in sim_adn_parse.
---
 src/message-waiting.c |    5 +++--
 src/sim.c             |    5 +++--
 src/simutil.c         |   42 +++++++++++++++++++++++++++++++++++++-----
 src/simutil.h         |    5 +++--
 4 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/src/message-waiting.c b/src/message-waiting.c
index 31cc0a3..3666875 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 f76d4ed..6f8406b 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 99f28bd..9c8b44b 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 9bb5323..dccbe7b 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);
-- 
1.6.1

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to