|
楼主 |
发表于 2010-3-2 13:10:32
|
显示全部楼层
短信模版的修改
1.涉及的主要文件:SmsAppTemplates.c
IdleApp.c
2.控制的宏:__MMI_MESSAGES_PREDEFINED_TEMPLATE__
3.模版字符串ID:
static const U16 template_str[] =
{
STR_ID_SMS_TEMPLATE_1,
STR_ID_SMS_TEMPLATE_2,
STR_ID_SMS_TEMPLATE_3,
STR_ID_SMS_TEMPLATE_4,
STR_ID_SMS_TEMPLATE_5,
STR_ID_SMS_TEMPLATE_6,
STR_ID_SMS_TEMPLATE_7,
STR_ID_SMS_TEMPLATE_8,
STR_ID_SMS_TEMPLATE_9,
STR_ID_SMS_TEMPLATE_10
};
4.需要翻译对应语言的枚举
typedef enum
{
MSG_TEMPLATE_LANG_ENGLISH
,MSG_TEMPLATE_LANG_FRENCH
,MSG_TEMPLATE_LANG_SPANISH
,MSG_TEMPLATE_LANG_PORTUGUESE
,MSG_TEMPLATE_LANG_ITALIAN
,MSG_TEMPLATE_LANG_GERMAN
}mmi_sms_template_lang_enum
5.模版的NVRAM 的ID:
{
NVRAM_EF_SMS_LID,
NVRAM_SMS_TEMPL_RECORD_SIZE,
NVRAM_SMS_RECORD_TOTAL,
NVRAM_NORMAL(NVRAM_EF_ZERO_DEFAULT),
NVRAM_ATTR_AVERAGE,
NVRAM_CATEGORY_USER,
"MP0V",
VER(NVRAM_EF_SMS_LID),
"SMS",
NVRAM_APP_RESERVED
}
注意:此NV LID只用来存放短信预定义模版(不包括用户定义的),索引1是标识,填充’AAA’,从索引2开始才是模板,依次是是模板1(英文)模板2(英文)……模板10(英文);模板1(法文)模板2(法文)……模板10(法文) ……,语言按mmi_sms_template_lang_enum的枚举顺序
6.总入口:mmi_sms_init_templates(void),在开机初始化时调用(可以设断点,最好在PhnsetSetLangByNvramValue也设置,这样方便查看但前语言)。
注意点:
1. 必须注释掉下面代码,否则走不到下面
if (buffer[0] == 'A')
{
return TRUE;
}
2. 关键代码就是下面的部分了,完成了将所有模板字串对应的语言字串写入NVRAM_EF_SMS_LID对应的索引中(外循环控制语言,内循环控制10个模板)
for (i = 0; i < TOTAL_TEMPLATE_LANGUAGE; i++)
{
mmi_sms_set_template_language((U8) i);
if (mmi_sms_write_default_template_to_nvram() == MMI_FALSE)
{
return FALSE;
}
}
7.主要修改的函数:
a) mmi_sms_init_templates(void)
上面已经介绍
b)mmi_sms_set_template_language(U8 langtype)
主要是调用SetCurrentLanguage(i)(并不写NV中当前语言)修改语言相关的全局变量,以查找模字串ID对应语言下的翻译
c)mmi_sms_cal_template_base()
此函数返回所求语言的第一个偏移索引(lang_offset * NUM_TEMPLATES,lang_offset按照mmi_sms_template_lang_enum的枚举值),最终用来求templateindex的值,以往NVRAM_EF_SMS_LID对应的索引下写字串
WriteRecord(NVRAM_EF_SMS_LID, (templateindex + 2), template_data.record_buff,
NVRAM_SMS_TEMPL_RECORD_SIZE, &error)
在初始化的后段在NVRAM_EF_SMS_LID的索引1下写入AAA,以标记
WriteRecord(NVRAM_EF_SMS_LID, 1, templateSignature,
NVRAM_SMS_TEMPL_RECORD_SIZE, &error)
8.修改过程中遇到的主要问题:
a).修改完成后,模版显示语言和当前语言不一致:设置当前语言为英文,进短信模版显示的却是法文,其他语言也有类似情况。
断点跟踪发现问题出现在mmi_sms_cal_template_base(),当前语言是英文时,判断进的是 else if (IsFrenchSet ())
{
lang_offset = (U8)MSG_TEMPLATE_LANG_PORTUGUESE;
}
更奇怪的是VC中IsFrenchSet ()的返回值显示的是0,但程序还是走进这个判断中,将lang_offset设置为法语!最后的原因是IsXXXSet ()没有声明,此函数返回类型是pBOOL(16位),函数中要么return 0, 要么return 1,即使是return 0,当返回0时将8位转化为16位时,高8位是随机的,而且在VC中查看的值又确实是0,真实的值并不是0!!解决办法是在IdleAppProt.h中将IsXXXSet ()声明,并在SmsAppTemplates.c中包含此头文件!(此原因是同事讲解的,具体不知是否是这样的,欢迎遇到过此问题的朋友回帖指点)
b)上面的问题修正后,无法开机,在开机动画阶段卡住,并在console中出现ASSERT信息:“NvramInterface.c 875 writeMessage->result.flag == MMI_OK”。
即是往NV中写数据出现问题,而且每次毕现。原因:NVRAM_EF_SMS_LID分配的资源不足,共有18种语言,短信有10个模板,总共条数是1+18x10=181,而NVRAM_SMS_RECORD_TOTAL的值原先是141,所以将此值改为200,版本号加1,验证OK!
9.小结:上面主要分析的是开机模板初始化的过程(即写NV),开机后进短信模板应用没有分析(就是读NV了)。修改的过程主要是枚举中语言的增加及if else、case语句的添加,再就是SI搜索跟着原先的English改了。 |
|