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

📄 dcw_pb_sim.c

📁 重写的展迅电话本, 重写的展迅电话本, 重写的展迅电话本,
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
** File Name:      dcw_pb_sim.c                                              *
** Author:         *************                                             *
** Date:           2006-04-05                                                *
** Copyright:      2006 ************* All Rights                             *
** Description:    此文件包含与sim有关的操作                                 *
/*****************************************************************************
**                         Important Edit History                            *
** --------------------------------------------------------------------------*
** DATE                 NAME             DESCRIPTION                         *
** 2006-04-05           *************     Create                             *
******************************************************************************/

#ifndef _DCW_PB_SIM_C_
#define _DCW_PB_SIM_C_

#include "dcw_pb.h"
#include "mmi_signal_ext.h"

uint16   g_pb_operate_pos = 0;
uint16   g_pb_operate_offset = 0;
uint16   g_pb_simId = 0;   

/****************************************************************************
 *  Function name : DCW_PB_ReadOneRecordFromSim
 *  Description   : 从sim卡的第 "id" 个记录地址读出一条记录,放入 "record"
 *  Param         : record:读出的记录存放的地址
 *                  id  :从sim的哪个记录地址读出数据
 *  Return        : 读出的数据是否有效
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
BOOLEAN DCW_PB_ReadOneRecordFromSim(T_PB_SIM_RECORD *recordPtr, uint16 id,PHONEBOOK_STORAGE_E storage)
{
    uint8                     outLen = 0;
    uint8                     outStr[DCW_PB_M_STR_MAX_LEN];
    uint16                    len; 
    PHONEBOOK_ALPHABET_TYPE_E type;
    MN_NUMBER_TYPE_E          numberType;
    MN_NUMBER_PLAN_E          numberPlan;
    T_PB_SIM_SAVE_RECORD      saveRecord;
    BOOLEAN                   ret = FALSE;
    MMI_STRING_T              defaultStr; 

    SCI_MEMSET(recordPtr,0x00,sizeof(T_PB_SIM_RECORD));

    /* 读取的位置 */
    saveRecord.entry_id = (id + 1);

    /* 读取 */
    if(PHONEBOOK_ReadPhonebookEntry(storage, &saveRecord) == MN_RETURN_SUCCESS)
    {
        if(saveRecord.number_len > 0)
        {
            /* 姓名 */
            if(saveRecord.alpha_len > 0)
            {
                SCI_TRACE_LOW("\r\n--DCW_PB_ReadOneRecordFromSim-- g_pb.sim.nameMaxLen = %d", g_pb.sim.nameMaxLen);
                SCI_TRACE_LOW("\r\n--DCW_PB_ReadOneRecordFromSim-- saveRecord.alpha_len = %d", saveRecord.alpha_len);

                SCI_ASSERT(PHONEBOOK_DecodeAlphabetWithSimStandard
                          (&type, saveRecord.alpha_len, saveRecord.alpha, &outLen, outStr) == MN_RETURN_SUCCESS);
                /* ucs2码:两个uint8字符表示一个显示单元 */
                /* 非ucs2码:一个uint8表示一个显示单元,一般是ASCII码 */
                recordPtr->outerName.ucs2 = (type == PHONEBOOK_ALPHABET_UCS2) ? TRUE : FALSE;
                recordPtr->outerName.len = (uint8)MIN(g_pb.sim.nameMaxLen * 2 , outLen);
                SCI_MEMCPY(recordPtr->outerName.array, outStr, recordPtr->outerName.len);
                
                SCI_TRACE_LOW("\r\n--DCW_PB_ReadOneRecordFromSim-- outLen = %d", outLen);
            }
            else
            {   /* 如果无姓名,给一个默认的名字 */
                MMI_GetLabelTextByLang(TXT_CC_UNKNOW_NUM,&defaultStr);
                recordPtr->outerName.ucs2 = defaultStr.is_ucs2;
                recordPtr->outerName.len = MIN(g_pb.sim.nameMaxLen * 2, defaultStr.length);
                SCI_MEMCPY(recordPtr->outerName.array, defaultStr.str_ptr, recordPtr->outerName.len);
            }

            /* 电话号码 */
            len =(uint8)MIN(saveRecord.number_len, g_pb.sim.numberMaxLen);
            recordPtr->num.npi_ton = MMI_ChangeTypePlanToUint8(saveRecord.ton, saveRecord.npi);
            recordPtr->num.len = len;
            SCI_MEMCPY(recordPtr->num.number, saveRecord.number, len);
                
            /* 在Sim卡上的位置 */
            recordPtr->id = (saveRecord.entry_id - 1);
            ret = TRUE;
        }
    }

    return ret;
}

BOOLEAN DCW_PB_writeLocalRecordToSim(T_PB_SIM_RECORD *recordPtr,uint16 index)
{
    PHONEBOOK_ALPHABET_TYPE_E type;
    T_PB_SIM_SAVE_RECORD      saveRecord;
    T_PB_L_STRING             stringInfo;  

    if(recordPtr->outerName.ucs2 == TRUE)
    {
        type = PHONEBOOK_ALPHABET_UCS2;
    }
    else
    {
        type = PHONEBOOK_ALPHABET_ASCII;
    }
    SCI_ASSERT(PHONEBOOK_EncodeAlphabetToSimStandard(type, recordPtr->outerName.len,
                recordPtr->outerName.array, &stringInfo.len,stringInfo.array) == MN_RETURN_SUCCESS );
    saveRecord.alpha_len = MIN(DCW_PB_S_STR_MAX_LEN,stringInfo.len);
    SCI_MEMCPY(saveRecord.alpha, stringInfo.array, saveRecord.alpha_len);
    
    saveRecord.ton = (MN_NUMBER_TYPE_E)(recordPtr->num.npi_ton >> 4);
    saveRecord.npi = (MN_NUMBER_PLAN_E)(recordPtr->num.npi_ton & 0x0f);
    saveRecord.number_len = MIN(DCW_PB_BCD_NUMBER_MAX_LEN,recordPtr->num.len);        
    SCI_MEMCPY(saveRecord.number,recordPtr->num.number,saveRecord.number_len);    

    saveRecord.entry_id = index + 1;

    if(PHONEBOOK_UpdatePhonebookEntry(PHONEBOOK_MSISDN_STORAGE,&saveRecord) == MN_RETURN_SUCCESS)
    {
        return TRUE;
    }
    {
        return FALSE;
    }
}

/****************************************************************************
 *  Function name : DCW_PB_WriteOneRecordToSim
 *  Description   : 向SIM中写入一条记录
 *  Param         : record:写入记录存放的地址
 *                  isAdd :是否增加
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
BOOLEAN DCW_PB_WriteOneRecordToSim(T_PB_SIM_RECORD *recordPtr,BOOLEAN isAdd)
{
    uint16                    i = 0;
    uint16                    emptyId;
    uint16                    pos;
    PHONEBOOK_ALPHABET_TYPE_E type;
    T_PB_SIM_SAVE_RECORD      saveRecord;
    T_PB_L_STRING             stringInfo;  

    SCI_ASSERT(recordPtr != PNULL);
    SCI_MEMSET(&saveRecord, 0x00, sizeof(T_PB_SIM_SAVE_RECORD));

    if(recordPtr->outerName.ucs2 == TRUE)
    {
        type = PHONEBOOK_ALPHABET_UCS2;
    }
    else
    {
        type = PHONEBOOK_ALPHABET_ASCII;
    }
    
    SCI_ASSERT(PHONEBOOK_EncodeAlphabetToSimStandard(type, recordPtr->outerName.len,
                recordPtr->outerName.array, &stringInfo.len,stringInfo.array) == MN_RETURN_SUCCESS );    
 
    saveRecord.alpha_len = MIN(DCW_PB_S_STR_MAX_LEN,stringInfo.len);
    SCI_MEMCPY(saveRecord.alpha, stringInfo.array, saveRecord.alpha_len);
    
    saveRecord.ton = (MN_NUMBER_TYPE_E)(recordPtr->num.npi_ton >> 4);
    saveRecord.npi = (MN_NUMBER_PLAN_E)(recordPtr->num.npi_ton & 0x0f);
    saveRecord.number_len = MIN(DCW_PB_BCD_NUMBER_MAX_LEN,recordPtr->num.len);        
    SCI_MEMCPY(saveRecord.number,recordPtr->num.number,saveRecord.number_len);

    SCI_TRACE_LOW("\r\n--DCW_PB_WriteOneRecordToSim--saveRecord.alpha_len = %d", saveRecord.alpha_len);

    if(isAdd == TRUE)
    {
        recordPtr->id = DCW_PB_getEmptyId(&g_pb.sim.idManager);
    }
    saveRecord.entry_id = recordPtr->id + 1;


    if(PHONEBOOK_UpdatePhonebookEntry(PHONEBOOK_SIM_STORAGE,&saveRecord) == MN_RETURN_SUCCESS)
    {       /*******************Trace************/
        g_pb_simId = saveRecord.entry_id - 1;
        if(isAdd == TRUE)
        {              
            SCI_TRACE_LOW("\r\n--DCW_PB_WriteOneRecordToSim--Add--Sim ID = %d", g_pb_simId);
        }
        else
        {
            SCI_TRACE_LOW("\r\n--DCW_PB_WriteOneRecordToSim--Modify--Sim ID = %d", g_pb_simId);
        }

        return TRUE;
    }
    else
    {
        SCI_TRACE_LOW("\r\n--DCW_PB_WriteOneRecordToSim--Write Failed : %d",recordPtr->id);
        g_pb.operate.processing = FALSE;
        return FALSE;
    }
}
/****************************************************************************
 *  Function name : DCW_PB_deleteOneRecordFromSim
 *  Description   : 从SIM中删除一条记录
 *  Param         : None
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
void DCW_PB_deleteOneRecordFromSim(uint16 pos)
{   
    DCW_PB_deleteSimRecordCallBack(pos);
}

void DCW_PB_deleteManyRecordsFromSim(void)
{   
    T_PB_RECORD_ITEM_ADDR   *pAddr;

    pAddr = &g_pb.operate.listInfo.addrManager.ptr[g_pb.operate.listInfo.selectItemPtr[g_pb.operate.listInfo.selectNumber - 1]];

    SCI_ASSERT(pAddr->type == PHONEBOOK_SIM_STORAGE);

    DCW_PB_deleteSimRecordCallBack(pAddr->pos);
    g_pb.operate.listInfo.selectNumber--;
}

/****************************************************************************
 *  Function name : DCW_PB_deleteAllRecordFromSim
 *  Description   : 删除SIM卡中的所有记录
 *  Param         : void
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
void DCW_PB_deleteAllRecordFromSim(void)
{
    if(g_pb.sim.usedRecord > 0)
    {
        g_pb_simId = 0;
        DCW_PB_deleteSimRecordCallBack(g_pb.sim.usedRecord - 1);
    }  
}

/****************************************************************************
 *  Function name : DCW_PB_deleteSimRecordCallBack
 *  Description   : PS回调函数
 *  Param         : pos 删除的条目
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
BOOLEAN DCW_PB_deleteSimRecordCallBack(uint16 pos)
{
    uint16              i; 
    uint16              index;
    uint16              recordId;
    uint16              curPosInAll;
    T_PB_SIM_RECORD     simRecord;

    if(pos >= g_pb.sim.usedRecord)
    {
        SCI_TRACE_LOW("\r\n--DCW_PB_deleteSimRecordCallBack---go_out---pos = %d,max = %d",pos,g_pb.sim.usedRecord);
        return FALSE;
    }

    DCW_PB_adjustNumList(PNULL,(void *)&g_pb.sim.recordPtr[pos],PHONEBOOK_SIM_STORAGE,PB_DELETE_E);

    recordId = g_pb.sim.recordPtr[pos].id;
    curPosInAll   = g_pb.sim.recordPtr[pos].posInAll; 
    
    if((pos + 1)< g_pb.sim.usedRecord)
    {
        if(g_pb.sim.recordPtr[pos].keyEqualFront == FALSE &&
           g_pb.sim.recordPtr[pos + 1].keyEqualFront == TRUE)
        {
            g_pb.sim.recordPtr[pos + 1].keyEqualFront = FALSE;
        }
    }

    for(i = pos; i < g_pb.sim.usedRecord; i++)
    {
        g_pb.sim.recordPtr[i] = g_pb.sim.recordPtr[i + 1];
        g_pb.sim.recordPtr[i].posInAll--;
    }
    g_pb.sim.usedRecord--;

    for(i = 0; i < g_pb.nv.usedRecord; i++)
    {
        if(g_pb.nv.recordPtr[i].posInAll > curPosInAll)
        {
            g_pb.nv.recordPtr[i].posInAll--;
        }
    }    
    
    if(PHONEBOOK_DeletePhonebookEntry(PHONEBOOK_SIM_STORAGE,(uint32)(recordId + 1)) == MN_RETURN_SUCCESS) 
    {
        g_pb_simId = recordId;
        SCI_TRACE_LOW("\r\n--DCW_PB_deleteSimRecordCallBack---TRUE--Sim ID = %d", recordId);
        return TRUE;
    }
    else
    {
        SCI_TRACE_LOW("\r\n--DCW_PB_deleteSimRecordCallBack---FALSE--Sim ID = %d", recordId);
        g_pb.operate.processing = FALSE;
        return FALSE;
    }
}

/****************************************************************************
 *  Function name : DCW_PB_copyOneRecordFromNvToSim
 *  Description   : 把一条NV记录拷贝到SIM卡
 *  Param         : offset    电话类型
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
void DCW_PB_copyOneRecordFromNvToSim(uint8 offset)
{
    uint16              pos;
    BOOLEAN             ret;
    T_PB_RECORD_ITEM_ADDR *pAddr;
    T_PB_NV_RECORD     *nvRecordPtr;

     

    SCI_MEMSET(&g_pb_simRecord,0x00,sizeof(T_PB_SIM_RECORD));    
    
    pAddr = DCW_PB_getRecordAddr(g_pb.operate.listInfo.selectItemPtr[0]);
    SCI_ASSERT(pAddr != PNULL);
    pos = pAddr->pos;

    nvRecordPtr = &g_pb.nv.recordPtr[pos];

    g_pb_simRecord.outerName = nvRecordPtr->outerName;
    g_pb_simRecord.innerName = nvRecordPtr->innerName;
    g_pb_simRecord.shortName = nvRecordPtr->shortName;
    g_pb_simRecord.num = nvRecordPtr->num[offset];    
    ret = DCW_PB_WriteOneRecordToSim(&g_pb_simRecord,TRUE);
    if(ret == TRUE)
    {
        DCW_PB_adjustNumList((void *)&g_pb_simRecord,PNULL,PHONEBOOK_SIM_STORAGE,PB_ADD_E);
        DCW_PB_insertOneRecordToSimList(&g_pb_simRecord);
    }
}

void DCW_PB_copyManyRecordsFromNvToSim(void)
{
    T_PB_RECORD_ITEM_ADDR *pAddr;

    g_pb_operate_pos = 0;
    g_pb_operate_offset = 0;
    g_pb_simId = 0;

    pAddr = DCW_PB_getRecordAddr(g_pb.operate.listInfo.selectItemPtr[g_pb.operate.listInfo.selectNumber-1]);
    DCW_PB_updateSimRecordCallBack(pAddr->pos,pAddr->offset,TRUE);
    g_pb.operate.listInfo.selectNumber--;
}

/****************************************************************************
 *  Function name : DCW_PB_copyAllRecordsFromNvToSim
 *  Description   : 把所有NV记录拷贝到SIM卡
 *  Param         : offset    电话类型
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
void DCW_PB_copyAllRecordsFromNvToSim()
{
    g_pb_operate_pos = 0;
    g_pb_operate_offset = 0;
    g_pb_simId = 0;
    DCW_PB_updateSimRecordCallBack(0,0,TRUE);
}
/****************************************************************************
 *  Function name : DCW_PB_updateSimRecordCallBack
 *  Description   : 向SIM中写入一条记录
 *  Param         : pos:写入记录存放的地址
                    offset:电话偏移
 *                  add :是否增加
 *  Return        : None
 *  Author:       : *************
 *  Note          : None 
 *****************************************************************************/
BOOLEAN DCW_PB_updateSimRecordCallBack(uint16 pos,uint16 offset,BOOLEAN isAdd)
{
    uint16  i;
    uint16  j;
    BOOLEAN ret;

    SCI_TRACE_LOW("\r\n--DCW_PB_updateSimRecordCallBack---START--pos = %d,offset = %d", pos,offset);

    if(offset >= DCW_PB_MAX_NV_PHONE_NUM)
    {
        pos++;
        offset = 0;
    }
    if(pos >= g_pb.nv.maxRecord)
    {
        return FALSE;
    }

⌨️ 快捷键说明

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