第二人生的源码分析(三十五)分析消息模板文件

系统 1427 0
这种灵活的通讯消息结构到底是怎么样实现的呢?下面就来仔细地分析它实现的代码,如下:
#001 // Read file and build message templates
#002 void LLMessageSystem::loadTemplateFile(const char* filename)
#003 {
 
首先判断文件名称是否合法。
#004       if(!filename)
#005       {
#006              llerrs << "No template filename specified" << llendl;
#007              mbError = TRUE;
#008              return;
#009       }
#010 
 
然后把这个消息文件从磁盘里读取内存缓冲区。
#011       std::string template_body;
#012       if(!_read_file_into_string(template_body, filename))
#013       {
#014              llwarns << "Failed to open template: " << filename << llendl;
#015              mbError = TRUE;
#016              return;
#017       }
#018      
 
接着调用类LLTemplateTokenizer分析消息文件的单词,相当于词法分析。
#019       LLTemplateTokenizer tokens(template_body);
 
最后调用类LLTemplateParser来分析消息的结构,生成所有消息模板的结构,并对应到二进制消息构造。
#020       LLTemplateParser parsed(tokens);
#021       mMessageFileVersionNumber = parsed.getVersion();
#022       for(LLTemplateParser::message_iterator iter = parsed.getMessagesBegin();
#023              iter != parsed.getMessagesEnd();
#024              iter++)
#025       {
#026              addTemplate(*iter);
#027       }
#028 }
 
通过上面一系列的分析,最终调用函数addTemplate添加到类成员变量里,这个函数的代码如下:
#001 void LLMessageSystem::addTemplate(LLMessageTemplate *templatep)
#002 {
#003       if (mMessageTemplates.count(templatep->mName) > 0)
#004       {     
#005              llerrs << templatep->mName << " already used as a template name!"
#006                     << llendl;
#007       }
#008       mMessageTemplates[templatep->mName] = templatep;
#009       mMessageNumbers[templatep->mMessageNumber] = templatep;
#010 }
 
这里的mMessageTemplates和mMessageNumbers是使用stl库里的map来实现的,这样可以实现快速查找到消息结构定义。由于map是快速的红黑树实现,因此查找起来的速度是非常快的。在解包的过程中只要给出MessageNumber,就可以快速地定位到这个数据包的组成,这样就可以检验这个数据包是否合法,同时读取这个消息包的字段信息。
 

第二人生的源码分析(三十五)分析消息模板文件


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论