⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phb_sim_access.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:

                        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 + -