SmartOS/Config.h

111 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __Config_H__
#define __Config_H__
#include "Sys.h"
#include "Stream.h"
#include "Storage\Storage.h"
// 配置管理
// 配置区以指定签名开头,后续链式跟随各配置块
class Config
{
private:
public:
Storage* Device;
uint Address;
Config(Storage* st, uint addr);
// 查找。size不为0时表示要查找该大小的合适配置块
const void* Find(const char* name, int size = 0);
// 废弃。仅清空名称,并不删除数据区
bool Invalid(const char* name);
// 设置配置数据
const void* Set(const char* name, const Array& bs);
// 获取配置数据
bool Get(const char* name, Array& bs);
// 获取配置数据,如果不存在则覆盖
bool GetOrSet(const char* name, Array& bs);
// 获取配置数据
const void* Get(const char* name);
// 当前
static Config* Current;
// Flash最后一块作为配置区
static Config& CreateFlash();
// RAM最后一小段作为热启动配置区
static Config& CreateRAM();
};
/******************************** ConfigBase ********************************/
// 应用配置基类
class ConfigBase
{
public:
bool New;
ConfigBase();
virtual void Init();
virtual void Load();
virtual void Save() const;
virtual void Clear();
virtual void Show() const;
// 序列化到消息数据流
void Write(Stream& ms) const;
void Read(Stream& ms);
protected:
Config* Cfg;
const char* _Name;
void* _Start;
void* _End;
uint Size() const;
Array ToArray();
const Array ToArray() const;
};
// 必须设定为1字节对齐否则offsetof会得到错误的位置
#pragma pack(push) // 保存对齐状态
// 强制结构体紧凑分配空间
#pragma pack(1)
/******************************** HotConfig ********************************/
// 系统配置信息
class HotConfig
{
public:
ushort Times; // 启动次数
void* Next() const;
static HotConfig& Current();
};
/******************************** SysConfig ********************************/
// 系统配置信息
class SysConfig
{
public:
};
#pragma pack(pop) // 恢复对齐状态
/*
配置子系统,链式保存管理多配置段。
1每个配置段都有固定长度的头部包括签名、校验、名称等数据紧跟其后
2借助签名和双校验确保是有效配置段
3根据名称查找更新配置段
*/
#endif