从loginapp开始,loginapp的构造函数只有一句话
pMainMessageHandlers是MessageHandlers的静态成员变量,那么赋值号右边的LoginappInterface::messageHandlers是什么呢?
找到LoginappInterface
loginapp_interface.cpp
LoginappInterface是命名空间,那么messageHandlers就是其中对应的某个变量了,进入头文件查看
loginapp_interface.h
这里面有非常多的函数,这里只摘出来importClientMessages 和 login
通过对这些函数的解析(就是看函数定义的位置),得到下面这些
1、上图的第3行和第13行展开
宏替换之后的结果如下图。这里替换结果为什么是这样?可以回到loginapp_interface.cpp去看,它有两次#inlclude “loginapp_interface.h”,第二次#include之前#define了两个宏。这里如此设计的原因是防止其他文件#include“loginapp_interface.h”而产生会有干扰的全局变量以及会定义影响处理的函数
2、第6、7行展开
31~32行是loginapp_interface.h中第6行的展开,第32行展开是200~217中的NETWORK_MESSAGE_EXPOSED部分。
104~107行就是loginapp_interface.h第7行的展开,同时可以看到105行的展开是76~102,106行的展开是190~193,192行展开是200~217中的NETWORK_MESSAGE_HANDLER部分,193行展开是160~188(这里为了方便叙述而将有些宏定义的位置截图的时候换了)
其实上面一大段都不用看,只要知道loginapp_interface.h中6~7行展开为下面这样
- 29 行,使用 "LoginappInterface::importClientMessages" 作为 messageHandlers.pushExposedMessage 的参数,即这个函数将会被导出到客户端,以便客户端调用
- 30~38 行,声明了一个 MessageHandler 的派生类,这个类的 handle 函数(MessageHandler继承而来),是个 virtual 函数,执行的就是 Loginapp::importClientMessages。
- 40~45 行,将调用 messangeHandlers.add 函数,完成 messangeId 到 importClientMessagesLoginappMessagehandler0 类对象的映射;此后,就可以通过 messageId 找到一个 MessangeHandler 对象指针,然后执行他的 handle 函数,由于这是 virtual 函数,真正执行的是 importClientMessagesLoginappMessagehandler0 中的 handle 函数,也就是 Loginapp::importClientMessages 函数。
- 47 行,保存添加过映射关系的 MessangeHandlers;这个主要是为了其他组件调用,如 baseapp 可以通过(*pBundle).newMessage( Loginapp::importClientMessages); 这样的形式调用到这个函数。
- 49~69 行 importClientMessages 函数的参数对象,ARGS0 表示 importClientMessages 函数不需要参数。
3、第10、11行展开,同上的分析,宏展开结果如下
前面的宏中涉及了MessageHandlers的构造和MessageHandlers::add()函数
Message_handler.cpp
这里使用FixedMessages类来读取xml文件中的配置,其实就是形成配置中的函数名称和、到节点信息(函数id和函数名称)的映射。Xml中的函数又被称为固定函数。
这里先是设置msgHandler的id,如果msgHandler中所要执行的函数是固定函数,id就是固定函数所对应的id,并且建立函数id到msgHandler的映射。
那么函数id到msgHandler的映射有什么作用呢
从上一篇看到执行到processMessages(pMsgHandlers, pPacket)会从pMsgHandlers中根据id取到msgHandler,再执行msgHandler的handle函数。假如现在发来的是login消息,那么从pMsgHandlers中取出的就是loginLoginappMessagehandler_stream,执行的就是它的handle函数,也就是Loginapp::login(),那么Loginapp::login()做了哪些事呢?
下面就是登录在各种app中流转的过程。下一篇