ipcCfgInit()配置的初始化及理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28090573/article/details/82842694

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

猜你喜欢

转载自blog.csdn.net/qq_28090573/article/details/82842694