eva采用的配置文件应该使用什么样的书写规则?
我在尝试设计EvaData,这是一个用来管理Eva的磁盘数据的模块,用来管理诸如配置文件、聊天记录等信息。eva采用的配置文件应该使用什么样的书写规则?
我目前想到的:
1.采用“变量名=值”这样的形式对运行参数进行配置;
2.用分号“;”分隔配置语句;
3.一个配置文件里可以有多个“模块”,一个模块采用以下形式定义:
模块类型名 模块名
{
变量名 = 值;
变量名 = 值;
变量名 = 值;
……
};
模块类型名用来识别这个模块的作用,也就是说它是用来配置什么的,比如如果和一个插件名相一致,那么就是用来配置这个插件的,如果是其他的名字,可能是用来配置eva主程序的或者是用户的自定义数据等。
如果配置文件里同一样东西的配置有多个模块,比如对eva主程序的配置模块有不只一个,那么用户可以选择eva主程序采用哪个模块里给出的配置参数。
另外配置文件相关的设计有:
Eva主程序在代码里指定主配置文件的搜索路径列表和配置文件名的候选名单,然后EvaData会去搜索这个文件,然后从这个文件里读取配置,在这个配置文件里用户可以给出用户配置文件的搜索路径列表和配置文件名候选名单。搜索路径列表和配置文件名的候选名单都是有优先级的,派在前面的优先被搜索,并且找到后文件里的配置参数也会被优先采用,所以不同的配置文件里的参数配置可以有冲突,而EvaData会采用先给出的配置。 Why not XML? 一来偶不懂xml二来偶的功力也不够…… :lol:
如果配置文件里同一样东西的配置有多个模块,比如对eva主程序的配置模块有不只一个,那么用户可以选择eva主程序采用哪个模块里给出的配置参数。
就目前而言这对我来说好像太困难了,所以我考虑暂时不实现……
但是模块的书写规则不变,只是模块名暂时没有任何意义。 这是我的配置文件, 保存在 ~/.eva/33138622/user.profile 文件中
THEME_DIR:
SOUND_DIR:
FACE_SIZE:16,16
DISPLAY_QQ_BROADCAST:true
DISPLAY_TIP_MESSAGE_TIP_WINDOW:true
DISPLAY_BUDDY_ONLINE_NOTIFY:true
DISPLAY_ONLINE_BUDDIES:false
SEND_KEY:false
PLAY_SOUND:true
AUTO_REPLY_SELECTED_INDEX:0
AUTO_REPLY:对不起,我正在工作。
AUTO_REPLY:吃饭去了。/fa
AUTO_REPLY:有事不在,不好意思
QUICK_REPLY:哦。
QUICK_REPLY:好了,好了,知道了
QUICK_REPLY:/jy , 真的吗?
Eva 除了保存配置文件以外,保存的文件还有
我详细的说一下目前Eva保存和读取的文件情况:
eva.sys : Eva系统配置文件
保存在$HOME/.eva里。
这里面记录着登录好友的QQ号,加密后的密码, 登录方式,网络参数。
文件用二进制保存, 数据结构为
typedef struct loginRecord{
Q_UINT32 id;
Q_UINT8*md5Pwd; // note: the password is always 16 bits long. if isRecorded is false, password is 16 '0' chars
Q_UINT8flag;// bit 0 to 2 reserved, bit 3: UDP, bit 4: TCP, bit 5: HTTP Proxy, bit 6: isHidden, bit 7: isRecorded( 0 for false, 1 for true)
Q_UINT32 proxy;
Q_UINT16 port;
QStringproxyUserName;
QCString base64param;
} loginRecord;
sys.msg : 用户系统消息记录文件
保存在$HOME/.eva/XXX 里(XXX为用户的QQ号码)。
这里保存着系统发给用户XXX所有系统消息,包括腾讯的消息广播,
其他用户加你为好友的通知,其他用户发给你的添加请求,
其他用户同意你的添加请求, 其他用户拒绝你的添加请求。
你被群加入的通知。加入群的请求, 群同意加入的通知,
群拒绝加入的通知。
文件为2进制存储。
格式为
typedef struct{
Q_UINT16messageType; // 标识消息的类型,一般消息,或者某个群消息
Q_UINT8type; // 如果是一般消息,则为详细类型,如果是群的,则为永久群 or 临时群
Q_UINT32 from; // 消息的发送者。
Q_UINT32 to; // 如果是一般消息,则为自己,否则为群外部ID
Q_UINT32 internalQunID; // 如果是一般消息,则为0,否则为群内部ID
QStringmessage; // 附加的消息内容
} sysMessage;
chat.msg : 用户一般聊天消息记录文件
保存在$HOME/.eva/XXX 里(XXX为用户的QQ号码)。
这里是用户和好友的聊天记录文件,不包括群聊天记录
存储格式
typedef struct{
Q_UINT32 sender; // 发送者 QQ号
QString sNick; // 发送者昵称
Q_UINT32 receiver;// 接收者 QQ号
QString rNick; // 接收者昵称
Q_UINT8type; // 0 auto reply,1 normal
QStringmessage;// 消息内容
QDateTime time; // 发送时间
Q_UINT8 fontSize; // 字体大小
Q_UINT8 flag; // start from right.bit 0: u, bit 1: i, bit 2: b
Q_UINT8 blue;// 字体颜色中的蓝色
Q_UINT8 green; // 字体颜色中的绿色
Q_UINT8 red; // 字体颜色中的红色
} chatMessage;
注:群聊天记录将单独存储在另一个文件中, 正在实现。
user.dat : 用户资料记录文件
保存在$HOME/.eva/XXX 里(XXX为用户的QQ号码)。
包括 用户自己的资料,好友分组,好友资料 的存储
存储格式
存储分为顺序的三个部分:
1.自己的资料(若干项)
2.分组名称(若干)
3.循环存储每个好友的全部资料(若干项)
qun.dat : 用户群资料记录文件
保存在$HOME/.eva/XXX 里(XXX为用户的QQ号码)。
目前保存了永久群的所有资料,包括成员资料
格式:
分为两个部分:
1. 存储群的资料
2. 循环存储群成员的所有资料
user.profile : 用户配置文件
保存在$HOME/.eva/XXX 里(XXX为用户的QQ号码)。
这个存储用户可以自定义的配置。
存储格式如下(配置以行为一项,其中可以没有任意一行)
关键字: 值
例如:
THEME_DIR:
SOUND_DIR:
FACE_SIZE:16,16
DISPLAY_QQ_BROADCAST:true
DISPLAY_TIP_MESSAGE_TIP_WINDOW:true
DISPLAY_BUDDY_ONLINE_NOTIFY:true
DISPLAY_ONLINE_BUDDIES:false
SEND_KEY:false
PLAY_SOUND:true
AUTO_REPLY_SELECTED_INDEX:0
AUTO_REPLY:对不起,我正在工作。
AUTO_REPLY:吃饭去了。/fa
AUTO_REPLY:有事不在,不好意思
QUICK_REPLY:哦。
QUICK_REPLY:好了,好了,知道了
QUICK_REPLY:/jy , 真的吗?
以上就是目前Eva所有保存的文件,及其大致格式, 写出来供大家参考. 恩……估计loginRecord还是要单独放在一个二进制文件里
而sysMessage则可以放到聊天记录的文件里 恩……估计loginRecord还是要单独放在一个二进制文件里
而sysMessage则可以放到聊天记录的文件里
如果我们把文件合并, 那么维护这个文件是否就变得效率低下了? 不啊,因为系统消息和普通的聊天记录也差不多啊,只不过在存系统消息时给它个特殊的qq号就可以了……省得再专门维护一个文件了 实例:
evaMain()
{
DataSet datas;
datas.module_type="EvaMain";
datas.paths.push_back("/usr/local/etc/eva/");
datas.filenames.push_back("eva.cfg");
datas.msgs.module_type="Messages";
datas.load();
for( every 值对 in datas.data_map ){
对eva的全局变量赋值;
}
……
}
配置文件:
/usr/local/etc/eva/eva.cfg
EvaMain default
{
hiding_logon = true;
log_file = "~/.eva/log.txt";
auto_logon_timeout = 8;
};
Messages default
{
paths = "~/.eva/";
paths = "/usr/local/share/eva/msg/";
filenames = "msg.data";
filenames = "message.data";
};
我现在才明白一点, 你的意思是,这个是配置文件的配置文件。你放的是配置文件的信息?
配置文件存储到系统中,不大合适, 因为可能管理员安装了这个软件, 但是一般用户,根本就没有对/usr/......这个目录的写权限。:(
所以, 所有要保存的文件都只能存在 $HOME/.eva里, 这是很保险的办法。 假如eva预备写成一个标准的kde应用的话,系统的配置参数应该用kderc或kcfg来存储,用户的有关记录等涉及隐私的东西可以考虑kwallet。
假如eva预备写成Qt应用的话,就把kde的依赖丢掉。 假如eva预备写成一个标准的kde应用的话,系统的配置参数应该用kderc或kcfg来存储,用户的有关记录等涉及隐私的东西可以考虑kwallet。
假如eva预备写成Qt应用的话,就把kde的依赖丢掉。
恩,应该尽力按标准来。
因为可能管理员安装了这个软件, 但是一般用户,根本就没有对/usr/......这个目录的写权限。:(
所以, 所有要保存的文件都只能存在 $HOME/.eva里, 这是很保险的办法。
管理员可以配置让每个用户都在自己的用户目录里有自己的配置文件,也可以剥夺这种权利,可以设置用户自己的配置文件的优先级更高,也可以设置全局配置文件的优先级更高。
恩……sorry,刚才我没把Config module放到配置文件里……管理员主要是控制一个全局的DataSet的配置文件,然后在这里面可以设置软件读取user config的路径…… 管理员可以配置让每个用户都在自己的用户目录里有自己的配置文件,也可以剥夺这种权利,可以设置用户自己的配置文件的优先级更高,也可以设置全局配置文件的优先级更高。这个功能似乎不应该由eva来实现,而是由桌面环境的组策略来实现。 如果希望尽量不要被死死绑在桌面环境上呢?…… :roll:
页:
[1]
2