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

📄 phb_handler_delete.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    local_para_struct *local_param_ptr = NULL;

    l4cphb_delete_cnf_struct *l4cphb_delete_cnf;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_FUNC, FUNC_PHB_DELETE_CNF, result, actual_count, src_id);

    l4cphb_delete_cnf = (l4cphb_delete_cnf_struct*) construct_local_para(sizeof(l4cphb_delete_cnf_struct), TD_CTRL);
    l4cphb_delete_cnf->total = actual_count;
    l4cphb_delete_cnf->src_id = src_id;

    local_param_ptr = (local_para_struct*) l4cphb_delete_cnf;

    /* If result is PHB_ERRNO_BUSY, reject newly received request */
    l4cphb_delete_cnf->result = result;

    /* Confirm to in-processing operation */
    if (result != PHB_ERRNO_BUSY)
    {
        /* Field `cause' is meaningful when I/O occured by using control blocks */
        l4cphb_delete_cnf->cause = control_block->cause;
        l4cphb_delete_cnf->old_index = control_block->candidate;

        phb_free_control_block(control_block);
    }

    phb_send_ilm(MOD_L4C, MSG_ID_L4CPHB_DELETE_CNF, local_param_ptr, NULL);
}   /* end of phb_delete_confirm */


/*****************************************************************************
 * FUNCTION
 *  phb_delete_ln_handler
 * DESCRIPTION
 *  This is phb_delete_ln_handler function of PHB module.
 *  Handles delete last number request from L4C.
 * PARAMETERS
 *  ilm_ptr             [IN]        The primitives
 *  control_block       [?]         
 * RETURNS
 *  void
 *****************************************************************************/
void phb_delete_ln_handler(ilm_struct *ilm_ptr, control_block_type *control_block)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (ilm_ptr != NULL)
    {
        /* Cannot allocate, means that PHB is still operating. Reject request! */
        if (control_block == NULL)
        {
            l4cphb_delete_ln_req_struct *msg_ptr;

            msg_ptr = (l4cphb_delete_ln_req_struct*) ilm_ptr->local_para_ptr;
        #if (MAX_PHB_LN_ENTRY > 20)
            first_round = KAL_TRUE;
        #endif 
            control_block = phb_alloc_control_block();

            if (control_block == NULL)
            {
                phb_delete_ln_confirm(PHB_ERRNO_BUSY, msg_ptr->src_id, control_block);
                return;
            }
            /* Retain msg_id */
            control_block->cnf_msg_id = ilm_ptr->msg_id;
            control_block->src_id = msg_ptr->src_id;
        }

        /* if (phb_ptr->state == PHB_STATE_READY) */
        {
            if (control_block->proc_stage == DEL_LN_NONE)
            {
                l4cphb_delete_ln_req_struct *msg_ptr = (l4cphb_delete_ln_req_struct*) ilm_ptr->local_para_ptr;

            #if (MAX_PHB_LN_ENTRY > 20)
                kal_uint8 no_skip;
                kal_uint8 seg_total;

                if (msg_ptr->index == 0xff)
                {
                    no_skip = 0;
                }
                else
                {
                    no_skip = msg_ptr->index / PHB_MAX_LN_ENTRIES;      /* 0-based */
                }
                seg_total = ((phb_get_ln_total_entry(msg_ptr->type) + PHB_MAX_LN_ENTRIES - 1)
                             / PHB_MAX_LN_ENTRIES) - no_skip;
                control_block->index = msg_ptr->index;
            #endif /* (MAX_PHB_LN_ENTRY > 20) */ 

                /* save req info */
                control_block->IO_cnf_receive = phb_delete_ln_handler;
                control_block->seg_record_index = msg_ptr->index;
                control_block->src_id = msg_ptr->src_id;
                control_block->type = msg_ptr->type;

                if (control_block->type == PHB_LND)
                {
                    control_block->seg_total = PHB_TOT_LND_LIDS;
                    control_block->secondary_ID = PHB_LND_LID_START;
                }
                else if (control_block->type == PHB_LNM)
                {
                    control_block->seg_total = PHB_TOT_LNM_LIDS;
                    control_block->secondary_ID = PHB_LNM_LID_START;
                }
                else if (control_block->type == PHB_LNR)
                {
                    control_block->seg_total = PHB_TOT_LNR_LIDS;
                    control_block->secondary_ID = PHB_LNR_LID_START;
                }
                else
                {
                    phb_delete_ln_confirm(PHB_ERRNO_FAIL, control_block->src_id, control_block);
                }

                if (msg_ptr->index == 0xff)
                {
                    /* delete all */
                    control_block->total_piggyback = 0;
                    control_block->data = get_ctrl_buffer(sizeof(nvram_ef_phb_ln_struct));
                    kal_mem_set(control_block->data, 0, sizeof(nvram_ef_phb_ln_struct));

                    if (control_block->seg_total > 1)
                    {
                        control_block->proc_stage = DEL_LN_WRITE_CONTINUE;
                    }
                    else
                    {
                        control_block->proc_stage = DEL_LN_WRITE;
                    }

                    phb_write_ln_to_nvram((nvram_ef_phb_ln_struct*) control_block->data, control_block);
                #ifdef __PHB_RECORD_LN_TYPE_SEQ__
                    phb_delete_ln_type_seq(0, (kal_uint8) control_block->type);
                #endif 

                    free_ctrl_buffer(control_block->data);
                    return;
                }
            #if (MAX_PHB_LN_ENTRY > 20)
                control_block->seg_total = seg_total;
                if (seg_total <= 2)
                {
                    control_block->secondary_ID += no_skip;
                }
                else    /* need backward read */
                {
                    control_block->secondary_ID +=
                        (PHB_TOT_LNM_LIDS - (PHB_TOT_LNM_LIDS - seg_total) - 1 - 1 + no_skip);
                }
                control_block->seg_record_index -= (PHB_MAX_LN_ENTRIES * no_skip);
            #endif /* (MAX_PHB_LN_ENTRY > 20) */ 

                control_block->proc_stage = DEL_LN_READ;
                control_block->total_piggyback = msg_ptr->total;

                phb_read_ln_from_nvram(control_block);
                return;
            }
            else if (control_block->proc_stage == DEL_LN_READ)
            {
                kal_bool updated;
                kal_uint16 length;
                nvram_read_cnf_struct *msg_ptr = NULL;
                nvram_ef_phb_ln_struct *pdu_data;

                msg_ptr = (nvram_read_cnf_struct*) ilm_ptr->local_para_ptr;
                control_block->IO_stage = IO_NONE;

                if (msg_ptr->result == NVRAM_IO_ERRNO_OK)
                {
                    pdu_data = (nvram_ef_phb_ln_struct*) get_pdu_ptr(ilm_ptr->peer_buff_ptr, &length);

                    /* keep first read data in control_block->data */
                    hold_peer_buff(ilm_ptr->peer_buff_ptr);
                    control_block->data = (kal_uint8*) ilm_ptr->peer_buff_ptr;

                    /* if (control_block->type != PHB_LND)
                       {
                       control_block->secondary_ID ++;
                       control_block->proc_stage = DEL_LN_READ_CONTINUE;
                       
                       phb_read_ln_from_nvram (control_block);
                       return;
                       }
                       else
                       { */
                    if (control_block->seg_total > 1)
                    {
                        control_block->secondary_ID++;
                        control_block->seg_total--;
                        control_block->proc_stage = DEL_LN_READ_CONTINUE;

                        phb_read_ln_from_nvram(control_block);
                        return;
                    }
                    else
                    {
                        control_block->proc_stage = DEL_LN_WRITE;
                        updated = phb_delete_ln(NULL, control_block);

                        if (updated == KAL_TRUE)
                        {
                            /* write LND file */
                            phb_write_ln_to_nvram(NULL, control_block);
                            return;
                        }
                    }
                    /* } */
                }
                phb_delete_ln_confirm(PHB_ERRNO_READ_FAIL, control_block->src_id, control_block);
            }
            else if (control_block->proc_stage == DEL_LN_READ_CONTINUE)
            {
                kal_bool updated;
                kal_uint16 length;
                nvram_read_cnf_struct *msg_ptr = NULL;
                nvram_ef_phb_ln_struct *pdu_data;

                msg_ptr = (nvram_read_cnf_struct*) ilm_ptr->local_para_ptr;
                control_block->IO_stage = IO_NONE;

                if (msg_ptr->result == NVRAM_IO_ERRNO_OK)
                {
                    pdu_data = (nvram_ef_phb_ln_struct*) get_pdu_ptr(ilm_ptr->peer_buff_ptr, &length);

                    /* keep second read data in control_block->peer_buf_ptr */
                    hold_peer_buff(ilm_ptr->peer_buff_ptr);
                    control_block->peer_buf_ptr = ilm_ptr->peer_buff_ptr;

                    updated = phb_delete_ln(pdu_data, control_block);

                    if (updated == KAL_TRUE)
                    {
                        control_block->proc_stage = DEL_LN_WRITE_CONTINUE;

                        /* write second file */
                        phb_write_ln_to_nvram(pdu_data, control_block);
                        return;
                    }
                }
                phb_delete_ln_confirm(PHB_ERRNO_FAIL, control_block->src_id, control_block);
            }
            else if (control_block->proc_stage == DEL_LN_WRITE_CONTINUE)
            {
                nvram_write_cnf_struct *msg_ptr = NULL;

                msg_ptr = (nvram_write_cnf_struct*) ilm_ptr->local_para_ptr;
                control_block->IO_stage = IO_NONE;

                if (msg_ptr->result == NVRAM_IO_ERRNO_OK)
                {
                    if (control_block->seg_record_index == 0xff)
                    {
                        /* delete all */
                        control_block->data = get_ctrl_buffer(sizeof(nvram_ef_phb_ln_struct));
                        kal_mem_set(control_block->data, 0, sizeof(nvram_ef_phb_ln_struct));

                        control_block->secondary_ID++;
                        control_block->seg_total--;
                        if (control_block->seg_total <= 1)
                        {
                            control_block->proc_stage = DEL_LN_WRITE;
                        }
                        phb_write_ln_to_nvram((nvram_ef_phb_ln_struct*) control_block->data, control_block);

                        free_ctrl_buffer(control_block->data);
                        return;
                    }
                    control_block->proc_stage = DEL_LN_WRITE;
                    control_block->secondary_ID--;

                    /* write first file */
                    phb_write_ln_to_nvram(NULL, control_block);
                    return;
                }
                else
                {
                    /* error */
                    phb_delete_ln_confirm(PHB_ERRNO_FAIL, control_block->src_id, control_block);
                }
            }
            else if (control_block->proc_stage == DEL_LN_WRITE)
            {
                nvram_write_cnf_struct *msg_ptr = NULL;

                msg_ptr = (nvram_write_cnf_struct*) ilm_ptr->local_para_ptr;
                control_block->IO_stage = IO_NONE;
            #if (MAX_PHB_LN_ENTRY > 20)
                if (control_block->seg_total > 1)
                {
                    control_block->seg_total--;
                    if (control_block->seg_total == 1)
                    {
                        control_block->secondary_ID -= 1;
                    }
                    else
                    {
                        control_block->secondary_ID -= 2;
                    }
                    control_block->proc_stage = DEL_LN_READ;
                    if (control_block != NULL)
                    {
                        if (control_block->data != NULL)
                        {
                            free_peer_buff((peer_buff_struct*) control_block->data);
                        }
                        if (control_block->peer_buf_ptr != NULL)
                        {
                            free_peer_buff(control_block->peer_buf_ptr);
                        }
                    }
                    first_round = KAL_FALSE;
                    phb_read_ln_from_nvram(control_block);
                    return;
                }
            #endif /* (MAX_PHB_LN_ENTRY > 20) */ /* MAX_PHB_LN_ENTRY > 20 */

                if (msg_ptr->result == NVRAM_IO_ERRNO_OK)
                {
                    phb_delete_ln_confirm(PHB_ERRNO_SUCCESS, control_block->src_id, control_block);
                }
                else
                {
                    phb_delete_ln_confirm(PHB_ERRNO_FAIL, control_block->src_id, control_block);
                }
            }
            else
                /* wrong state */
            {
                phb_delete_ln_confirm(PHB_ERRNO_FAIL, control_block->src_id, control_block);
            }
        }
        /* else
           phb_delete_ln_confirm (PHB_ERRNO_BUSY,
           control_block->src_id, control_block); */
    }
    else
    {
        phb_delete_ln_confirm(PHB_ERRNO_FAIL, control_block->src_id, control_block);
    }
}


/*****************************************************************************
 * FUNCTION
 *  phb_delete_ln_confirm
 * DESCRIPTION
 *  This is phb_delete_ln_confirm function of PHB module.
 * PARAMETERS
 *  result              [IN]        
 *  src_id              [IN]        
 *  control_block       [?]         
 *  ilm_ptr(?)          [IN]        The primitives
 * RETURNS
 *  void
 *****************************************************************************/

⌨️ 快捷键说明

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