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

📄 phb_handler_write.c

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

                phb_control_block_set_param(control_block, WRITE_USIM_ANR, NULL, NULL);

                phb_control_block_set(
                    control_block,
                    phb_write_continue,
                    phb_write_usim_handler,
                    phb_write_err_handler,
                    WRITE_USIM_ANR);
                phb_control_block_set_IO(control_block, l4cphb_write_req->type, phb_entry->index, 1);

                /**
                  * Temporarily stores number of entries to be piggybacked.
                  * Don't forget to restore it back to control_block->total before read_fake(), if necessary.
                  */
                control_block->total_piggyback = l4cphb_write_req->total;

                /* set storage, record_index, primary_ID, and secondary_ID */
                if (phb_se_set_control_block(
                        control_block,
                        OP_WRITE,
                        phb_entry->storage,
                        phb_entry->record_index) == KAL_FALSE)
                {
                    phb_write_usim_err_handler(NULL, control_block);
                    return;
                }

                if (l4c_is_src_from_rmmi(control_block->src_id))
                {
                    phb_entry->index = control_block->index;
                }

                /* data stores data to be written, and length is record size of storage */
                control_block->data = (kal_uint8*) & control_block->temp_entry;
                control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));

                phb_write_continue(NULL, control_block);
            }
            /* error */
            else
            {
                phb_write_usim_err_handler(NULL, control_block);
                return;
            }
        }
        /* error */
        else
        {
            kal_trace(TRACE_ERROR, ERROR_PHB_STATE);

            control_block->actual_count = 0;
            phb_free_control_block(control_block);
            control_block = NULL;
            phb_write_usim_confirm(PHB_ERRNO_BUSY, 0, l4cphb_write_req->src_id, control_block);
            return;
        }

    }
    /* Write ANR */
    else if (control_block->proc_stage <= WRITE_USIM_ANR && phb_ptr->anra_type != 0)
    {
        kal_uint16 anr_index = 0;

        phb_control_block_set_param(control_block, WRITE_USIM_EMAIL, NULL, NULL);

        if (phb_ptr->anra_type == 1)
        {
            anr_index = control_block->temp_entry.record_index;
        }
        else if (phb_ptr->anra_type == 2)
        {
            /* add operation */
            if (control_block->temp_anra.adn_record_index == (kal_uint16) PHB_INVALID_VALUE &&
                control_block->temp_anra.tel_number.addr_length == 0)
            {
                /* don't need to write e-mail field */
                phb_write_usim_handler(NULL, control_block);
                return;
            }
            else    /* add non-empty email or edit operation */
            {
                anr_index = phb_se_iap_index_find(control_block->temp_anra.adn_record_index, DATA_DESC_ANRA);
                if (anr_index == (kal_uint16) PHB_INVALID_VALUE)
                {
                    anr_index = phb_data_desc_find_next_free(DATA_DESC_ANRA);
                }
                control_block->temp_anra.record_index = anr_index;
            }
            /* the final adn index. */
            control_block->temp_anra.adn_record_index = control_block->temp_entry.record_index;
        }
        phb_control_block_set(
            control_block,
            phb_write_continue,
            phb_write_usim_handler,
            phb_write_err_handler,
            WRITE_USIM_EMAIL);
        phb_control_block_set_IO(control_block, PHB_ANR, anr_index, 1);

        /* set storage, record_index, primary_ID, and secondary_ID */
        control_block->primary_ID = FILE_G_ANR_IDX;
        control_block->secondary_ID = FILE_G_EXT1_IDX;
        kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
        control_block->path[4] = phb_ptr->path[DATA_DESC_ANRA][0];
        control_block->path[5] = phb_ptr->path[DATA_DESC_ANRA][1];
        // TODO: need more test
        control_block->record_index = anr_index;
        /*
         * if (phb_se_set_control_block(control_block,
         * OP_WRITE,
         * PHB_SIM,
         * control_block->temp_entry.index) ==
         * KAL_FALSE)
         * {
         * phb_write_usim_err_handler(NULL, control_block);
         * return;
         * }
         */
        //if (control_block->src_id == RMMI_SRC)
        //   phb_entry->index = control_block->index;

        /* data stores data to be written, and length is record size of storage */
        control_block->data = (kal_uint8*) & control_block->temp_anra;
        control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));

        phb_write_continue(NULL, control_block);
    }
    /* Write EMAIL */
    else if (control_block->proc_stage <= WRITE_USIM_EMAIL && phb_ptr->email_type != 0)
    {
        kal_uint16 email_index = (kal_uint16) PHB_INVALID_VALUE;

        phb_control_block_set_param(control_block, WRITE_USIM_SNE, NULL, NULL);

        if (phb_ptr->email_type == 1)
        {
            email_index = control_block->temp_entry.record_index;
        }
        else if (phb_ptr->email_type == 2)
        {
            /* add operation */
            if (control_block->temp_email_entry.adn_record_index == (kal_uint16) PHB_INVALID_VALUE &&
                control_block->temp_email_entry.email_length == 0)
            {
                /* don't need to write e-mail field */
                phb_write_usim_handler(NULL, control_block);
                return;
            }
            else    /* add non-empty email or edit operation */
            {
                email_index = phb_se_iap_index_find(control_block->temp_email_entry.adn_record_index, DATA_DESC_EMAIL);
                if (email_index == (kal_uint16) PHB_INVALID_VALUE && control_block->temp_email_entry.email_length == 0) /* both empty */
                {
                    /* don't need to write e-mail field */
                    phb_write_usim_handler(NULL, control_block);
                    return;
                }
                else if (email_index != (kal_uint16) PHB_INVALID_VALUE && control_block->temp_email_entry.email_length == 0)    /* modify from non-empty to empty */
                {
                    /* no releation with adn. */
                    control_block->temp_email_entry.adn_record_index = 0xFF;
                    control_block->temp_iap[phb_ptr->iap_email] = 0xFF;
                }
                else
                {
                    if (email_index == (kal_uint16) PHB_INVALID_VALUE)  /* origin is empty */
                    {
                        email_index = phb_data_desc_find_next_free(DATA_DESC_EMAIL);
                        if (email_index == (kal_uint16) PHB_INVALID_VALUE)      /* can't find empty record */
                        {
                            ASSERT(0);
                            phb_write_usim_handler(NULL, control_block);
                            return;
                        }
                    }
                    /* the final adn index. */
                    control_block->temp_email_entry.adn_record_index = control_block->temp_entry.record_index;
                    control_block->temp_iap[phb_ptr->iap_email] = email_index;
                }
                control_block->temp_email_entry.record_index = email_index;
            }
        }

        phb_control_block_set(
            control_block,
            phb_write_continue,
            phb_write_usim_handler,
            phb_write_err_handler,
            WRITE_USIM_SNE);
        phb_control_block_set_IO(control_block, PHB_EMAIL, email_index, 1);

        /* set storage, record_index, primary_ID, and secondary_ID */
        control_block->primary_ID = FILE_G_EMAIL_IDX;
        control_block->secondary_ID = FILE_NONE;
        kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
        control_block->path[4] = phb_ptr->path[DATA_DESC_EMAIL][0];
        control_block->path[5] = phb_ptr->path[DATA_DESC_EMAIL][1];
        control_block->record_index = email_index;
        /*
         * if (phb_se_set_control_block(control_block,
         * OP_WRITE,
         * PHB_SIM,
         * control_block->temp_entry.index) ==
         * KAL_FALSE)
         * {
         * phb_write_usim_err_handler(NULL, control_block);
         * return;
         * }
         */
        //if (control_block->src_id == RMMI_SRC)
        //   phb_entry->index = control_block->index;

        /* data stores data to be written, and length is record size of storage */
        control_block->data = (kal_uint8*) & control_block->temp_email_entry;
        control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));

        phb_write_continue(NULL, control_block);
    }
    /* Write IAP */
    else if (control_block->proc_stage <= WRITE_USIM_IAP &&
             phb_ptr->data_desc[DATA_DESC_IAP].record_size > 0)
    {
        phb_control_block_set_param(control_block,
                                    WRITE_USIM_GRP,
                                    NULL,
                                    NULL);
 
       phb_control_block_set(control_block,
                             phb_write_continue,
                             phb_write_usim_handler,
                             phb_write_err_handler,
                             WRITE_USIM_CONTINUE);
       phb_control_block_set_IO(control_block,
                                PHB_IAP,
                                control_block->temp_entry.record_index,
                                1);
 
       /* set storage, record_index, primary_ID, and secondary_ID */
       control_block->primary_ID = FILE_G_IAP_IDX;
       control_block->secondary_ID = FILE_NONE;
       kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
       control_block->path[4] = phb_ptr->path[DATA_DESC_IAP][0];
       control_block->path[5] = phb_ptr->path[DATA_DESC_IAP][1];
       control_block->record_index = control_block->temp_entry.record_index;
 
       /* data stores data to be written, and length is record size of storage */
       control_block->data = control_block->temp_iap;
       control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));
       phb_write_continue(NULL, control_block);
    }
    /* Write Group */
    else if (control_block->proc_stage <= WRITE_USIM_GRP && phb_ptr->data_desc[DATA_DESC_GRP].is_support)
    {
        phb_control_block_set_param(control_block, WRITE_USIM_CONTINUE, NULL, NULL);

        phb_control_block_set(
            control_block,
            phb_write_continue,
            phb_write_usim_handler,
            phb_write_err_handler,
            WRITE_USIM_CONTINUE);
        phb_control_block_set_IO(control_block, PHB_GRP, control_block->temp_entry.record_index, 1);

        /* set storage, record_index, primary_ID, and secondary_ID */
        control_block->primary_ID = FILE_G_GRP_IDX;
        control_block->secondary_ID = FILE_NONE;
        kal_mem_cpy(control_block->path, usim_ef_info[FILE_G_PHONEBOOK_IDX].full_path, 4);
        control_block->path[4] = phb_ptr->path[DATA_DESC_GRP][0];
        control_block->path[5] = phb_ptr->path[DATA_DESC_GRP][1];
        control_block->record_index = control_block->temp_entry.record_index;
        /*
         * if (phb_se_set_control_block(control_block,
         * OP_WRITE,
         * PHB_SIM,
         * control_block->temp_entry.index) ==
         * KAL_FALSE)
         * {
         * phb_write_usim_err_handler(NULL, control_block);
         * return;
         * }
         */
        //if (control_block->src_id == RMMI_SRC)
        //   phb_entry->index = control_block->index;

        /* data stores data to be written, and length is record size of storage */
        *control_block->data = control_block->temp_group_id;
        control_block->length = phb_data_desc_get_record_size(phb_data_desc_get_desc_by_ID(control_block->primary_ID));

        phb_write_continue(NULL, control_block);
    }

    /* Write confirmed */
    else if (control_block->proc_stage <= WRITE_USIM_CONTINUE)
    {
        /* Piggyback is not required. */
        if (control_block->total_piggyback < 1)
        {
            phb_write_usim_confirm(
                PHB_ERRNO_SUCCESS,
                control_block->actual_count,
                control_block->src_id,
                control_block);
        }
        /* Piggyback is required */
        else
        {
            /* Now we have to transform the state to a *FAKE* read state. */
            phb_entry_struct *phb_entry;

            /* Restore total_piggyback */
            control_block->total = control_block->total_piggyback;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -