Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40759
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-05 10:27
文章分类
文章存档

2011年(1)

2009年(1)

2008年(16)

我的朋友

分类: 项目管理

2008-12-09 13:33:08

对应 system setting 里的设置,我们定义了一个结构体来保存,以便下次开机可以使用我们之前保留的配置。本文解析该配置文件的生成、载入、修改过程。
首先,定义了一些资源为后面的工作服务:
//定义一个文件名的指针,稍后会用此指针的内容(smedia.cfg)为名生成一个配置文件,保存于nand中
cfgFileName = NAND_VOLUME L"smedia.cfg";   
cfg 总结构体的入口:
static SMTK_CONFIG* cfgEntries[] =
{
    (SMTK_CONFIG*) &smtkFontMgrCfg,
    (SMTK_CONFIG*) &smtkSlideShowMgrCfg,
    (SMTK_CONFIG*) &smtkPowerMgrCfg,
    (SMTK_CONFIG*) &smtkScreenMgrCfg,
    (SMTK_CONFIG*) &smtkDirMgrCfg,
    (SMTK_CONFIG*) &smtkAlarmMgrCfg,
    (SMTK_CONFIG*) &smtkCalendarMgrCfg,
    (SMTK_CONFIG*) &smtkAudioMgrCfg,
    (SMTK_CONFIG*) &smtkHashMgrCfg,
};
我们看其中的一个 smtkSlideShowMgrCfg:
SMTK_SLIDE_SHOW_MGR_CONFIG smtkSlideShowMgrCfg =
{
    {
        SMTK_CFG_SLIDE_SHOW_MGR         // id
    },
    5,                                  // duration
    SMTK_SS_DISPLAY_MODE_FULL_PIC_CEN,
    SMTK_SS_EFFECT_CATALOG_RANDOM,
    MMP_TRUE,                          // bgm
    MMP_TRUE,                           // autoSlideshow
    SMTK_STATE_SLIDE_SHOW           // startupState
};
此结构体其实比较简单,只是保留了一些 Slideshow 会用到的相关信息:例如多就后会换图、显示模式等等。其他雷同。定义好这些资源后,就可以开始动作了。先看初始化部分:smtkCfgMgrInitialize。
该函数一进来,直接就去读cfgFile = PalTFileOpen(cfgFileName, PAL_FILE_RB, MMP_NULL);也就是在固定位置去找那个 smedia.cfg,如果找到,就把配置文件里的值读出来,放到 cfgEntries 中。其实,在程序第一次跑起来的时候,smedia.cfg 并没有马上被创建,所以这里的
    cfgFile = PalTFileOpen(cfgFileName, PAL_FILE_RB, MMP_NULL);
    if (cfgFile)
    {
        ……
    }
也有可能是失败的。但是这其实并没有关系,因为在定义 cfgEntries  的时候,里面的每个结构体元素,我们已经给他们附了初始值了,所以如果没有 smedia.cfg ,则按那些初始值当默认值使用。至于 smedia.cfg  最终是在什么地方被创建,后面再详解。先来看有找到  smedia.cfg  的情况:
这里思路也比较清晰,主要步骤有:
1、定义一个 ptr 的指针,指向该结构体的首地址
2、计算该结构体需要占用多大空间
3、为指针 ptr 分配空间,其实也就是为结构体分配空间
4、读取 smedia.cfg 的值,赋给 ptr 所指向的结构体,至此,这个 smedia.cfg 已经被保存在ram 中
5、计算该 smedia.cfg 的 checksum,并将值保存在最前面(不知道为什么要做这一步?难道只是为了保险起见?)
 
下图为用 UE 打开 smedia.cfg 看到的东西:
 
下图为使用 win32 调试,找到 ptr 指针的值,也就是我们要的那个结构体的起始地址:
下图为根据 ptr 的值 0x156f128,在 memery 中,查看结构体的值:
对比上面的图,在对比我们对 systemsetting 的默认初始值,应该就很好理解了。
 
看完初始化,接下来看修改的部分 smtkCfgMgrSaveConfig(实际上,第一次生成 smedia.cfg,也是在这里面做的)
程序一进 smtkCfgMgrSaveConfig,首先做了一个这样的操作:
cfgFile = PalTFileOpen(cfgFileName, PAL_FILE_WB, MMP_NULL);
特别注意里面的参数 PAL_FILE_WB,看注释可以看到他的意思是: Opens an empty file for writing (binary),所以,smedia.cfg 就在这个时候被创建了(当然这个时候 的 smedia.cfg 是空的,什么都没有)。创建成功后就好办了,将 memery 中保存的那个结构体的值,写回到 smedia.cfg 中,搞定!这样的话就算关机,配置好的值还保存在 nand 里面的smedia.cfg 这个文件中不会丢失。所以下次开机,只要调出此文件,再对着我们定义好的结构体,对号入座把值写进去,就行了。
 
 
 
 
 
 
 
 
 
 
 
阅读(719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~