yunfan 发表于 2008-12-11 08:57:17

Eva开发文档1 ---------- libeva 类描述

Eva开发文档1 ---------- libeva 类描述
=============================

借鉴了 openq 和 lumaqq 的很多东西。

在包解析的思路上,基本遵循了 lumaqq 的方案, 类命名上,也基本按照 lumaqq 的类命名方式。 目前 libeva 还没有完全完工, 但是基本的框架是有了,为了方便大家扩展这个库,加入更多的功能,我现在写出一个 libeva 类的基本描述。

对于开发者而言,希望尽量按照目前的风格编写代码。 当然有什么建议,只管提好了。

libeva 类描述

libeva 类说明

libeva 是腾讯即使通讯协议的一个封装库, 包括对发送的数据的格式处理,加密
以及,对接受到的数据的解密和解析。

注:<- OutPacket 表示继承自, 其他类推

libeva 库目前包含以下文件:

evadefines.h 一些用到的全局变量



evapacket.cpp evapacket.h 所有发送和接收类的父类
包含以下类:
Packet 所有包解析的父类
OutPacket 所有发送包的父类 <- Packet
InPacket 所有接收包的父类 <- Packet



evaaddfriend.cpp evaaddfriend.h 添加,删除好友的处理
包含以下类:
AddFriendPacket 添加好友类 <- OutPacket
添加普通好友

AddFriendReplyPacket 添加好友回复类 <- InPacket
添加普通好友回复,可能是添加成功,需要验证或者拒绝

AddFriendAuthPacket 添加认证好友类 <- OutPacket
添加一个需要验证的好友,发出添加请求,通过好友的验证请求,以及拒绝请求

AddFriendAuthReplyPacket 添加认证好友回复类 <- InPacket
这个是发送请求或者拒绝请求的回复, 成功表示服务器接受成功,可以等待好友回复了。
至于好友是否同意,那是系统提示类(SystemNotificationPacket)通知你的

DeleteFriendPacket 删除好友类 <- OutPacket
删除一个自己列表里的好友

DeleteFriendReplyPacket 删除好友回复类 <- InPacket
返回删除成功,或者失败

DeleteMePacket 删除自己类 <- OutPacket
从好友的好友列表中删除自己, 大概就是“黑名单”的意思了

DeleteMeReplyPacket 删除自己回复类 <- InPacket
这个是删除自己的回复,成功或者失败

SystemNotificationPacket 系统提示类 <- InPacket
这个是当有人加你成功,请求验证,拒绝你的请求还有部分广告都
是通过这个包来通知你的



evafriend.cpp evafriend.h 好友列表的解析和发送
包含以下类:

FriendItem 一个好友项
包括好友的:qq号,头像,年龄, 性别, 昵称, 一些想是否有QQShow,摄像头
等等的标致

GetFriendListPacket 获取好友列表请求 <- OutPacket
一个请求下载好友列表的类

GetFriendListReplyPacket 获取好友列表请求回复 <- InPacket
这个回复里含若干个好友项(FriendItem), 包装成了一个
std::list<FriendItem> 结构。



evafriendlist.cpp evafriendlist.h 好友列表的统一处理类
包含以下类:
QQFriend 封装了一个好友所有有关信息的类
包括在哪个组(注意这里只放了组的索引号),IP地址,端口号,在线状态什么的,很多信息
FriendList 一个好友列表的封装
用户可以通过这个类来对好友及全部列表进行操作。



evagroup.cpp evagroup.h 好友分组的下载,上传
包含以下类:
GroupNameOpPacket 上传和下载好友列表名的请求类 <- OutPacket

GroupNameOpReplyPacket 上传和下载好友列表名请求的回复类 <- InPacket
注意,这里的回复组名不包括第一个默认的“我的好友”组名

DownloadFriendEntry 一个好友分组的解析封装类
包括好友QQ号码, 好友类型(是否是群), 好友的分组索引号,这个
索引号对应下载的组名的次序,注意的是0是默认的“我的好友”,下载的
组名是从索引号1开始的

DownloadGroupFriendPacket 下载好友分组信息的类 <- OutPacket
一个下载好友分组的请求

DownloadGroupFriendReplyPacket 下载好友分组信息的回复类 <- InPacekt
把好友分组放入了一个std::list<DownloadFriendEntry> 结构中



evaimreceive.cpp evaimreceive.h 接收好友发送信息的类
包含以下类:
ReceiveIMPacket 一个初步解析好友发来的信息的类 <- InPacket
这个类会解析出发送者的QQ号,接收者的QQ号, 聊天的序列号,
发送者的IP, 发送者的端口,以及发送的类型,比如系统消息,一般
文本聊天消息,群聊天的文本消息
注意,消息的内容这个类不做处理,提供了原始数据,供相应
的类来处理

ReceivedSystemIM 系统消息类
从ReceiveIMPacket得到原始数据,解析系统消息,比如你的号码在
其他地方登录,你被迫下线等等

NormalIMBase 一个一般消息的父类
从ReceiveIMPacket得到原始数据,解析一般消息, 得到一般消息的类型,
但是不具体解析内容,包括:发送者的客户端版本, 发送者QQ号,接受者QQ号,
文件密钥,消息类型(文本消息还是发送文件相关的请求),消息序列号,发送时间,
发送者头像,等等注意,这个类一样事实上就是判断一下类型,然后
交由其他继承这个类的类来统一解析

ReceivedNormalIM 文本消息的解析类 <- NormalIMBase
从NormalIMBase得到原始数据,解析一般文本消息内容。
包括:是否是自动回复消息, 消息的GB编码的内容, 字体属性
注意,这里已经把消息中含有的系统表情转换为文本描述了

ReceiveIMReplyPacket 一个好友发送信息的回复类 <- OutPacket
就是ReceiveIMPacket原始包的前16个字节



evaimsend.cpp evaimsend.h 处理发送消息的类
包含以下类:
SendIM 所有发送类的父类 <- OutPacket
SendTextIMPacket 文本消息发送类 <- SendIM
负责,填充文本消息的格式,包括,字体,字号,颜色信息,
是否自动回复,消息内容
SendIMReplyPacket 发送消息的回复类 <- InPacket
服务器发回的,来通知是否发送成功的包



evalogin.cpp evalogin.h 用来处理登录,登出,和在线操作的类
包含以下类:
LoginPacket 登录类 <- OutPacket
发出一个登录请求

LoginReplyPacket 登录回复类 <- InPacket
收到服务器登录请求回复,回复信息包括
登录成功,服务器转向, 密码错误等等

LogoutPacket 登出的类 <- OutPacket
登出自己。 服务器不会回复这个包

KeepAlivePacket 保持在线类 <- OutPacket
发出保持在线包,每隔一定时间需要发这样一个包

KeepAliveReplyPacket 保持在线回复类 <- InPacket
里面含有自己的IP,端口,以及当前腾讯服务器
总登录人数



evaonlinestatus.cpp evaonlinestatus.h 获得在线好友和改变在线状态的类
包含以下类:
FriendOnlineEntry 解析一个在线用户的信息的类

GetOnlineFriendsPacket 请求在线用户列表类 <- OutPacket

GetOnlineFriendReplyPacket 请求在线用户列表回复类 <- InPacket
这个类里含有一个std::list<FriendOnlineEntry>结构来存储
解析后的列表

FriendChangeStatusPacket 好友更改状态类 <- InPacket
当你的一个好友更改了状态(登录,登出,上线,隐身,离开,下线)时,
都会收到这个包。 注意的是,如果是隐身登录,好友的状态的类型是
“下线”, 隐身也一样。

ChangeStatusPacket 更改自己状态的类 <- OutPacket
包括4中状态(上线,隐身,离开,下线),注意下线的效果和登出是
一样的, 但是下线服务器会返回一个是否成功的包。

ChangeStatusReplyPacket 更改自己状态的回复类 <- InPacket
返回成功,或者失败



evauserinfo.cpp evauserinfo.h 处理用户资料的类
包含以下类:
ContactInfo 用户资料的封装类

GetUserInfoPacket 获取用户资料的请求类 <- OutPacket

GetUserInfoReplyPacket 获取用户资料的请求回复类 <- InPacket
调用ContactInfo来解析好友资料

ModifyInfoPacket 更改个人资料类 <- OutPacket

ModifyInfoReplyPacket 更改个人资料回复类 <- InPacket
更改成功或者失败

evautil.cpp evautil.h 一些 libeva 用到的算法等
包含以下类:
EvaUtil 提供了md5,两次md5,表情码和文本描述,及文件索引号的转换



libeva.h 一个 libeva 头文件的封装
用户只要 include 这个头文件就可以了



md5.c md5.h 做MD5处理的c源文件
取自 Gaim, 作者:L. Peter Deutsch [email protected]
版权信息参见改文件



qq_crypt.c qq_crypt.h 处理 qq 加密,解密的源文件
取自 openq 项目, 作者:Puzzlebird
(注:加入了c++支持)
页: [1]
查看完整版本: Eva开发文档1 ---------- libeva 类描述