第二人生的源码分析(三十五)分析消息模板文件
2008-04-12 23:27
239 查看
这种灵活的通讯消息结构到底是怎么样实现的呢?下面就来仔细地分析它实现的代码,如下:
#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,就可以快速地定位到这个数据包的组成,这样就可以检验这个数据包是否合法,同时读取这个消息包的字段信息。
#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,就可以快速地定位到这个数据包的组成,这样就可以检验这个数据包是否合法,同时读取这个消息包的字段信息。
相关文章推荐
- 蔡军生先生第二人生的源码分析(三十五)分析消息模板文件
- 第二人生的源码分析(三十五)分析消息模板文件
- 第二人生的源码分析(三十五)分析消息模板文件
- 蔡军生先生第二人生的源码分析(三十四)读取通讯的消息模板
- 第二人生的源码分析(三十二)消息解包的实现
- 第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
- 第二人生的源码分析(七十三)LLFeatureManager类分析特性文件
- 蔡军生先生第二人生的源码分析(六十二)类Easy实现多协议文件传送
- 第二人生的源码分析(十五)Mesh文件的读取
- 第二人生的源码分析(六十)多协议文件传送库libcurl的介绍
- 第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
- 第二人生的源码分析(七十三)LLFeatureManager类分析特性文件
- 蔡军生先生第二人生的源码分析(四十二)实现消息处理的线程类
- 第二人生的源码分析(十五)Mesh文件的读取
- 蔡军生先生第二人生的源码分析(十五)Mesh文件的读取
- 第二人生的源码分析(三十七)消息处理的完整流程
- 第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
- 第二人生的源码分析(七十三)LLFeatureManager类分析特性文件
- 蔡军生先生第二人生的源码分析(三十六)获取消息包里每一个字段
- 蔡军生先生第二人生的源码分析(十六)保存人物角色的XML文件