SmartOS/Config.h

115 lines
2.7 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 "Kernel\Sys.h"
#include "Storage\Storage.h"
// 配置管理
// 配置区以指定签名开头,后续链式跟随各配置块
class Config
{
private:
public:
const Storage& Device; // 配置存储的设备
uint Address; // 在存储区中的起始地址
uint Size; // 在存储区中的可用空间大小
Config(const Storage& st, uint addr, uint size);
// 查找。size不为0时表示要查找该大小的合适配置块
const void* Find(const String& name) const;
// 创建一个指定大小的配置块
const void* New(int size) const;
// 删除。仅清空名称,并不删除数据区
bool Remove(const String& name) const;
// 删除所有配置。
bool RemoveAll() const;
// 设置配置数据
const void* Set(const String& name, const Buffer& bs) const;
// 获取配置数据
bool Get(const String& name, Buffer& bs) const;
// 获取配置数据,如果不存在则覆盖
//bool GetOrSet(cstring name, Buffer& bs) const;
// 获取配置数据
const void* Get(const String& name) const;
// 当前
static const Config* Current;
// Flash最后一块作为配置区
static const Config& CreateFlash();
// RAM最后一小段作为热启动配置区
static const 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);
uint Size() const;
Buffer ToArray();
const Buffer ToArray() const;
protected:
const Config& Cfg;
cstring _Name;
void* _Start;
void* _End;
};
// 必须设定为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