资源加载过程
InitializeAll()
PopulateResData()
PopulateCallHistoryRes()
AddCallLogApplicationRes(); 未接电话,已拨电话,已接电话。
PopulateResetCallRes(); 删除通话记录
AddSMSCounterApplicationRes(); 短信计数器
PopulateCallTimes(); 通话时间
PopulateCallCost(); 通话cost
#ifdef __MMI_GPRS_FEATURES__
AddGPRSCounterApplicationRes(); GPRS计数器
#endif
系统初始化过程
InitializeAll()
InitCallLogs()
SetProtocolEventHandler(ReadyLogIndication, PRT_MMI_PHB_LAST_NUMBER_READY_IND);
SetHintHandler(….) 设置MENU的hilite和hint响应。注意:这里只设置了前3个MENU:未接电话,已拨电话,已接电话 中,涉及到的MENU的响应。
…
InitCallHistoryContext(); //初始化全局变量
memset((U8*) chis_p, 0, sizeof(call_history_context_struct));
ReadRecord(NVRAM_EF_CALL_TIME_LID, 1, (void*)&chis_p->last_call_time, sizeof(MYTIME), &error);
ReadRecord(NVRAM_EF_CALL_TIME_LID, 2, (void*)&chis_p->total_out_time, sizeof(MYTIME), &error);
ReadRecord(NVRAM_EF_CALL_TIME_LID, 3, (void*)&chis_p->total_in_time, sizeof(MYTIME), &error);
InitAllApplications()
InitCallCost(); //设置call cost中MENU的hilite and hint响应
InitCallHistory();
InitCallsReset(); //[删除通话记录]中MENU的响应
InitSMSCounter(); //[短信计数器]中MENU的响应
InitCallTimes(); //[通话时间]中MENU的响应
InitGPRSCounter(); //[GPRS计数器]中MENU的响应
启动过程:
上电后,当PS的call log准备好之后,发送消息:PRT_MMI_PHB_LAST_NUMBER_READY_IND给MMI,进入CBack函数:
ReadyLogIndication()
chis_p->isCallLogReady = TRUE;
chis_p->isFirstTime = TRUE;
chis_p->sequenceId = 0;
mmi_chist_init_get_data_from_nvram();读取missed call flag: g_chist_have_missed_call(0—no missed call, 1—yes missed call) 。NVRAM_CHIST_HAVE_MISSED_CALL。
if (g_chist_have_missed_call == 1)
IdleSetStatusIcon(STATUS_ICON_MISSED_CALL);
else
HideStatusIcon(STATUS_ICON_MISSED_CALL);
ReqReadDialedNum(); 开始读取call logs
return;
ReqReadDialedNum()
#ifndef __MMI_CH_MIXED_CALL_LOG__
chis_p->dialedCalls = (LOG_CALL*) chis_p->callsLog; // chis_p->callsLog[]是实际存储的位置,即如果不支持mixed call log,那么在分别进入3中类型的call logs
#endif //时,获取的call log都存储在chis_p->callsLog[]中。然后把3个指针之一指向这里。
设置消息PRT_MMI_PHB_GET_LAST_NUMBER_REQ的一些参数
SetProtocolEventHandler(RspReadDialedNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);
OslMsgSendExtQueue(&Message);
L4返回消息:PRT_MMI_PHB_GET_LAST_NUMBER_RSP,进入:
RspReadDialedNum()
rsp = (GET_LAST_NUMBER_RSP*) info;
if (chis_p->sequenceId == 1) //第一次读取,先清空缓冲区
{
chis_p->nDialedCalls = 0;
memset((PS8) chis_p->dialedCalls, 0, sizeof(LOG_CALL) * TOT_SIZE_OF_ONE_LN_LIST);
}
for (index = 0; index < rsp->no_list; index++) //抽取信息
{
CHISTExtractPSCallLog(&chis_p->dialedCalls[chis_p->nDialedCalls], &rsp->list[index]);
{
1.获取姓名在拷贝PS中的姓名到CALL LOG时,
如果是UCS2,注意:PS中存储方式是大端格式,要转换成系统中的小端格式
如果是ASCII码,AnsiiToUnicodeString((S8*) logCall->pbName, (S8*) phbLastNumber->alpha_id.name);
2.获取号码。PS中保存的号码是ASCII码
if (phbLastNumber->tel.type & 0x10)
{
logCall->number[0] = '+';
AnsiiToUnicodeString((PS8) (logCall->number + 2), (PS8) phbLastNumber->tel.number);
}
else
{
AnsiiToUnicodeString((PS8) logCall->number, (PS8) phbLastNumber->tel.number);
}
3.start time:ConvertRTC2MYTIME(&logCall->startTime, &phbLastNumber->time);
4. duration:mmi_dt_utc_sec_2_mytime(phbLastNumber->call_duration, &logCall->duration, MMI_FALSE);
5.counters:logCall->no_of_times = phbLastNumber->count;
}
chis_p->nDialedCalls++;
}
if (rsp->more_data && rsp->no_list == TOT_SIZE_OF_ONE_LN_LIST) 没有读取完,再次读取
{
chis_p->sequenceId++;
ASSERT(chis_p->sequenceId < 11);
ReqReadDialedNum();
return;
}
chis_p->sequenceId = 0; 所有dialed call全部提取完毕
if (chis_p->isFirstTime == TRUE) //表示这是在初始化时第一次读取,需要把所有的dialed,missed,received call log全部读取出来。
{
ReqReadMissedNum();
return;
}
//如果不是初始化时读取的,就进入这里,即:dialed call list
chis_p->isReqSent = FALSE;
EntryCHISTViewDialedCallList();
此时,由于我们是初始化时第一次读取call log,因此要一次性读取所有的call log,进入红色部分的if中去,即继续读取missed call log:
ReqReadMissedNum()
chis_p->missedCalls = (LOG_CALL*) chis_p->callsLog; 共用一个存储空间
消息:PRT_MMI_PHB_GET_LAST_NUMBER_REQ
SetProtocolEventHandler(RspReadMissedNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);
OslMsgSendExtQueue(&Message);
return;
PS返回消息PRT_MMI_PHB_GET_LAST_NUMBER_RSP,进入:
RspReadMissedNum()
if (chis_p->sequenceId == 1) 第一匹读取
{
chis_p->nMissedCalls = 0;
memset((PS8) chis_p->missedCalls, 0, sizeof(LOG_CALL) * TOT_SIZE_OF_ONE_LN_LIST);
}
for (index = 0; index < rsp->no_list; index++) 抽取call log,抽取函数都是相同的
{
CHISTExtractPSCallLog(&chis_p->missedCalls[chis_p->nMissedCalls], &rsp->list[index]);
chis_p->nMissedCalls++;
}
if (rsp->more_data && rsp->no_list == TOT_SIZE_OF_ONE_LN_LIST) 判断是否读取完毕
{
chis_p->sequenceId++;
ASSERT(chis_p->sequenceId < 11);
ReqReadMissedNum();
return;
}
chis_p->sequenceId = 0; 读取完毕
if (chis_p->isFirstTime == TRUE) 如果是初始化的话,继续读取received call log
{
ReqReadRecvdNum();
return;
}
chis_p->isReqSent = FALSE; 如果不是初始化,就进入missed call log list
EntryCHISTViewMissedCallList();
继续读取received call log
ReqReadRecvdNum()
chis_p->recvdCalls = (LOG_CALL*) chis_p->callsLog; 共用一个存储空间
SetProtocolEventHandler(RspReadRecvdNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);
OslMsgSendExtQueue(&Message);
return;
PS返回消息:PRT_MMI_PHB_GET_LAST_NUMBER_RSP,进入:
RspReadRecvdNum()
if (chis_p->sequenceId == 1) 初始化变量
{
chis_p->nRecvdCalls = 0;
memset((PS8) chis_p->recvdCalls, 0, sizeof(LOG_CALL) * TOT_SIZE_OF_ONE_LN_LIST);
}
for (index = 0; index < rsp->no_list; index++) 抽取消息
{
CHISTExtractPSCallLog(&chis_p->recvdCalls[chis_p->nRecvdCalls], &rsp->list[index]);
chis_p->nRecvdCalls++;
}
if (rsp->more_data && rsp->no_list == TOT_SIZE_OF_ONE_LN_LIST) 判断是否读取完毕
{
chis_p->sequenceId++;
ASSERT(chis_p->sequenceId < 11);
ReqReadRecvdNum();
return;
}
执行到这里时,说明已经读取完毕。
chis_p->sequenceId = 0;
//表示这是初始化时第一次读取。注意:这里直接返回。因为是初始化读取的,不是进入某个call log list,以此直接返回。
//以上读取的3种call log中,每次读取之后,所有的call log信息都是存储在同一个空间chis_p->callsLog[]。为什么是这样?我的理解:初始化的这次读取,仅仅 //是要证明每种call log都能够正确的读取出来。 在以后系统正常工作中,如果要进入某种call log,就单独读取某一种call log,并存储在这个空间中,然后show //出call log list。
if (chis_p->isFirstTime == TRUE)
{
chis_p->isFirstTime = FALSE;
return;
}
//进入到这里,说明不是初始化的读取,而是要进入received Call log list
chis_p->isReqSent = FALSE;
EntryCHISTViewRecvdCallList(); show received call log list。