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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsdmessagereader.cpp
  3.  * @brief LLSDMessageReader 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 "llsdmessagereader.h"
  34. #include "llmessagebuilder.h"
  35. #include "llsdmessagebuilder.h"
  36. #include "llsdutil.h"
  37. #include "llsdutil_math.h"
  38. #include "v3math.h"
  39. #include "v4math.h"
  40. #include "v3dmath.h"
  41. #include "v2math.h"
  42. #include "llquaternion.h"
  43. #include "v4color.h"
  44. LLSDMessageReader::LLSDMessageReader() :
  45. mMessageName(NULL)
  46. {
  47. }
  48. //virtual 
  49. LLSDMessageReader::~LLSDMessageReader()
  50. {
  51. }
  52. LLSD getLLSD(const LLSD& input, const char* block, const char* var, S32 blocknum)
  53. {
  54. // babbage: log error to llerrs if variable not found to mimic
  55. // LLTemplateMessageReader::getData behaviour
  56. if(NULL == block)
  57. {
  58. llerrs << "NULL block name" << llendl;
  59. return LLSD();
  60. }
  61. if(NULL == var)
  62. {
  63. llerrs << "NULL var name" << llendl;
  64. return LLSD();
  65. }
  66. if(! input[block].isArray())
  67. {
  68. // NOTE: babbage: need to return default for missing blocks to allow
  69. // backwards/forwards compatibility - handlers must cope with default
  70. // values.
  71. llwarns << "block " << block << " not found" << llendl;
  72. return LLSD();
  73. }
  74. LLSD result = input[block][blocknum][var]; 
  75. if(result.isUndefined())
  76. {
  77. // NOTE: babbage: need to return default for missing vars to allow
  78. // backwards/forwards compatibility - handlers must cope with default
  79. // values.
  80. llwarns << "var " << var << " not found" << llendl;
  81. }
  82. return result;
  83. }
  84. //virtual 
  85. void LLSDMessageReader::getBinaryData(const char *block, const char *var, 
  86.   void *datap, S32 size, S32 blocknum, 
  87.   S32 max_size)
  88. {
  89. std::vector<U8> data = getLLSD(mMessage, block, var, blocknum);
  90. S32 data_size = (S32)data.size();
  91. if (size && data_size != size)
  92. {
  93. return;
  94. }
  95. if (max_size < data_size)
  96. {
  97. data_size = max_size;
  98. }
  99. // Calls to memcpy will fail if data_size is not positive.
  100. // Phoenix 2009-02-27
  101. if(data_size <= 0)
  102. {
  103. return;
  104. }
  105. memcpy(datap, &(data[0]), data_size);
  106. }
  107. //virtual 
  108. void LLSDMessageReader::getBOOL(const char *block, const char *var, 
  109. BOOL &data, 
  110. S32 blocknum)
  111. {
  112. data = getLLSD(mMessage, block, var, blocknum);
  113. }
  114. //virtual 
  115. void LLSDMessageReader::getS8(const char *block, const char *var, S8 &data, 
  116.    S32 blocknum)
  117. {
  118. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  119. }
  120. //virtual 
  121. void LLSDMessageReader::getU8(const char *block, const char *var, U8 &data, 
  122.    S32 blocknum)
  123. {
  124. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  125. }
  126. //virtual 
  127. void LLSDMessageReader::getS16(const char *block, const char *var, S16 &data, 
  128. S32 blocknum)
  129. {
  130. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  131. }
  132. //virtual 
  133. void LLSDMessageReader::getU16(const char *block, const char *var, U16 &data, 
  134. S32 blocknum)
  135. {
  136. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  137. }
  138. //virtual 
  139. void LLSDMessageReader::getS32(const char *block, const char *var, S32 &data, 
  140. S32 blocknum)
  141. {
  142. data = getLLSD(mMessage, block, var, blocknum);
  143. }
  144. //virtual 
  145. void LLSDMessageReader::getF32(const char *block, const char *var, F32 &data, 
  146. S32 blocknum)
  147. {
  148. data = (F32)getLLSD(mMessage, block, var, blocknum).asReal();
  149. }
  150. //virtual 
  151. void LLSDMessageReader::getU32(const char *block, const char *var, U32 &data, 
  152. S32 blocknum)
  153. {
  154. data = ll_U32_from_sd(getLLSD(mMessage, block, var, blocknum));
  155. }
  156. //virtual 
  157. void LLSDMessageReader::getU64(const char *block, const char *var,
  158. U64 &data, S32 blocknum)
  159. {
  160. data = ll_U64_from_sd(getLLSD(mMessage, block, var, blocknum));
  161. }
  162. //virtual 
  163. void LLSDMessageReader::getF64(const char *block, const char *var,
  164. F64 &data, S32 blocknum)
  165. {
  166. data = getLLSD(mMessage, block, var, blocknum);
  167. }
  168. //virtual 
  169. void LLSDMessageReader::getVector3(const char *block, const char *var, 
  170. LLVector3 &vec, S32 blocknum)
  171. {
  172. vec = ll_vector3_from_sd(getLLSD(mMessage, block, var, blocknum));
  173. }
  174. //virtual 
  175. void LLSDMessageReader::getVector4(const char *block, const char *var, 
  176. LLVector4 &vec, S32 blocknum)
  177. {
  178. vec = ll_vector4_from_sd(getLLSD(mMessage, block, var, blocknum));
  179. }
  180. //virtual 
  181. void LLSDMessageReader::getVector3d(const char *block, const char *var, 
  182.  LLVector3d &vec, S32 blocknum)
  183. {
  184. vec = ll_vector3d_from_sd(getLLSD(mMessage, block, var, blocknum));
  185. }
  186. //virtual 
  187. void LLSDMessageReader::getQuat(const char *block, const char *var,
  188.  LLQuaternion &q, S32 blocknum)
  189. {
  190. q = ll_quaternion_from_sd(getLLSD(mMessage, block, var, blocknum));
  191. }
  192. //virtual 
  193. void LLSDMessageReader::getUUID(const char *block, const char *var,
  194.  LLUUID &uuid, S32 blocknum)
  195. {
  196. uuid = getLLSD(mMessage, block, var, blocknum);
  197. }
  198. //virtual 
  199. void LLSDMessageReader::getIPAddr(const char *block, const char *var,
  200.    U32 &ip, S32 blocknum)
  201. {
  202. ip = ll_ipaddr_from_sd(getLLSD(mMessage, block, var, blocknum));
  203. }
  204. //virtual 
  205. void LLSDMessageReader::getIPPort(const char *block, const char *var,
  206.    U16 &port, S32 blocknum)
  207. {
  208. port = getLLSD(mMessage, block, var, blocknum).asInteger();
  209. }
  210. //virtual 
  211. void LLSDMessageReader::getString(const char *block, const char *var, 
  212.    S32 buffer_size, char *buffer, S32 blocknum)
  213. {
  214. if(buffer_size <= 0)
  215. {
  216. llwarns << "buffer_size <= 0" << llendl;
  217. return;
  218. }
  219. std::string data = getLLSD(mMessage, block, var, blocknum);
  220. S32 data_size = data.size();
  221. if (data_size >= buffer_size)
  222. {
  223. data_size = buffer_size - 1;
  224. }
  225. memcpy(buffer, data.data(), data_size);
  226. buffer[data_size] = '';
  227. }
  228. //virtual 
  229. void LLSDMessageReader::getString(const char *block, const char *var, 
  230.    std::string& outstr, S32 blocknum)
  231. {
  232. outstr = getLLSD(mMessage, block, var, blocknum).asString();
  233. }
  234. //virtual 
  235. S32 LLSDMessageReader::getNumberOfBlocks(const char *blockname)
  236. {
  237. return mMessage[blockname].size();
  238. }
  239. S32 getElementSize(const LLSD& llsd)
  240. {
  241. LLSD::Type type = llsd.type();
  242. switch(type)
  243. {
  244. case LLSD::TypeBoolean:
  245. return sizeof(bool);
  246. case LLSD::TypeInteger:
  247. return sizeof(S32);
  248. case LLSD::TypeReal:
  249. return sizeof(F64);
  250. case LLSD::TypeString:
  251. return llsd.asString().size();
  252. case LLSD::TypeUUID:
  253. return sizeof(LLUUID);
  254. case LLSD::TypeDate:
  255. return sizeof(LLDate);
  256. case LLSD::TypeURI:
  257. return sizeof(LLURI);
  258. case LLSD::TypeBinary:
  259. {
  260. std::vector<U8> data = llsd;
  261. return data.size() * sizeof(U8);
  262. }
  263. case LLSD::TypeMap:
  264. case LLSD::TypeArray:
  265. case LLSD::TypeUndefined:
  266. return 0;
  267. }
  268. return 0;
  269. }
  270. //virtual 
  271. //Mainly used to find size of binary block of data
  272. S32 LLSDMessageReader::getSize(const char *blockname, const char *varname)
  273. {
  274. return getElementSize(mMessage[blockname][0][varname]);
  275. }
  276. //virtual 
  277. S32 LLSDMessageReader::getSize(const char *blockname, S32 blocknum, 
  278.    const char *varname)
  279. {
  280. return getElementSize(mMessage[blockname][blocknum][varname]);
  281. }
  282. //virtual 
  283. void LLSDMessageReader::clearMessage()
  284. {
  285. mMessage = LLSD();
  286. }
  287. //virtual 
  288. const char* LLSDMessageReader::getMessageName() const
  289. {
  290. return mMessageName;
  291. }
  292. // virtual 
  293. S32 LLSDMessageReader::getMessageSize() const
  294. {
  295. return 0;
  296. }
  297. //virtual 
  298. void LLSDMessageReader::copyToBuilder(LLMessageBuilder& builder) const
  299. {
  300. builder.copyFromLLSD(mMessage);
  301. }
  302. void LLSDMessageReader::setMessage(const char* name, const LLSD& message)
  303. {
  304. mMessageName = name;
  305. // TODO: Validate
  306. mMessage = message;
  307. }