* Decode and encode alpha-identifier fields in EFadn format utils.
@ 2009-08-19 20:08 Andrzej Zaborowski
2009-08-26 0:32 ` andrzej zaborowski
0 siblings, 1 reply; 3+ messages in thread
From: Andrzej Zaborowski @ 2009-08-19 20:08 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 4812 bytes --]
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 ccb137e..abca027 100644
--- a/src/message-waiting.c
+++ b/src/message-waiting.c
@@ -230,7 +230,7 @@ static DBusMessage *set_mbdn(struct ofono_modem *modem, int mailbox,
efmbdn_length = req->mw->efmbdn_length > 0 ?
req->mw->efmbdn_length : 14;
- sim_adn_build(efmbdn, efmbdn_length, &req->number);
+ sim_adn_build(efmbdn, efmbdn_length, &req->number, NULL);
if (req->mw->efmbdn_length > 0)
r = ofono_sim_write(modem, SIM_EFMBDN_FILEID, mbdn_set_cb,
@@ -404,7 +404,8 @@ static void mw_mbdn_read_cb(struct ofono_modem *modem, 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 0af02cd..2298cbf 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -249,7 +249,8 @@ static gboolean set_own_numbers(struct ofono_modem *modem,
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);
@@ -401,7 +402,7 @@ static void sim_msisdn_read_cb(struct ofono_modem *modem, 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 1dc310b..41d5149 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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: Decode and encode alpha-identifier fields in EFadn format utils.
2009-08-19 20:08 Decode and encode alpha-identifier fields in EFadn format utils Andrzej Zaborowski
@ 2009-08-26 0:32 ` andrzej zaborowski
2009-08-31 20:15 ` Denis Kenzior
0 siblings, 1 reply; 3+ messages in thread
From: andrzej zaborowski @ 2009-08-26 0:32 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 466 bytes --]
Attaching an updated patch.
2009/8/19 Andrzej Zaborowski <andrew.zaborowski@intel.com>:
> 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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-Decode-and-encode-alpha-identifier-fields-in-EFadn-f.patch --]
[-- Type: text/x-patch, Size: 4885 bytes --]
From 1495f8e318f14c7041895aea3f44f20a96430107 Mon Sep 17 00:00:00 2001
From: Andrzej Zaborowski <andrew.zaborowski@intel.com>
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: Decode and encode alpha-identifier fields in EFadn format utils.
2009-08-26 0:32 ` andrzej zaborowski
@ 2009-08-31 20:15 ` Denis Kenzior
0 siblings, 0 replies; 3+ messages in thread
From: Denis Kenzior @ 2009-08-31 20:15 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 112 bytes --]
Hi Andrew,
> Attaching an updated patch.
Patch has been applied and pushed. Thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-08-31 20:15 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-19 20:08 Decode and encode alpha-identifier fields in EFadn format utils Andrzej Zaborowski
2009-08-26 0:32 ` andrzej zaborowski
2009-08-31 20:15 ` Denis Kenzior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox