1、首先利用cfgRegisterAllEntry()注册全部的配置项信息,就是将每一个配置注册到g_cfgEntryList的链表上,每一个配置的结构体如下:
/**
*@struct CfgEntry
*@brief 配置信息注册表条目
*/
typedef struct
{
CfgEntryInfo info;
uint nOffset; /**< 配置数偏移量 */
CfgGetDefProc pfnGetDef; /**< 用于获取缺省参数 */
struct list_head list;
}CfgEntry;
配置注册表的信息如下:
/**
*@struct CfgEntryList
*@brief 配置信息注册表
*/
typedef struct
{
uint nDataSize; /**< 配置数据的大小, 用于配置信息有效性校验, 此值在配置条目注册过程中统计, 不能超过CFG_MAX_DATA */
uint nModCnt;
uchar* pDataBuf; /**< 所有配置数据都保存在这里 */
struct list_head list; /**< 链表头*/
}CfgEntryList;
2、根据配置注册表中的nDataSize,给pDataBuf申请一块空间。将配置都放到该文件/etc/ipc_config/ipcconfig中。如果还没有该文件,需要创建并写入一份配置文件头,其内容是"BSIPCCFG" cfg的文件标识,配置的模块数为0。如果已经有了该文件,就从文件中读取一份配置文件头,结构体如下:
/**
*@struct CfgFileHdr
*@brief 配置文件头
*/
typedef struct
{
char szSign[CFG_SIZE_SIGN]; /**< cfg文件标识 */
uint nModCnt; /**< 模块数目 */
}CfgFileHdr;
比较从文件中读取的文件头是否是"BSIPCCFG",是则返回文件描述符,不是则关闭文件描述符返回null。而且将从文件中读出的配置文件通过参数带出。
3、如果通过cfgOpenFileda带出了配置文件头,而且头里有信息。则申请一块空间CfgFileIdxEntry(配置文件中的索引信息),个数为nModCnt个。然后从文件中将CfgFileIdxEntry(配置文件中的索引信息)读出。CfgFileIdxEntry结构体如下:
/**
*@struct CfgFileIdxEntry
*@brief 配置文件中的索引信息
*/
typedef struct
{
CfgEntryInfo info;
uint nOffset; /**< 配置信息在配置文件数据块的偏移量 */
uint nCrc32; /**< 模块的crc32校验 */
}CfgFileIdxEntry;
4、通过cfgFileLoadAndUpdate,从配置文件的数据段读取配置信息, 如注册信息与文件索引不一致, 则更新文件。更新文件的过程就是先把没有变更的数据读出来, 按照注册信息生成新的索引, 再写回到文件中去, 实现配置文件某(些)模块独立变更,如果注册信息与文件索引一致, 则不用更新,比较的关键值为模块版本号以及模块个数。
如果说注册表中的项在文件索引中找不到, 说明配置发生变更, 需要更新文件索引。并且这些需要更新的索引配置都是通过CfgEntry(配置条目)中的获取默认值来获取的。
5、cfgGetFn(uint nModId),根据nModId,从g_cfgEntryList全局变量(也就是保存配置的配置注册表)找到对应的注册表条目CfgEntry,并返回。
cfgSet(uint nModId, const void* pSrc),将nModId和要set进去的sh数据作为入参,并写入到g_cfgEntryList全局变量(也就是保存配置的配置注册表)中,并且写入到文件中。
6、如果像是onvif中需要加一条配置项,重点关注结构体的大小,例如:
cfgRegisterEntry(CFG_ID_ONVIF_MEDIA,
sizeof(OnvifMediaConfigurationEntities),
CFG_VER_ONVIF_MEDIA,
cfgOnvifMediaGetDefProc);
如果想增加配置的条目,适当的修改OnvifMediaConfigurationEntities