From: Jogi Date: Wed, 30 Apr 2014 15:25:29 +0000 (+0530) Subject: Fix MBDN encoding X-Git-Tag: submit/tizen_mobile/20150323.032021~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F28%2F21328%2F1;p=platform%2Fcore%2Ftelephony%2Flibtcore.git Fix MBDN encoding Change-Id: I64b459e0b806e5d9f1586b66b9f830bfea058648 --- diff --git a/include/at.h b/include/at.h old mode 100755 new mode 100644 diff --git a/include/co_sim.h b/include/co_sim.h index 0916ecf..d61b45e 100644 --- a/include/co_sim.h +++ b/include/co_sim.h @@ -330,7 +330,8 @@ gboolean tcore_sim_decode_spdi(unsigned char *enc_spdi, int enc_spdi_len, TelSim gboolean tcore_sim_decode_msisdn(unsigned char *enc_msisdn, int enc_msisdn_len, TelSimSubscriberInfo *dec_msisdn); gboolean tcore_sim_decode_xdn(unsigned char *enc_xdn, int enc_xdn_len, char *alpha_id, unsigned int *alpha_id_len, char *num); -gboolean tcore_sim_encode_xdn(char *alpha_id, char *num, char *enc_xdn, int enc_xdn_len); +gboolean tcore_sim_encode_xdn(gchar *alpha_id, gchar *number, guint enc_xdn_len, + gchar **enc_data); gboolean tcore_sim_decode_ecc(unsigned char *enc_ecc, int enc_ecc_len, TelSimEccList *dec_ecc); gboolean tcore_sim_decode_ust(unsigned char *enc_ust, int enc_ust_len, char *dec_ust); gboolean tcore_sim_decode_uecc(unsigned char* enc_uecc, int enc_uecc_len, TelSimEcc *dec_ecc); diff --git a/src/co_network.c b/src/co_network.c old mode 100755 new mode 100644 diff --git a/src/co_ps.c b/src/co_ps.c old mode 100755 new mode 100644 diff --git a/src/co_sat.c b/src/co_sat.c old mode 100755 new mode 100644 diff --git a/src/co_sim.c b/src/co_sim.c old mode 100755 new mode 100644 index 71849a1..0008e97 --- a/src/co_sim.c +++ b/src/co_sim.c @@ -692,58 +692,89 @@ gboolean tcore_sim_decode_xdn(unsigned char *enc_xdn, int enc_xdn_len, return TRUE; } -gboolean tcore_sim_encode_xdn(char *alpha_id, char *num, char *enc_xdn, int enc_xdn_len) +gboolean tcore_sim_encode_xdn(gchar *alpha_id, gchar *number, guint enc_xdn_len, + gchar **enc_data) { - int alpha_id_space =0, digit_len =0, str_len = 0; - char bcd_code[TEL_SIM_XDN_NUMBER_LEN_MAX / 2]; - enc_xdn = tcore_malloc0(enc_xdn_len); - memset((void*) enc_xdn, 0xFF, enc_xdn_len); - - tcore_check_return_value_assert(alpha_id != NULL, FALSE); - tcore_check_return_value_assert(num != NULL, FALSE); - - // get alpha id max length - alpha_id_space = enc_xdn_len - 14; - - // alpha id is too big - str_len = strlen(alpha_id); - if (alpha_id_space < str_len) { - dbg("SIM space for alpha_id is [%d] but input alpha_id length is [%d]. so we will use [%d] byte", - alpha_id_space, str_len, alpha_id_space); - str_len = alpha_id_space; - } +#define TEL_SIM_CCI_OFFSET 12 +#define TEL_SIM_ERI_OFFSET 13 + + gint alpha_id_length = 0; + gchar *enc_xdn; + + enc_xdn = tcore_malloc0(enc_xdn_len + 1); + memset((void*)enc_xdn, 0xFF, enc_xdn_len); + + /* Alpha ID length */ + alpha_id_length = enc_xdn_len - 14; + if (alpha_id_length < 0) + alpha_id_length = 0; + + /* Alpha ID */ + if (alpha_id) { + guint str_len = strlen(alpha_id); + + if (str_len) { + /* Validate Alpha ID length */ + if (alpha_id_length < str_len) { + /* alpha id is too big */ + dbg("SIM space for alpha_id is [%d] but input alpha_id " \ + "length is [%d]. so we will use [%d] byte", + alpha_id_length, str_len, alpha_id_length); + str_len = alpha_id_length; + } - digit_len = strlen(num); - // this is digit length - if ( digit_len > TEL_SIM_XDN_NUMBER_LEN_MAX) { - dbg("SIM space for number is [%d] but input number length is [%d]. so we will use [%d] byte", - TEL_SIM_XDN_NUMBER_LEN_MAX, digit_len, TEL_SIM_XDN_NUMBER_LEN_MAX); - digit_len = TEL_SIM_XDN_NUMBER_LEN_MAX; + /* Set Alpha ID */ + tcore_util_set_string((unsigned char *)enc_xdn, + (unsigned char *)alpha_id, str_len); + } } - tcore_util_set_string((unsigned char *)enc_xdn, (unsigned char *)alpha_id, str_len); + /* Dialing number/SSC string */ + if (number) { + guchar number_index = 0; + guint number_length = 0; + + if (number[0] == '+') + number_index = 1; + + number_length = strlen(&number[number_index]); + if (number_length) { + gchar bcd_number[TEL_SIM_XDN_NUMBER_LEN_MAX / 2]; + memset((void*)bcd_number, 0xFF, TEL_SIM_XDN_NUMBER_LEN_MAX / 2); + + /* Validate Dialing number/SSC string length */ + if (number_length > TEL_SIM_XDN_NUMBER_LEN_MAX) { + dbg("SIM space for number is [%d] but input number length " \ + "is [%d]. so we will use [%d] byte", + TEL_SIM_XDN_NUMBER_LEN_MAX, + number_length, TEL_SIM_XDN_NUMBER_LEN_MAX); + number_length = TEL_SIM_XDN_NUMBER_LEN_MAX; + } - // set length of BCD number/SSC contents - // p_xdn->diallingnumLen is maximum digit length. = 20 bytes. - // convert to BCD length and add 1 byte. - enc_xdn[alpha_id_space] = ( (digit_len + 1) / 2 ) + 1; + tcore_util_convert_digit_to_bcd((char*)bcd_number, + (char *)&number[number_index], number_length); - /* set TON and NPI - xdn[alpha_id_space + 1] = 0x80; - xdn[alpha_id_space + 1] |= (p_xdn->ton & 0x07) << 4; - xdn[alpha_id_space + 1] |= p_xdn->npi & 0x0F; - */ - // set dialing number/SSC string - memset((void*) bcd_code, 0xFF, TEL_SIM_XDN_NUMBER_LEN_MAX / 2); + /* Set length of BCD number/SSC contents */ + enc_xdn[alpha_id_length] = ( (number_length + 1) / 2 ) + 1; + + /* Set TON and NPI */ + enc_xdn[alpha_id_length + 1] = 0x80; + enc_xdn[alpha_id_length + 1] |= (number_index & 0x07) << 4; + enc_xdn[alpha_id_length + 1] |= (number_index & 0x0F); + + memcpy((void*)&enc_xdn[alpha_id_length + 2], + bcd_number, TEL_SIM_XDN_NUMBER_LEN_MAX / 2); + } + } - tcore_util_convert_digit_to_bcd((char*) bcd_code, (char*)num, digit_len); + /* Set Capability/Configuration Identifier */ + enc_xdn[alpha_id_length + TEL_SIM_CCI_OFFSET] = 0xFF; - memcpy((void*) &enc_xdn[alpha_id_space + 2], bcd_code, TEL_SIM_XDN_NUMBER_LEN_MAX / 2); + /* Set Extension1 Record Identifier */ + enc_xdn[alpha_id_length + TEL_SIM_ERI_OFFSET] = 0xFF; - // set Capability/Configuration Identifier - //out[alpha_id_space + 12] = (unsigned char) p_xdn->cc_id; - // set extension1 record Identifier - //out[alpha_id_space + 13] = (unsigned char) p_xdn->ext1_id; + *enc_data = enc_xdn; + enc_xdn[enc_xdn_len] = '\0'; return TRUE; } diff --git a/src/storage.c b/src/storage.c old mode 100755 new mode 100644