yunfan 发表于 2005-1-6 15:48:47

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.cppevaaddfriend.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 [email protected]
版权信息参见改文件



qq_crypt.c qq_crypt.h 处理 qq 加密,解密的源文件
取自 openq 项目, 作者:Puzzlebird
(注:加入了c++支持)


同时附上 libeva 源文件

--------------------------------------------
排版:bamfox , 请 yunfan 核查,谢谢。

yunfan 发表于 2005-1-6 16:03:24

说明一下, libeva中所有的std::string 类型都是GB或者/GBK 类型编码。
使用时,需要做内码转换, 建议用GBK内码转化。

比如在Qt中的QString是使用Unicode编码的, 那么可以这么来转换

假定消息是: std:string msg;

那么做下面的转换才可以在大多数系统上正常显示:
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString unicodeMsg = codec->toUnicode(msg.c_str());

如果要从QString 转为GBK 编码的 std::string, 可以这么做
假定消息是 QString unicodeMsg;
QTextCodec *codec = QTextCodec::codecForName("GBK");
std::string = (codec->fromUnicode(unicodeMsg)).data();

希望大家注意就好。

cjacker 发表于 2005-1-6 16:09:35

够快,support!!!!!!!!!!!

cjacker 发表于 2005-1-6 16:16:13

你个没人性的:-D

连个工程文件都不给了:-D


wait中,等你这块结束了,我就port一些kopete plugin

yunfan 发表于 2005-1-6 16:19:30

你个没人性的:-D

连个工程文件都不给了:-D


wait中,等你这块结束了,我就port一些kopete plugin

呵呵, 还没做完呢
快了,快了

casper 发表于 2005-1-6 16:47:30

好东西,正在看libeva的源代码,有了上面的东西,就可以有个整体的印象,只是src里面的注释太少了,对于我这样水平的人,读起来还是比较头大 :oops:

yunfan 发表于 2005-1-6 16:50:57

好东西,正在看libeva的源代码,有了上面的东西,就可以有个整体的印象,只是src里面的注释太少了,对于我这样水平的人,读起来还是比较头大 :oops:

不明白的地方,就跟贴问,我回答,也可能,我哪里处理的不好也说不定的。

caihua 发表于 2005-1-6 16:52:52

:roll: cjacker你今天下午来我们公司了 :?:

zongtongyi 发表于 2005-1-6 17:19:48

:mrgreen::lol:

bamfox 发表于 2005-1-6 17:29:03

好东西,正在看libeva的源代码,有了上面的东西,就可以有个整体的印象,只是src里面的注释太少了,对于我这样水平的人,读起来还是比较头大 :oops:

我跟你一样一样哇,一起学习。如果有兴趣的话,我们就把程序流程图画出来吧 :D

yunfan 发表于 2005-1-6 17:53:24

呵呵, 我说怎么一下变的好看了. bamfox 多谢!

atfa 发表于 2005-1-7 08:02:12

yunfan基本是个好同志 :mrgreen:

呵呵开玩笑了

我们领导前天吃饭喝酒的时候,喝得半醉说:“XX基本是个好同志”

大家哄堂大笑,结果这几天大家不管说什么都把“基本”二字挂在嘴边 :mrgreen:

嗯!yunfan基本是个好同志 :mrgreen:

VimChina 发表于 2005-1-7 08:51:36

我也学学啊,是不是这么说:
atfa基本是个好淫 :mrgreen:

cjacker 发表于 2005-1-7 09:27:55

:roll: cjacker你今天下午来我们公司了 :?:
没有阿。来了我能不去看你?

caihua 发表于 2005-1-7 10:49:23

:mrgreen: 我还以为昨天下午那个戴眼睛的是你咧 :oops:
页: [1] 2
查看完整版本: Eva开发文档1 ---------- libeva 类描述