📄 phb_sim_access.c
字号:
phb_sim_read_record(
control_block->secondary_ID,
sim_ext_record_index,
phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID (control_block->secondary_ID)),
control_block->ID);
return;
}
}
/* Empty record!! */
else
{
kal_mem_set(&phb_entry->alpha_id, 0, sizeof(l4_name_struct));
phb_entry->tel_number.addr_length = 0;
/* control_block->data cannot be NULL for 1 to 1 mapping */
control_block->data = NULL;
}
/* read complete */
phb_IO_return(control_block, ilm_ptr, KAL_TRUE);
return;
}
else if (control_block->primary_ID == FILE_G_EMAIL_IDX)
{
kal_uint8 *pdu_ptr;
kal_uint16 pdu_length;
kal_uint8 email_length = phb_ptr->email_length;
phb_email_struct *email_entry;
pdu_ptr = sim_read_cnf->data;
pdu_length = sim_read_cnf->length;
email_entry = (phb_email_struct*) control_block->data;
/* Clean area for storing data read from stroage. */
kal_mem_set(email_entry, (kal_uint8) PHB_INVALID_VALUE, sizeof(phb_email_struct));
email_entry->record_index = control_block->record_index;
email_entry->adn_record_index = control_block->record_index; // TODO: index
if (*pdu_ptr != 0xFF)
{
istring_type istring;
/* Set up email_entry->email_address */
istring.length = PHB_EMAIL_MAX_LEN;
istring.data = (kal_uint8*) email_entry->email_address;
email_entry->email_length = istring_decode_from_sim(email_length, pdu_ptr, &istring);
/* need null terminator at the end */
if (email_entry->email_length > PHB_EMAIL_MAX_LEN)
{
email_entry->email_length = PHB_EMAIL_MAX_LEN;
email_entry->email_address[PHB_EMAIL_MAX_LEN] = 0;
}
if (phb_ptr->email_type == 1)
{
email_entry->adn_record_index = control_block->record_index;
}
else
{
email_entry->adn_record_index = *(pdu_ptr + phb_ptr->email_length + 1);
}
email_entry->record_index = control_block->record_index;
}
else /* Empty record!! */
{
kal_mem_set(email_entry, 0, sizeof(phb_email_struct));
control_block->data = NULL;
}
/* read complete */
phb_IO_return(control_block, ilm_ptr, KAL_TRUE);
return;
}
else if (control_block->primary_ID == FILE_G_GRP_IDX)
{
control_block->data[0] = sim_read_cnf->data[0];
/* read complete */
phb_IO_return(control_block, ilm_ptr, KAL_TRUE);
return;
}
#endif /* __PHB_USIM_SUPPORT__ */
/* ADN-like structures */
else
{
kal_uint8 *pdu_ptr;
kal_uint16 pdu_length;
phb_ef_struct phb_ef;
phb_entry_struct *phb_entry;
kal_uint8 alpha_id_length;
#ifdef __PHB_USIM_SUPPORT__
if (control_block->primary_ID == FILE_G_GAS_IDX)
{
alpha_id_length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
}
else
#endif /* __PHB_USIM_SUPPORT__ */
alpha_id_length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID)) -
PHB_LENGTH_AFTER_ALPHA_ID;
/* Note that BDN is total 15 bytes after ALPHA_ID field */
if (control_block->primary_ID == FILE_BDN_IDX)
{
alpha_id_length--;
}
pdu_ptr = sim_read_cnf->data;
pdu_length = sim_read_cnf->length;
phb_entry = (phb_entry_struct*) control_block->data;
phb_ef.alpha_id = (kal_uint8*) pdu_ptr;
phb_ef.mandatory = (phb_ef_mandatory_struct*) ((kal_uint8*) pdu_ptr + alpha_id_length);
/* Clean area for storing data read from stroage. */
kal_mem_set(phb_entry, (kal_uint8) PHB_INVALID_VALUE, sizeof(phb_entry_struct));
phb_entry->index = control_block->index;
phb_entry->record_index = control_block->record_index;
phb_entry->storage = PHB_SIM;
/* amanda add */
if (control_block->primary_ID == FILE_FDN_IDX)
{
phb_entry->type = PHB_FDN;
}
else if (control_block->primary_ID == FILE_BDN_IDX)
{
phb_entry->type = PHB_BDN;
}
else if (control_block->primary_ID == FILE_ADN_IDX)
{
phb_entry->type = PHB_PHONEBOOK;
}
#ifdef __PHB_USIM_SUPPORT__
else if (control_block->primary_ID == FILE_G_ADN_IDX)
{
phb_entry->type = PHB_PHONEBOOK;
}
else if (control_block->primary_ID == FILE_G_GAS_IDX)
{
phb_entry->type = PHB_GAS;
}
#endif /* __PHB_USIM_SUPPORT__ */
else
{
phb_entry->type = PHB_NONE;
}
if (!is_empty(pdu_ptr, pdu_length) /* &&
(phb_ef.mandatory->len <= PHB_EF_MAX_TON_NPI_TEL_NUMBER_LEN) */ )
{
istring_type istring;
kal_uint8 sim_ext_record_index;
/* Set up phb_entry->alpha_id */
istring.length = phb_entry->alpha_id.name_length = L4_MAX_NAME;
istring.data = (kal_uint8*) phb_entry->alpha_id.name;
phb_entry->alpha_id.name_length = istring_decode_from_sim(alpha_id_length, phb_ef.alpha_id, &istring);
if (phb_entry->alpha_id.name_length == 0)
{
istring.charset = PHB_ASCII;
}
phb_entry->alpha_id.name_dcs = istring.charset;
/**
* No matter ASCII or UCS2 string, always makes last two byte 0
* Because MMI maximum length is L4_MAX_NAME,
* and need two bytes null terminator at the end
*/
if (phb_entry->alpha_id.name_length >= (L4_MAX_NAME - 2))
{
phb_entry->alpha_id.name_length = (L4_MAX_NAME - 2);
phb_entry->alpha_id.name[L4_MAX_NAME - 1] = 0;
phb_entry->alpha_id.name[L4_MAX_NAME - 2] = 0;
}
/**
* If returned decoded length of alpha id is 0,
* it is either stored alpha id is empty,
* or alpha id encoding is erroneous
*/
/* Set up phb_entry->tel_number */
if (phb_ef.mandatory->len > 0 && phb_ef.mandatory->len != 0xff && phb_ef.mandatory->len <= (EF_TEL_NUMBER_SIZE + 1) && !(phb_ef.mandatory->len == 1 && phb_ef.mandatory->ton_npi != 0x91)) /* only accept + if length 1 */
{
phb_entry->tel_number.addr_length = phb_ef.mandatory->len;
phb_entry->tel_number.addr_bcd[L4_ADDR_BCD_TON_NPI_OFFSET] = phb_ef.mandatory->ton_npi;
kal_mem_cpy(
&phb_entry->tel_number.addr_bcd[L4_ADDR_BCD_TEL_NUM_OFFSET],
(void const*)&phb_ef.mandatory->tel_number,
/* TON_NPI_SIZE + */ phb_ef.mandatory->len - L4_ADDR_BCD_TEL_NUM_OFFSET);
phb_entry->tel_number.addr_bcd[phb_ef.mandatory->len] = 0xff;
}
else
{
kal_mem_set(&phb_entry->tel_number, 0, sizeof(l4_addr_bcd_struct));
phb_entry->tel_number.addr_bcd[L4_ADDR_BCD_TEL_NUM_OFFSET] = 0xff;
}
/* Empty Record!! - If Name and Number field are both empty, regard it as an empty record!! */
if ((phb_entry->alpha_id.name_length == 0) && (phb_entry->tel_number.addr_length == 0))
{
kal_mem_set(&phb_entry->alpha_id, 0, sizeof(l4_name_struct));
/* control_block->data cannot be NULL for 1 to 1 mapping */
if ((control_block->type != PHB_MSISDN) && (control_block->type != PHB_SDN))
{
control_block->data = NULL;
}
phb_IO_return(control_block, ilm_ptr, KAL_TRUE);
return;
}
/* Set up phb_entry->cap_cnf_id */
phb_entry->cap_cnf_id = phb_ef.mandatory->cap_cnf_id;
/* Need reassembly? */
sim_ext_record_index = phb_ef.mandatory->ext_id;
control_block->seg_record_index = (kal_uint8) PHB_INVALID_VALUE;
if ((control_block->secondary_ID != PHB_NULL_VALUE) &&
(sim_ext_record_index != (kal_uint8) PHB_INVALID_VALUE) &&
(sim_ext_record_index > 0) &&
(sim_ext_record_index <= phb_data_desc_get_record_num(phb_data_desc_get_desc_by_ID(control_block->secondary_ID))) &&
(phb_entry->tel_number.addr_length < L4_MAX_ADDR_BCD) &&
/* Only when address length is equal to PHB_EF_MAX_TON_NPI_TEL_NUMBER_LEN should need reassembly */
(phb_ef.mandatory->len == PHB_EF_MAX_TON_NPI_TEL_NUMBER_LEN))
{
if ((phb_ptr->state != PHB_STATE_READY) &&
((control_block->proc_stage == startup_build_adn_index) ||
(control_block->proc_stage == startup_build_fdn_index) ||
(control_block->proc_stage == startup_build_bdn_index)))
{
control_block->seg_record_index = sim_ext_record_index;
phb_data_desc_mark_free(
phb_data_desc_get_desc_by_ID(control_block->secondary_ID),
sim_ext_record_index,
KAL_FALSE);
}
/*
* Record extension 1 record index for MSISDN deletion pricedure only.
* For MSISDN does not keep in PHB, need to read back info before deletion.
*/
if (control_block->type == PHB_MSISDN)
{
control_block->seg_record_index = sim_ext_record_index;
}
control_block->IO_stage = IO_REASSEMBLY;
control_block->IO_cnf_receive = phb_sim_read_cnf;
/**
* control_block->record_index MUST NOT be modified;
* that is counter of current read primary_ID!!!
*/
phb_sim_read_record(
control_block->secondary_ID,
sim_ext_record_index,
phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID (control_block->secondary_ID)),
control_block->ID);
return;
}
}
/* Empty record!! */
else
{
kal_mem_set(&phb_entry->alpha_id, 0, sizeof(l4_name_struct));
phb_entry->tel_number.addr_length = 0;
/* control_block->data cannot be NULL for 1 to 1 mapping */
if ((control_block->type != PHB_MSISDN) && (control_block->type != PHB_SDN))
{
control_block->data = NULL;
}
}
/* read complete */
phb_IO_return(control_block, ilm_ptr, KAL_TRUE);
return;
}
}
else if (control_block->IO_stage == IO_REASSEMBLY)
{
if (sim_read_cnf->file_idx == control_block->secondary_ID)
{
kal_uint8 sim_ext_record_index;
phb_entry_struct *phb_entry;
ef_ext_type *ef_ext;
/* sim_read_cnf->data is a EFext */
ef_ext = (ef_ext_type*) sim_read_cnf->data;
if (ef_ext->ext_data_length <= PHB_EF_EXT_MAX_TEL_NUMBER_LEN)
{
sim_ext_record_index = phb_sim_reassemble_tel_num(ef_ext, control_block);
phb_entry = (phb_entry_struct*) control_block->data;
/* need reassembly? */
if ((control_block->secondary_ID != (kal_uint16) PHB_NULL_VALUE) &&
(sim_ext_record_index != (kal_uint8) PHB_INVALID_VALUE) &&
(phb_entry->tel_number.addr_length < L4_MAX_ADDR_BCD) &&
/* Only when address length is equal to PHB_EF_MAX_TON_NPI_TEL_NUMBER_LEN should need reassembly */
(ef_ext->ext_data_length == PHB_EF_EXT_MAX_TEL_NUMBER_LEN))
{
control_block->IO_stage = IO_REASSEMBLY;
control_block->IO_cnf_receive = phb_sim_read_cnf;
/* control_block->record_index = sim_ext_record_index; */
phb_sim_read_record(
control_block->secondary_ID,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -