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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmessagetemplate.h
  3.  * @brief Declaration of the message template classes.
  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. #ifndef LL_LLMESSAGETEMPLATE_H
  33. #define LL_LLMESSAGETEMPLATE_H
  34. #include "lldarray.h"
  35. #include "message.h" // TODO: babbage: Remove...
  36. #include "llstat.h"
  37. #include "llstl.h"
  38. class LLMsgVarData
  39. {
  40. public:
  41. LLMsgVarData() : mName(NULL), mSize(-1), mDataSize(-1), mData(NULL), mType(MVT_U8)
  42. {
  43. }
  44. LLMsgVarData(const char *name, EMsgVariableType type) : mSize(-1), mDataSize(-1), mData(NULL), mType(type)
  45. {
  46. mName = (char *)name; 
  47. }
  48. ~LLMsgVarData() 
  49. {
  50. // copy constructor just copies the mData pointer, so only delete mData explicitly
  51. }
  52. void deleteData() 
  53. {
  54. delete[] mData;
  55. mData = NULL;
  56. }
  57. void addData(const void *indata, S32 size, EMsgVariableType type, S32 data_size = -1);
  58. char *getName() const { return mName; }
  59. S32 getSize() const { return mSize; }
  60. void *getData() { return (void*)mData; }
  61. const void *getData() const { return (const void*)mData; }
  62. S32 getDataSize() const { return mDataSize; }
  63. EMsgVariableType getType() const { return mType; }
  64. protected:
  65. char *mName;
  66. S32 mSize;
  67. S32 mDataSize;
  68. U8 *mData;
  69. EMsgVariableType mType;
  70. };
  71. class LLMsgBlkData
  72. {
  73. public:
  74.         LLMsgBlkData(const char *name, S32 blocknum) : mBlockNumber(blocknum), mTotalSize(-1) 
  75. mName = (char *)name; 
  76. }
  77. ~LLMsgBlkData()
  78. {
  79. for (msg_var_data_map_t::iterator iter = mMemberVarData.begin();
  80.  iter != mMemberVarData.end(); iter++)
  81. {
  82. iter->deleteData();
  83. }
  84. }
  85. void addVariable(const char *name, EMsgVariableType type)
  86. {
  87. LLMsgVarData tmp(name,type);
  88. mMemberVarData[name] = tmp;
  89. }
  90. void addData(char *name, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1)
  91. {
  92. LLMsgVarData* temp = &mMemberVarData[name]; // creates a new entry if one doesn't exist
  93. temp->addData(data, size, type, data_size);
  94. }
  95. S32 mBlockNumber;
  96. typedef LLDynamicArrayIndexed<LLMsgVarData, const char *, 8> msg_var_data_map_t;
  97. msg_var_data_map_t mMemberVarData;
  98. char *mName;
  99. S32 mTotalSize;
  100. };
  101. class LLMsgData
  102. {
  103. public:
  104. LLMsgData(const char *name) : mTotalSize(-1) 
  105. mName = (char *)name; 
  106. }
  107. ~LLMsgData()
  108. {
  109. for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePairedPointer());
  110. }
  111. void addBlock(LLMsgBlkData *blockp)
  112. {
  113. mMemberBlocks[blockp->mName] = blockp;
  114. }
  115. void addDataFast(char *blockname, char *varname, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1);
  116. public:
  117. typedef std::map<char*, LLMsgBlkData*> msg_blk_data_map_t;
  118. msg_blk_data_map_t mMemberBlocks;
  119. char *mName;
  120. S32 mTotalSize;
  121. };
  122. // LLMessage* classes store the template of messages
  123. class LLMessageVariable
  124. {
  125. public:
  126. LLMessageVariable() : mName(NULL), mType(MVT_NULL), mSize(-1)
  127. {
  128. }
  129. LLMessageVariable(char *name) : mType(MVT_NULL), mSize(-1)
  130. {
  131. mName = name;
  132. }
  133. LLMessageVariable(const char *name, const EMsgVariableType type, const S32 size) : mType(type), mSize(size) 
  134. {
  135. mName = LLMessageStringTable::getInstance()->getString(name); 
  136. }
  137. ~LLMessageVariable() {}
  138. friend std::ostream&  operator<<(std::ostream& s, LLMessageVariable &msg);
  139. EMsgVariableType getType() const { return mType; }
  140. S32 getSize() const { return mSize; }
  141. char *getName() const { return mName; }
  142. protected:
  143. char *mName;
  144. EMsgVariableType mType;
  145. S32 mSize;
  146. };
  147. typedef enum e_message_block_type
  148. {
  149. MBT_NULL,
  150. MBT_SINGLE,
  151. MBT_MULTIPLE,
  152. MBT_VARIABLE,
  153. MBT_EOF
  154. } EMsgBlockType;
  155. class LLMessageBlock
  156. {
  157. public:
  158. LLMessageBlock(const char *name, EMsgBlockType type, S32 number = 1) : mType(type), mNumber(number), mTotalSize(0) 
  159. mName = LLMessageStringTable::getInstance()->getString(name);
  160. }
  161. ~LLMessageBlock()
  162. {
  163. for_each(mMemberVariables.begin(), mMemberVariables.end(), DeletePointer());
  164. }
  165. void addVariable(char *name, const EMsgVariableType type, const S32 size)
  166. {
  167. LLMessageVariable** varp = &mMemberVariables[name];
  168. if (*varp != NULL)
  169. {
  170. llerrs << name << " has already been used as a variable name!" << llendl;
  171. }
  172. *varp = new LLMessageVariable(name, type, size);
  173. if (((*varp)->getType() != MVT_VARIABLE)
  174. &&(mTotalSize != -1))
  175. {
  176. mTotalSize += (*varp)->getSize();
  177. }
  178. else
  179. {
  180. mTotalSize = -1;
  181. }
  182. }
  183. EMsgVariableType getVariableType(char *name)
  184. {
  185. return (mMemberVariables[name])->getType();
  186. }
  187. S32 getVariableSize(char *name)
  188. {
  189. return (mMemberVariables[name])->getSize();
  190. }
  191. const LLMessageVariable* getVariable(char* name) const
  192. {
  193. message_variable_map_t::const_iterator iter = mMemberVariables.find(name);
  194. return iter != mMemberVariables.end()? *iter : NULL;
  195. }
  196. friend std::ostream&  operator<<(std::ostream& s, LLMessageBlock &msg);
  197. typedef LLDynamicArrayIndexed<LLMessageVariable*, const char *, 8> message_variable_map_t;
  198. message_variable_map_t  mMemberVariables;
  199. char *mName;
  200. EMsgBlockType mType;
  201. S32 mNumber;
  202. S32 mTotalSize;
  203. };
  204. enum EMsgFrequency
  205. {
  206. MFT_NULL = 0,  // value is size of message number in bytes
  207. MFT_HIGH = 1,
  208. MFT_MEDIUM = 2,
  209. MFT_LOW = 4
  210. };
  211. typedef enum e_message_trust
  212. {
  213. MT_TRUST,
  214. MT_NOTRUST
  215. } EMsgTrust;
  216. enum EMsgEncoding
  217. {
  218. ME_UNENCODED,
  219. ME_ZEROCODED
  220. };
  221. enum EMsgDeprecation
  222. {
  223. MD_NOTDEPRECATED,
  224. MD_UDPDEPRECATED,
  225. MD_UDPBLACKLISTED,
  226. MD_DEPRECATED
  227. };
  228. class LLMessageTemplate
  229. {
  230. public:
  231. LLMessageTemplate(const char *name, U32 message_number, EMsgFrequency freq)
  232. //mMemberBlocks(),
  233. mName(NULL),
  234. mFrequency(freq),
  235. mTrust(MT_NOTRUST),
  236. mEncoding(ME_ZEROCODED),
  237. mDeprecation(MD_NOTDEPRECATED),
  238. mMessageNumber(message_number),
  239. mTotalSize(0), 
  240. mReceiveCount(0),
  241. mReceiveBytes(0),
  242. mReceiveInvalid(0),
  243. mDecodeTimeThisFrame(0.f),
  244. mTotalDecoded(0),
  245. mTotalDecodeTime(0.f),
  246. mMaxDecodeTimePerMsg(0.f),
  247. mBanFromTrusted(false),
  248. mBanFromUntrusted(false),
  249. mHandlerFunc(NULL), 
  250. mUserData(NULL)
  251. mName = LLMessageStringTable::getInstance()->getString(name);
  252. }
  253. ~LLMessageTemplate()
  254. {
  255. for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePointer());
  256. }
  257. void addBlock(LLMessageBlock *blockp)
  258. {
  259. LLMessageBlock** member_blockp = &mMemberBlocks[blockp->mName];
  260. if (*member_blockp != NULL)
  261. {
  262. llerrs << "Block " << blockp->mName
  263. << "has already been used as a block name!" << llendl;
  264. }
  265. *member_blockp = blockp;
  266. if (  (mTotalSize != -1)
  267. &&(blockp->mTotalSize != -1)
  268. &&(  (blockp->mType == MBT_SINGLE)
  269.    ||(blockp->mType == MBT_MULTIPLE)))
  270. {
  271. mTotalSize += blockp->mNumber*blockp->mTotalSize;
  272. }
  273. else
  274. {
  275. mTotalSize = -1;
  276. }
  277. }
  278. LLMessageBlock *getBlock(char *name)
  279. {
  280. return mMemberBlocks[name];
  281. }
  282. // Trusted messages can only be recieved on trusted circuits.
  283. void setTrust(EMsgTrust t)
  284. {
  285. mTrust = t;
  286. }
  287. EMsgTrust getTrust(void) const
  288. {
  289. return mTrust;
  290. }
  291. // controls for how the message should be encoded
  292. void setEncoding(EMsgEncoding e)
  293. {
  294. mEncoding = e;
  295. }
  296. EMsgEncoding getEncoding() const
  297. {
  298. return mEncoding;
  299. }
  300. void setDeprecation(EMsgDeprecation d)
  301. {
  302. mDeprecation = d;
  303. }
  304. EMsgDeprecation getDeprecation() const
  305. {
  306. return mDeprecation;
  307. }
  308. void setHandlerFunc(void (*handler_func)(LLMessageSystem *msgsystem, void **user_data), void **user_data)
  309. {
  310. mHandlerFunc = handler_func;
  311. mUserData = user_data;
  312. }
  313. BOOL callHandlerFunc(LLMessageSystem *msgsystem) const
  314. {
  315. if (mHandlerFunc)
  316. {
  317.             LLPerfBlock msg_cb_time("msg_cb", mName);
  318. mHandlerFunc(msgsystem, mUserData);
  319. return TRUE;
  320. }
  321. return FALSE;
  322. }
  323. bool isUdpBanned() const
  324. {
  325. return mDeprecation == MD_UDPBLACKLISTED;
  326. }
  327. void banUdp();
  328. bool isBanned(bool trustedSource) const
  329. {
  330. return trustedSource ? mBanFromTrusted : mBanFromUntrusted;
  331. }
  332. friend std::ostream&  operator<<(std::ostream& s, LLMessageTemplate &msg);
  333. const LLMessageBlock* getBlock(char* name) const
  334. {
  335. message_block_map_t::const_iterator iter = mMemberBlocks.find(name);
  336. return iter != mMemberBlocks.end()? *iter : NULL;
  337. }
  338. public:
  339. typedef LLDynamicArrayIndexed<LLMessageBlock*, char*, 8> message_block_map_t;
  340. message_block_map_t mMemberBlocks;
  341. char *mName;
  342. EMsgFrequency mFrequency;
  343. EMsgTrust mTrust;
  344. EMsgEncoding mEncoding;
  345. EMsgDeprecation mDeprecation;
  346. U32 mMessageNumber;
  347. S32 mTotalSize;
  348. U32 mReceiveCount; // how many of this template have been received since last reset
  349. U32 mReceiveBytes; // How many bytes received
  350. U32 mReceiveInvalid; // How many "invalid" packets
  351. F32 mDecodeTimeThisFrame; // Total seconds spent decoding this frame
  352. U32 mTotalDecoded; // Total messages successfully decoded
  353. F32 mTotalDecodeTime; // Total time successfully decoding messages
  354. F32 mMaxDecodeTimePerMsg;
  355. bool mBanFromTrusted;
  356. bool mBanFromUntrusted;
  357. private:
  358. // message handler function (this is set by each application)
  359. void (*mHandlerFunc)(LLMessageSystem *msgsystem, void **user_data);
  360. void **mUserData;
  361. };
  362. #endif // LL_LLMESSAGETEMPLATE_H