QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9567|回复: 28

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

[复制链接]
发表于 2005-1-6 15:48:47 | 显示全部楼层 |阅读模式
借鉴了 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++支持)


同时附上 libeva 源文件

--------------------------------------------
排版:bamfox , 请 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();

希望大家注意就好。
回复

使用道具 举报

发表于 2005-1-6 16:09:35 | 显示全部楼层
够快,support!!!!!!!!!!!
回复

使用道具 举报

发表于 2005-1-6 16:16:13 | 显示全部楼层
你个没人性的

连个工程文件都不给了


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

使用道具 举报

 楼主| 发表于 2005-1-6 16:19:30 | 显示全部楼层
[quote:747542fd52="cjacker"]你个没人性的

连个工程文件都不给了


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

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

使用道具 举报

发表于 2005-1-6 16:47:30 | 显示全部楼层
好东西,正在看libeva的源代码,有了上面的东西,就可以有个整体的印象,只是src里面的注释太少了,对于我这样水平的人,读起来还是比较头大
回复

使用道具 举报

 楼主| 发表于 2005-1-6 16:50:57 | 显示全部楼层
[quote:9e0d9a6e4b="casper"]好东西,正在看libeva的源代码,有了上面的东西,就可以有个整体的印象,只是src里面的注释太少了,对于我这样水平的人,读起来还是比较头大 [/quote]

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

使用道具 举报

发表于 2005-1-6 16:52:52 | 显示全部楼层
cjacker你今天下午来我们公司了
回复

使用道具 举报

发表于 2005-1-6 17:19:48 | 显示全部楼层
  
回复

使用道具 举报

发表于 2005-1-6 17:29:03 | 显示全部楼层
[quote:1ceb5ce53b="casper"]好东西,正在看libeva的源代码,有了上面的东西,就可以有个整体的印象,只是src里面的注释太少了,对于我这样水平的人,读起来还是比较头大 [/quote]

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

使用道具 举报

 楼主| 发表于 2005-1-6 17:53:24 | 显示全部楼层
呵呵, 我说怎么一下变的好看了. bamfox 多谢!
回复

使用道具 举报

发表于 2005-1-7 08:02:12 | 显示全部楼层
yunfan基本是个好同志

呵呵开玩笑了

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

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

嗯!yunfan基本是个好同志
回复

使用道具 举报

发表于 2005-1-7 08:51:36 | 显示全部楼层
我也学学啊,是不是这么说:
atfa基本是个好淫
回复

使用道具 举报

发表于 2005-1-7 09:27:55 | 显示全部楼层
[quote:33afddf059="caihua"] cjacker你今天下午来我们公司了 [/quote]
没有阿。来了我能不去看你?
回复

使用道具 举报

发表于 2005-1-7 10:49:23 | 显示全部楼层
我还以为昨天下午那个戴眼睛的是你咧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 01:31 , Processed in 0.067436 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表