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

📄 phb_handler_delete.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
static void phb_delete_ln_confirm(phb_errno_enum result, kal_uint8 src_id, control_block_type *control_block)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    l4cphb_write_ln_cnf_struct *param_ptr;
    peer_buff_struct *peer_buff_ptr = NULL;
    l4cphb_phb_ln_entry_array_struct *pdu_stream_ptr;
    nvram_ef_phb_ln_struct *record1, *record2 = NULL;
    kal_uint16 length;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    param_ptr = (l4cphb_write_ln_cnf_struct*)
        construct_local_para((kal_uint16) sizeof(l4cphb_write_ln_cnf_struct), TD_CTRL);

    param_ptr->src_id = src_id;
    param_ptr->result = result;
    param_ptr->cause = 0;
    param_ptr->total = 0;

    if ((result == PHB_ERRNO_SUCCESS) && (control_block->total_piggyback > 0))
    {
        param_ptr->total = control_block->total_piggyback;

        pdu_stream_ptr = (l4cphb_phb_ln_entry_array_struct*)
            l4cphb_alloc_ln_peer_buf(&peer_buff_ptr, param_ptr->total);

        /* pdu_stream_ptr->no_array = param_ptr->total;
           pdu_stream_ptr->array = (phb_ln_entry_struct *)get_ctrl_buffer
           (sizeof (phb_ln_entry_struct) * param_ptr->total); */

        record1 = (nvram_ef_phb_ln_struct*) get_pdu_ptr((peer_buff_struct*) control_block->data, &length);

        if (control_block->seg_total > 1)
        {
            record2 = (nvram_ef_phb_ln_struct*) get_pdu_ptr(control_block->peer_buf_ptr, &length);
        }

        if (control_block->seg_record_index >= PHB_MAX_LN_ENTRIES)
        {
            /* from file 2 */
            kal_mem_cpy(
                pdu_stream_ptr->array,
                &record2->array[control_block->seg_record_index - PHB_MAX_LN_ENTRIES],
                sizeof(phb_ln_entry_struct) * param_ptr->total);
        }
        else if (control_block->seg_record_index + param_ptr->total <= PHB_MAX_LN_ENTRIES)
        {
            /* from file 1 */
            kal_mem_cpy(
                pdu_stream_ptr->array,
                &record1->array[control_block->seg_record_index],
                sizeof(phb_ln_entry_struct) * param_ptr->total);
        }
        else
        {
            /* across 2 file */
            kal_uint8 count = record1->no_entry - control_block->seg_record_index;

            kal_mem_cpy(
                pdu_stream_ptr->array,
                &record1->array[control_block->seg_record_index],
                sizeof(phb_ln_entry_struct) * count);
            kal_mem_cpy(
                &pdu_stream_ptr->array[count],
                &record2->array[0],
                sizeof(phb_ln_entry_struct) * param_ptr->total - count);
        }

    }

    phb_send_ilm(MOD_L4C, MSG_ID_L4CPHB_DELETE_LN_CNF, param_ptr, peer_buff_ptr);
    /* if (peer_buff_ptr != NULL)
       free_ctrl_buffer (pdu_stream_ptr->array); */

    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);
        }
        phb_free_control_block(control_block);
    }

#ifdef __PHB_RECORD_LN_TYPE_SEQ__
    if (result == PHB_ERRNO_SUCCESS)
    {
        phb_write_ln_type_seq_handler(NULL, NULL);
    }
#endif /* __PHB_RECORD_LN_TYPE_SEQ__ */ 

}   /* end of phb_delete_ln_confirm */

#ifdef __PHB_RECORD_LN_TYPE_SEQ__


/*****************************************************************************
 * FUNCTION
 *  phb_shift_left_ln_type_seq
 * DESCRIPTION
 *  
 * PARAMETERS
 *  del_seq_index       [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
static void phb_shift_left_ln_type_seq(kal_uint8 del_seq_index)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (del_seq_index >= PHB_TOTAL_LN_ENTRIES - 1)
    {
        phb_ln_type_seq[PHB_TOTAL_LN_ENTRIES - 1] = 0xff;
    }
    else
    {
        while (del_seq_index < PHB_TOTAL_LN_ENTRIES - 1 && phb_ln_type_seq[del_seq_index + 1] != 0xff)
        {
            phb_ln_type_seq[del_seq_index] = phb_ln_type_seq[del_seq_index + 1];
            del_seq_index++;
        }
        /* last one should be 0xff */
        phb_ln_type_seq[del_seq_index] = 0xff;
    }
}


/*****************************************************************************
 * FUNCTION
 *  phb_delete_ln_type_seq
 * DESCRIPTION
 *  
 * PARAMETERS
 *  del_seq_index       [IN]        
 *  type                [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
static void phb_delete_ln_type_seq(kal_uint8 del_seq_index, kal_uint8 type)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint8 i = 0;
    kal_uint8 j = 0;
    kal_uint8 del_index = (PHB_TOTAL_LN_ENTRIES - 1);

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    //kal_uint8 update_type = phb_ln_type_seq[0];
    //kal_uint8 tmp_type;
    if (del_seq_index > 0)
    {
        for (del_index = PHB_TOTAL_LN_ENTRIES - 1; del_seq_index > 0; del_index--)
        {
            if (phb_ln_type_seq[del_index] == type)
            {
                del_seq_index--;
            }
        }
        del_index++;
        phb_shift_left_ln_type_seq(del_index);
    }
    else
    {
        while (i < del_index && phb_ln_type_seq[i] != 0xff)
        {
            if (phb_ln_type_seq[i] == type)
            {
                phb_ln_type_seq[i] = 0xff;
                j = i;
                phb_shift_left_ln_type_seq(i);
                while (phb_ln_type_seq[j] == type)
                {
                    phb_shift_left_ln_type_seq(j);
                }
            }
            i++;
        }
    }
}
#endif /* __PHB_RECORD_LN_TYPE_SEQ__ */ 


/*****************************************************************************
 * FUNCTION
 *  phb_delete_ln
 * DESCRIPTION
 *  
 * PARAMETERS
 *  record              [?]     
 *  control_block       [?]     
 * RETURNS
 *  
 *****************************************************************************/
static kal_bool phb_delete_ln(nvram_ef_phb_ln_struct *record, control_block_type *control_block)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint8 total, i;
    kal_uint16 len;
    nvram_ef_phb_ln_struct *record0 = NULL;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    record0 = (nvram_ef_phb_ln_struct*) get_pdu_ptr((peer_buff_struct*) control_block->data, &len);

    if (record != NULL)
    {
        total = record0->no_entry + record->no_entry;
    }
    else
    {
        total = record0->no_entry;
    }

    if (total - 1 < control_block->seg_record_index)
    {
        return KAL_FALSE;
    }

#if (MAX_PHB_LN_ENTRY > 20)
#ifdef __PHB_RECORD_LN_TYPE_SEQ__
    if (first_round)
    {
        phb_delete_ln_type_seq(
            (kal_uint8) (phb_get_ln_total_entry((kal_uint8) control_block->type) - control_block->index),
            (kal_uint8) control_block->type);
    }
#endif /* __PHB_RECORD_LN_TYPE_SEQ__ */ 
    if (!first_round)   /* need use shiftedEntry */
    {
        phb_ln_entry_struct buffer_entry;

        kal_mem_cpy(&buffer_entry, &shifted_entry, sizeof(phb_ln_entry_struct));
        if (record == NULL)
        {
            /* del entry in file 1 */
            i = control_block->seg_record_index;
            phb_ln_delete_entry(i, record0);
            control_block->seg_total = 0;
            kal_mem_cpy(&record0->array[PHB_MAX_LN_ENTRIES - 1], &shifted_entry, sizeof(phb_ln_entry_struct));
            record0->no_entry++;
        }
        else if (record->no_entry > 0)
        {
            /* del entry in file 1 and push one entry from file 2 to file 1 */
            i = control_block->seg_record_index;
            if (control_block->seg_total > 1)   /* at least 2 (one is itself) */
            {
                kal_mem_cpy(&shifted_entry, &record0->array[0], sizeof(phb_ln_entry_struct));
                phb_ln_delete_entry(0, record0);
            }
            else
            {
                phb_ln_delete_entry(i, record0);
            }
            kal_mem_cpy(&record0->array[PHB_MAX_LN_ENTRIES - 1], &record->array[0], sizeof(phb_ln_entry_struct));
            record0->no_entry++;
            phb_ln_delete_entry(0, record);
            kal_mem_cpy(&record->array[PHB_MAX_LN_ENTRIES - 1], &buffer_entry, sizeof(phb_ln_entry_struct));
            record->no_entry++;
        }
        else
        {
            /* del entry in file 1 */
            i = control_block->seg_record_index;
            phb_ln_delete_entry(i, record0);
            control_block->seg_total = 0;
            kal_mem_cpy(&record0->array[PHB_MAX_LN_ENTRIES - 1], &shifted_entry, sizeof(phb_ln_entry_struct));
            record0->no_entry++;
        }

    }
    else if (control_block->seg_record_index >= PHB_MAX_LN_ENTRIES)
#else /* (MAX_PHB_LN_ENTRY > 20) */ 

#ifdef __PHB_RECORD_LN_TYPE_SEQ__
    phb_delete_ln_type_seq((kal_uint8) (total - control_block->seg_record_index), control_block->type);
#endif 

    if (control_block->seg_record_index >= PHB_MAX_LN_ENTRIES)
#endif /* (MAX_PHB_LN_ENTRY > 20) */ /* MAX_PHB_LN_ENTRY > 20 */
    {
        /* del entry in file2 */
        i = control_block->seg_record_index - PHB_MAX_LN_ENTRIES;
        phb_ln_delete_entry(i, record);
    }
    else if (record == NULL)
    {
        /* del entry in file 1 */
        i = control_block->seg_record_index;
        phb_ln_delete_entry(i, record0);
    }
    else if (record->no_entry > 0)
    {
        /* del entry in file 1 and push one entry from file 2 to file 1 */
        i = control_block->seg_record_index;
    #if (MAX_PHB_LN_ENTRY > 20)
        if (control_block->seg_total > 1)   /* at least 2 (one is itself) */
        {
            kal_mem_cpy(&shifted_entry, &record0->array[0], sizeof(phb_ln_entry_struct));
            phb_ln_delete_entry(0, record0);
        }
        else
    #endif /* (MAX_PHB_LN_ENTRY > 20) */ 
            phb_ln_delete_entry(i, record0);
        kal_mem_cpy(&record0->array[PHB_MAX_LN_ENTRIES - 1], &record->array[0], sizeof(phb_ln_entry_struct));
        record0->no_entry++;
        phb_ln_delete_entry(0, record);
    }
    else
    {
        /* del entry in file 1 */
        i = control_block->seg_record_index;
        phb_ln_delete_entry(i, record0);
    }

    if ((total - control_block->seg_record_index - 1) < control_block->total_piggyback)
    {
        control_block->total_piggyback = total - control_block->seg_record_index - 1;
    }

    return KAL_TRUE;
}


/*****************************************************************************
 * FUNCTION
 *  phb_ln_delete_entry
 * DESCRIPTION
 *  
 * PARAMETERS
 *  index       [IN]        
 *  record      [?]         
 * RETURNS
 *  void
 *****************************************************************************/
static void phb_ln_delete_entry(kal_uint8 index, nvram_ef_phb_ln_struct *record)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint8 i;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    for (i = index + 1; i < record->no_entry; i++)
    {
        kal_mem_cpy(&record->array[i - 1], &record->array[i], sizeof(phb_ln_entry_struct));
    }
    record->no_entry--;
    return;
}

⌨️ 快捷键说明

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