lltemplatemessagereader.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:22k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltemplatemessagereader.cpp
  3.  * @brief LLTemplateMessageReader class implementation.
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "linden_common.h"
  33. #include "lltemplatemessagereader.h"
  34. #include "llfasttimer.h"
  35. #include "llmessagebuilder.h"
  36. #include "llmessagetemplate.h"
  37. #include "llquaternion.h"
  38. #include "message.h"
  39. #include "u64.h"
  40. #include "v3dmath.h"
  41. #include "v3math.h"
  42. #include "v4math.h"
  43. LLTemplateMessageReader::LLTemplateMessageReader(message_template_number_map_t&
  44.  number_template_map) :
  45. mReceiveSize(0),
  46. mCurrentRMessageTemplate(NULL),
  47. mCurrentRMessageData(NULL),
  48. mMessageNumbers(number_template_map)
  49. {
  50. }
  51. //virtual 
  52. LLTemplateMessageReader::~LLTemplateMessageReader()
  53. {
  54. delete mCurrentRMessageData;
  55. mCurrentRMessageData = NULL;
  56. }
  57. //virtual
  58. void LLTemplateMessageReader::clearMessage()
  59. {
  60. mReceiveSize = -1;
  61. mCurrentRMessageTemplate = NULL;
  62. delete mCurrentRMessageData;
  63. mCurrentRMessageData = NULL;
  64. }
  65. void LLTemplateMessageReader::getData(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum, S32 max_size)
  66. {
  67. // is there a message ready to go?
  68. if (mReceiveSize == -1)
  69. {
  70. llerrs << "No message waiting for decode 2!" << llendl;
  71. return;
  72. }
  73. if (!mCurrentRMessageData)
  74. {
  75. llerrs << "Invalid mCurrentMessageData in getData!" << llendl;
  76. return;
  77. }
  78. char *bnamep = (char *)blockname + blocknum; // this works because it's just a hash.  The bnamep is never derefference
  79. char *vnamep = (char *)varname; 
  80. LLMsgData::msg_blk_data_map_t::const_iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep);
  81. if (iter == mCurrentRMessageData->mMemberBlocks.end())
  82. {
  83. llerrs << "Block " << blockname << " #" << blocknum
  84. << " not in message " << mCurrentRMessageData->mName << llendl;
  85. return;
  86. }
  87. LLMsgBlkData *msg_block_data = iter->second;
  88. LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep];
  89. if (!vardata.getName())
  90. {
  91. llerrs << "Variable "<< vnamep << " not in message "
  92. << mCurrentRMessageData->mName<< " block " << bnamep << llendl;
  93. return;
  94. }
  95. if (size && size != vardata.getSize())
  96. {
  97. llerrs << "Msg " << mCurrentRMessageData->mName 
  98. << " variable " << vnamep
  99. << " is size " << vardata.getSize()
  100. << " but copying into buffer of size " << size
  101. << llendl;
  102. return;
  103. }
  104. const S32 vardata_size = vardata.getSize();
  105. if( max_size >= vardata_size )
  106. {   
  107. switch( vardata_size )
  108. case 1:
  109. *((U8*)datap) = *((U8*)vardata.getData());
  110. break;
  111. case 2:
  112. *((U16*)datap) = *((U16*)vardata.getData());
  113. break;
  114. case 4:
  115. *((U32*)datap) = *((U32*)vardata.getData());
  116. break;
  117. case 8:
  118. ((U32*)datap)[0] = ((U32*)vardata.getData())[0];
  119. ((U32*)datap)[1] = ((U32*)vardata.getData())[1];
  120. break;
  121. default:
  122. memcpy(datap, vardata.getData(), vardata_size);
  123. break;
  124. }
  125. }
  126. else
  127. {
  128. llwarns << "Msg " << mCurrentRMessageData->mName 
  129. << " variable " << vnamep
  130. << " is size " << vardata.getSize()
  131. << " but truncated to max size of " << max_size
  132. << llendl;
  133. memcpy(datap, vardata.getData(), max_size);
  134. }
  135. }
  136. S32 LLTemplateMessageReader::getNumberOfBlocks(const char *blockname)
  137. {
  138. // is there a message ready to go?
  139. if (mReceiveSize == -1)
  140. {
  141. llerrs << "No message waiting for decode 3!" << llendl;
  142. return -1;
  143. }
  144. if (!mCurrentRMessageData)
  145. {
  146. llerrs << "Invalid mCurrentRMessageData in getData!" << llendl;
  147. return -1;
  148. }
  149. char *bnamep = (char *)blockname; 
  150. LLMsgData::msg_blk_data_map_t::const_iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep);
  151. if (iter == mCurrentRMessageData->mMemberBlocks.end())
  152. {
  153. return 0;
  154. }
  155. return (iter->second)->mBlockNumber;
  156. }
  157. S32 LLTemplateMessageReader::getSize(const char *blockname, const char *varname)
  158. {
  159. // is there a message ready to go?
  160. if (mReceiveSize == -1)
  161. { // This is a serious error - crash 
  162. llerrs << "No message waiting for decode 4!" << llendl;
  163. return LL_MESSAGE_ERROR;
  164. }
  165. if (!mCurrentRMessageData)
  166. { // This is a serious error - crash
  167. llerrs << "Invalid mCurrentRMessageData in getData!" << llendl;
  168. return LL_MESSAGE_ERROR;
  169. }
  170. char *bnamep = (char *)blockname; 
  171. LLMsgData::msg_blk_data_map_t::const_iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep);
  172. if (iter == mCurrentRMessageData->mMemberBlocks.end())
  173. { // don't crash
  174. llinfos << "Block " << bnamep << " not in message "
  175. << mCurrentRMessageData->mName << llendl;
  176. return LL_BLOCK_NOT_IN_MESSAGE;
  177. }
  178. char *vnamep = (char *)varname; 
  179. LLMsgBlkData* msg_data = iter->second;
  180. LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep];
  181. if (!vardata.getName())
  182. { // don't crash
  183. llinfos << "Variable " << varname << " not in message "
  184. << mCurrentRMessageData->mName << " block " << bnamep << llendl;
  185. return LL_VARIABLE_NOT_IN_BLOCK;
  186. }
  187. if (mCurrentRMessageTemplate->mMemberBlocks[bnamep]->mType != MBT_SINGLE)
  188. { // This is a serious error - crash
  189. llerrs << "Block " << bnamep << " isn't type MBT_SINGLE,"
  190. " use getSize with blocknum argument!" << llendl;
  191. return LL_MESSAGE_ERROR;
  192. }
  193. return vardata.getSize();
  194. }
  195. S32 LLTemplateMessageReader::getSize(const char *blockname, S32 blocknum, const char *varname)
  196. {
  197. // is there a message ready to go?
  198. if (mReceiveSize == -1)
  199. { // This is a serious error - crash
  200. llerrs << "No message waiting for decode 5!" << llendl;
  201. return LL_MESSAGE_ERROR;
  202. }
  203. if (!mCurrentRMessageData)
  204. { // This is a serious error - crash
  205. llerrs << "Invalid mCurrentRMessageData in getData!" << llendl;
  206. return LL_MESSAGE_ERROR;
  207. }
  208. char *bnamep = (char *)blockname + blocknum; 
  209. char *vnamep = (char *)varname; 
  210. LLMsgData::msg_blk_data_map_t::const_iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep);
  211. if (iter == mCurrentRMessageData->mMemberBlocks.end())
  212. { // don't crash
  213. llinfos << "Block " << bnamep << " not in message " 
  214. << mCurrentRMessageData->mName << llendl;
  215. return LL_BLOCK_NOT_IN_MESSAGE;
  216. }
  217. LLMsgBlkData* msg_data = iter->second;
  218. LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep];
  219. if (!vardata.getName())
  220. { // don't crash
  221. llinfos << "Variable " << vnamep << " not in message "
  222. <<  mCurrentRMessageData->mName << " block " << bnamep << llendl;
  223. return LL_VARIABLE_NOT_IN_BLOCK;
  224. }
  225. return vardata.getSize();
  226. }
  227. void LLTemplateMessageReader::getBinaryData(const char *blockname, 
  228. const char *varname, void *datap, 
  229. S32 size, S32 blocknum, 
  230. S32 max_size)
  231. {
  232. getData(blockname, varname, datap, size, blocknum, max_size);
  233. }
  234. void LLTemplateMessageReader::getS8(const char *block, const char *var, 
  235. S8 &u, S32 blocknum)
  236. {
  237. getData(block, var, &u, sizeof(S8), blocknum);
  238. }
  239. void LLTemplateMessageReader::getU8(const char *block, const char *var, 
  240. U8 &u, S32 blocknum)
  241. {
  242. getData(block, var, &u, sizeof(U8), blocknum);
  243. }
  244. void LLTemplateMessageReader::getBOOL(const char *block, const char *var, 
  245.   BOOL &b, S32 blocknum )
  246. {
  247. U8 value;
  248. getData(block, var, &value, sizeof(U8), blocknum);
  249. b = (BOOL) value;
  250. }
  251. void LLTemplateMessageReader::getS16(const char *block, const char *var, 
  252.  S16 &d, S32 blocknum)
  253. {
  254. getData(block, var, &d, sizeof(S16), blocknum);
  255. }
  256. void LLTemplateMessageReader::getU16(const char *block, const char *var, 
  257.  U16 &d, S32 blocknum)
  258. {
  259. getData(block, var, &d, sizeof(U16), blocknum);
  260. }
  261. void LLTemplateMessageReader::getS32(const char *block, const char *var, 
  262.  S32 &d, S32 blocknum)
  263. {
  264. getData(block, var, &d, sizeof(S32), blocknum);
  265. }
  266. void LLTemplateMessageReader::getU32(const char *block, const char *var, 
  267.  U32 &d, S32 blocknum)
  268. {
  269. getData(block, var, &d, sizeof(U32), blocknum);
  270. }
  271. void LLTemplateMessageReader::getU64(const char *block, const char *var, 
  272.  U64 &d, S32 blocknum)
  273. {
  274. getData(block, var, &d, sizeof(U64), blocknum);
  275. }
  276. void LLTemplateMessageReader::getF32(const char *block, const char *var, 
  277.  F32 &d, S32 blocknum)
  278. {
  279. getData(block, var, &d, sizeof(F32), blocknum);
  280. if( !llfinite( d ) )
  281. {
  282. llwarns << "non-finite in getF32Fast " << block << " " << var 
  283. << llendl;
  284. d = 0;
  285. }
  286. }
  287. void LLTemplateMessageReader::getF64(const char *block, const char *var, 
  288.  F64 &d, S32 blocknum)
  289. {
  290. getData(block, var, &d, sizeof(F64), blocknum);
  291. if( !llfinite( d ) )
  292. {
  293. llwarns << "non-finite in getF64Fast " << block << " " << var 
  294. << llendl;
  295. d = 0;
  296. }
  297. }
  298. void LLTemplateMessageReader::getVector3(const char *block, const char *var, 
  299.  LLVector3 &v, S32 blocknum )
  300. {
  301. getData(block, var, &v.mV[0], sizeof(v.mV), blocknum);
  302. if( !v.isFinite() )
  303. {
  304. llwarns << "non-finite in getVector3Fast " << block << " " 
  305. << var << llendl;
  306. v.zeroVec();
  307. }
  308. }
  309. void LLTemplateMessageReader::getVector4(const char *block, const char *var, 
  310.  LLVector4 &v, S32 blocknum)
  311. {
  312. getData(block, var, &v.mV[0], sizeof(v.mV), blocknum);
  313. if( !v.isFinite() )
  314. {
  315. llwarns << "non-finite in getVector4Fast " << block << " " 
  316. << var << llendl;
  317. v.zeroVec();
  318. }
  319. }
  320. void LLTemplateMessageReader::getVector3d(const char *block, const char *var, 
  321.   LLVector3d &v, S32 blocknum )
  322. {
  323. getData(block, var, &v.mdV[0], sizeof(v.mdV), blocknum);
  324. if( !v.isFinite() )
  325. {
  326. llwarns << "non-finite in getVector3dFast " << block << " " 
  327. << var << llendl;
  328. v.zeroVec();
  329. }
  330. }
  331. void LLTemplateMessageReader::getQuat(const char *block, const char *var, 
  332.   LLQuaternion &q, S32 blocknum)
  333. {
  334. LLVector3 vec;
  335. getData(block, var, &vec.mV[0], sizeof(vec.mV), blocknum);
  336. if( vec.isFinite() )
  337. {
  338. q.unpackFromVector3( vec );
  339. }
  340. else
  341. {
  342. llwarns << "non-finite in getQuatFast " << block << " " << var 
  343. << llendl;
  344. q.loadIdentity();
  345. }
  346. }
  347. void LLTemplateMessageReader::getUUID(const char *block, const char *var, 
  348.   LLUUID &u, S32 blocknum)
  349. {
  350. getData(block, var, &u.mData[0], sizeof(u.mData), blocknum);
  351. }
  352. inline void LLTemplateMessageReader::getIPAddr(const char *block, const char *var, U32 &u, S32 blocknum)
  353. {
  354. getData(block, var, &u, sizeof(U32), blocknum);
  355. }
  356. inline void LLTemplateMessageReader::getIPPort(const char *block, const char *var, U16 &u, S32 blocknum)
  357. {
  358. getData(block, var, &u, sizeof(U16), blocknum);
  359. u = ntohs(u);
  360. }
  361. inline void LLTemplateMessageReader::getString(const char *block, const char *var, S32 buffer_size, char *s, S32 blocknum )
  362. {
  363. s[0] = '';
  364. getData(block, var, s, 0, blocknum, buffer_size);
  365. s[buffer_size - 1] = '';
  366. }
  367. inline void LLTemplateMessageReader::getString(const char *block, const char *var, std::string& outstr, S32 blocknum )
  368. {
  369. char s[MTUBYTES];
  370. s[0] = '';
  371. getData(block, var, s, 0, blocknum, MTUBYTES);
  372. s[MTUBYTES - 1] = '';
  373. outstr = s;
  374. }
  375. //virtual 
  376. S32 LLTemplateMessageReader::getMessageSize() const
  377. {
  378. return mReceiveSize;
  379. }
  380. // Returns template for the message contained in buffer
  381. BOOL LLTemplateMessageReader::decodeTemplate(  
  382. const U8* buffer, S32 buffer_size,  // inputs
  383. LLMessageTemplate** msg_template ) // outputs
  384. {
  385. const U8* header = buffer + LL_PACKET_ID_SIZE;
  386. // is there a message ready to go?
  387. if (buffer_size <= 0)
  388. {
  389. llwarns << "No message waiting for decode!" << llendl;
  390. return(FALSE);
  391. }
  392. U32 num = 0;
  393. if (header[0] != 255)
  394. {
  395. // high frequency message
  396. num = header[0];
  397. }
  398. else if ((buffer_size >= ((S32) LL_MINIMUM_VALID_PACKET_SIZE + 1)) && (header[1] != 255))
  399. {
  400. // medium frequency message
  401. num = (255 << 8) | header[1];
  402. }
  403. else if ((buffer_size >= ((S32) LL_MINIMUM_VALID_PACKET_SIZE + 3)) && (header[1] == 255))
  404. {
  405. // low frequency message
  406. U16 message_id_U16 = 0;
  407. // I think this check busts the message system.
  408. // it appears that if there is a NULL in the message #, it won't copy it....
  409. // what was the goal?
  410. //if(header[2])
  411. memcpy(&message_id_U16, &header[2], 2);
  412. // dependant on endian-ness:
  413. // U32 temp = (255 << 24) | (255 << 16) | header[2];
  414. // independant of endian-ness:
  415. message_id_U16 = ntohs(message_id_U16);
  416. num = 0xFFFF0000 | message_id_U16;
  417. }
  418. else // bogus packet received (too short)
  419. {
  420. llwarns << "Packet with unusable length received (too short): "
  421. << buffer_size << llendl;
  422. return(FALSE);
  423. }
  424. LLMessageTemplate* temp = get_ptr_in_map(mMessageNumbers,num);
  425. if (temp)
  426. {
  427. *msg_template = temp;
  428. }
  429. else
  430. {
  431. llwarns << "Message #" << std::hex << num << std::dec
  432. << " received but not registered!" << llendl;
  433. gMessageSystem->callExceptionFunc(MX_UNREGISTERED_MESSAGE);
  434. return(FALSE);
  435. }
  436. return(TRUE);
  437. }
  438. void LLTemplateMessageReader::logRanOffEndOfPacket( const LLHost& host, const S32 where, const S32 wanted )
  439. {
  440. // we've run off the end of the packet!
  441. llwarns << "Ran off end of packet " << mCurrentRMessageTemplate->mName
  442. // << " with id " << mCurrentRecvPacketID 
  443. << " from " << host
  444. << " trying to read " << wanted
  445. << " bytes at position " << where
  446. << " going past packet end at " << mReceiveSize
  447. << llendl;
  448. if(gMessageSystem->mVerboseLog)
  449. {
  450. llinfos << "MSG: -> " << host << "tREAD PAST END:t"
  451. // << mCurrentRecvPacketID << " "
  452. << getMessageName() << llendl;
  453. }
  454. gMessageSystem->callExceptionFunc(MX_RAN_OFF_END_OF_PACKET);
  455. }
  456. static LLFastTimer::DeclareTimer FTM_PROCESS_MESSAGES("Process Messages");
  457. // decode a given message
  458. BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender )
  459. {
  460. llassert( mReceiveSize >= 0 );
  461. llassert( mCurrentRMessageTemplate);
  462. llassert( !mCurrentRMessageData );
  463. delete mCurrentRMessageData; // just to make sure
  464. // The offset tells us how may bytes to skip after the end of the
  465. // message name.
  466. U8 offset = buffer[PHL_OFFSET];
  467. S32 decode_pos = LL_PACKET_ID_SIZE + (S32)(mCurrentRMessageTemplate->mFrequency) + offset;
  468. // create base working data set
  469. mCurrentRMessageData = new LLMsgData(mCurrentRMessageTemplate->mName);
  470. // loop through the template building the data structure as we go
  471. LLMessageTemplate::message_block_map_t::const_iterator iter;
  472. for(iter = mCurrentRMessageTemplate->mMemberBlocks.begin();
  473. iter != mCurrentRMessageTemplate->mMemberBlocks.end();
  474. ++iter)
  475. {
  476. LLMessageBlock* mbci = *iter;
  477. U8 repeat_number;
  478. S32 i;
  479. // how many of this block?
  480. if (mbci->mType == MBT_SINGLE)
  481. {
  482. // just one
  483. repeat_number = 1;
  484. }
  485. else if (mbci->mType == MBT_MULTIPLE)
  486. {
  487. // a known number
  488. repeat_number = mbci->mNumber;
  489. }
  490. else if (mbci->mType == MBT_VARIABLE)
  491. {
  492. // need to read the number from the message
  493. // repeat number is a single byte
  494. if (decode_pos >= mReceiveSize)
  495. {
  496. // commented out - hetgrid says that missing variable blocks
  497. // at end of message are legal
  498. // logRanOffEndOfPacket(sender, decode_pos, 1);
  499. // default to 0 repeats
  500. repeat_number = 0;
  501. }
  502. else
  503. {
  504. repeat_number = buffer[decode_pos];
  505. decode_pos++;
  506. }
  507. }
  508. else
  509. {
  510. llerrs << "Unknown block type" << llendl;
  511. return FALSE;
  512. }
  513. LLMsgBlkData* cur_data_block = NULL;
  514. // now loop through the block
  515. for (i = 0; i < repeat_number; i++)
  516. {
  517. if (i)
  518. {
  519. // build new name to prevent collisions
  520. // TODO: This should really change to a vector
  521. cur_data_block = new LLMsgBlkData(mbci->mName, repeat_number);
  522. cur_data_block->mName = mbci->mName + i;
  523. }
  524. else
  525. {
  526. cur_data_block = new LLMsgBlkData(mbci->mName, repeat_number);
  527. }
  528. // add the block to the message
  529. mCurrentRMessageData->addBlock(cur_data_block);
  530. // now read the variables
  531. for (LLMessageBlock::message_variable_map_t::const_iterator iter = 
  532.  mbci->mMemberVariables.begin();
  533.  iter != mbci->mMemberVariables.end(); iter++)
  534. {
  535. const LLMessageVariable& mvci = **iter;
  536. // ok, build out the variables
  537. // add variable block
  538. cur_data_block->addVariable(mvci.getName(), mvci.getType());
  539. // what type of variable?
  540. if (mvci.getType() == MVT_VARIABLE)
  541. {
  542. // variable, get the number of bytes to read from the template
  543. S32 data_size = mvci.getSize();
  544. U8 tsizeb = 0;
  545. U16 tsizeh = 0;
  546. U32 tsize = 0;
  547. if ((decode_pos + data_size) > mReceiveSize)
  548. {
  549. logRanOffEndOfPacket(sender, decode_pos, data_size);
  550. // default to 0 length variable blocks
  551. tsize = 0;
  552. }
  553. else
  554. {
  555. switch(data_size)
  556. {
  557. case 1:
  558. htonmemcpy(&tsizeb, &buffer[decode_pos], MVT_U8, 1);
  559. tsize = tsizeb;
  560. break;
  561. case 2:
  562. htonmemcpy(&tsizeh, &buffer[decode_pos], MVT_U16, 2);
  563. tsize = tsizeh;
  564. break;
  565. case 4:
  566. htonmemcpy(&tsize, &buffer[decode_pos], MVT_U32, 4);
  567. break;
  568. default:
  569. llerrs << "Attempting to read variable field with unknown size of " << data_size << llendl;
  570. break;
  571. }
  572. }
  573. decode_pos += data_size;
  574. cur_data_block->addData(mvci.getName(), &buffer[decode_pos], tsize, mvci.getType());
  575. decode_pos += tsize;
  576. }
  577. else
  578. {
  579. // fixed!
  580. // so, copy data pointer and set data size to fixed size
  581. if ((decode_pos + mvci.getSize()) > mReceiveSize)
  582. {
  583. logRanOffEndOfPacket(sender, decode_pos, mvci.getSize());
  584. // default to 0s.
  585. U32 size = mvci.getSize();
  586. std::vector<U8> data(size, 0);
  587. cur_data_block->addData(mvci.getName(), &(data[0]), 
  588. size, mvci.getType());
  589. }
  590. else
  591. {
  592. cur_data_block->addData(mvci.getName(), 
  593. &buffer[decode_pos], 
  594. mvci.getSize(), 
  595. mvci.getType());
  596. }
  597. decode_pos += mvci.getSize();
  598. }
  599. }
  600. }
  601. }
  602. if (mCurrentRMessageData->mMemberBlocks.empty()
  603. && !mCurrentRMessageTemplate->mMemberBlocks.empty())
  604. {
  605. lldebugs << "Empty message '" << mCurrentRMessageTemplate->mName << "' (no blocks)" << llendl;
  606. return FALSE;
  607. }
  608. {
  609. static LLTimer decode_timer;
  610. if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback())
  611. {
  612. decode_timer.reset();
  613. }
  614. {
  615. LLFastTimer t(FTM_PROCESS_MESSAGES);
  616. if( !mCurrentRMessageTemplate->callHandlerFunc(gMessageSystem) )
  617. {
  618. llwarns << "Message from " << sender << " with no handler function received: " << mCurrentRMessageTemplate->mName << llendl;
  619. }
  620. }
  621. if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback())
  622. {
  623. F32 decode_time = decode_timer.getElapsedTimeF32();
  624. if (gMessageSystem->getTimingCallback())
  625. {
  626. (gMessageSystem->getTimingCallback())(mCurrentRMessageTemplate->mName,
  627. decode_time,
  628. gMessageSystem->getTimingCallbackData());
  629. }
  630. if (LLMessageReader::getTimeDecodes())
  631. {
  632. mCurrentRMessageTemplate->mDecodeTimeThisFrame += decode_time;
  633. mCurrentRMessageTemplate->mTotalDecoded++;
  634. mCurrentRMessageTemplate->mTotalDecodeTime += decode_time;
  635. if( mCurrentRMessageTemplate->mMaxDecodeTimePerMsg < decode_time )
  636. {
  637. mCurrentRMessageTemplate->mMaxDecodeTimePerMsg = decode_time;
  638. }
  639. if(decode_time > LLMessageReader::getTimeDecodesSpamThreshold())
  640. {
  641. lldebugs << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
  642. mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " <<
  643. (mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << llendl;
  644. }
  645. }
  646. }
  647. }
  648. return TRUE;
  649. }
  650. BOOL LLTemplateMessageReader::validateMessage(const U8* buffer, 
  651.   S32 buffer_size, 
  652.   const LLHost& sender,
  653.   bool trusted)
  654. {
  655. mReceiveSize = buffer_size;
  656. BOOL valid = decodeTemplate(buffer, buffer_size, &mCurrentRMessageTemplate );
  657. if(valid)
  658. {
  659. mCurrentRMessageTemplate->mReceiveCount++;
  660. //lldebugs << "MessageRecvd:"
  661. //  << mCurrentRMessageTemplate->mName 
  662. //  << " from " << sender << llendl;
  663. }
  664. if (valid && isBanned(trusted))
  665. {
  666. LL_WARNS("Messaging") << "LLMessageSystem::checkMessages "
  667. << "received banned message "
  668. << getMessageName()
  669. << " from "
  670. << ((trusted) ? "trusted " : "untrusted ")
  671. << sender << llendl;
  672. valid = FALSE;
  673. }
  674. if(valid && isUdpBanned())
  675. {
  676. llwarns << "Received UDP black listed message "
  677. <<  getMessageName()
  678. << " from " << sender << llendl;
  679. valid = FALSE;
  680. }
  681. return valid;
  682. }
  683. BOOL LLTemplateMessageReader::readMessage(const U8* buffer, 
  684.   const LLHost& sender)
  685. {
  686. return decodeData(buffer, sender);
  687. }
  688. //virtual 
  689. const char* LLTemplateMessageReader::getMessageName() const
  690. {
  691. if (!mCurrentRMessageTemplate)
  692. {
  693. llwarns << "no mCurrentRMessageTemplate" << llendl;
  694. return "";
  695. }
  696. return mCurrentRMessageTemplate->mName;
  697. }
  698. //virtual 
  699. bool LLTemplateMessageReader::isTrusted() const
  700. {
  701. return mCurrentRMessageTemplate->getTrust() == MT_TRUST;
  702. }
  703. bool LLTemplateMessageReader::isBanned(bool trustedSource) const
  704. {
  705. return mCurrentRMessageTemplate->isBanned(trustedSource);
  706. }
  707. bool LLTemplateMessageReader::isUdpBanned() const
  708. {
  709. return mCurrentRMessageTemplate->isUdpBanned();
  710. }
  711. //virtual 
  712. void LLTemplateMessageReader::copyToBuilder(LLMessageBuilder& builder) const
  713. {
  714. if(NULL == mCurrentRMessageTemplate)
  715.     {
  716.         return;
  717.     }
  718. builder.copyFromMessageData(*mCurrentRMessageData);
  719. }