PageRenderTime 37ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/llmessage/llsdmessagereader.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 344 lines | 236 code | 42 blank | 66 comment | 13 complexity | ff46b6628e58e17738ad110b2c43a149 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llsdmessagereader.cpp
  3. * @brief LLSDMessageReader class implementation.
  4. *
  5. * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "linden_common.h"
  27. #include "llsdmessagereader.h"
  28. #include "llmessagebuilder.h"
  29. #include "llsdmessagebuilder.h"
  30. #include "llsdutil.h"
  31. #include "llsdutil_math.h"
  32. #include "v3math.h"
  33. #include "v4math.h"
  34. #include "v3dmath.h"
  35. #include "v2math.h"
  36. #include "llquaternion.h"
  37. #include "v4color.h"
  38. LLSDMessageReader::LLSDMessageReader() :
  39. mMessageName(NULL)
  40. {
  41. }
  42. //virtual
  43. LLSDMessageReader::~LLSDMessageReader()
  44. {
  45. }
  46. LLSD getLLSD(const LLSD& input, const char* block, const char* var, S32 blocknum)
  47. {
  48. // babbage: log error to llerrs if variable not found to mimic
  49. // LLTemplateMessageReader::getData behaviour
  50. if(NULL == block)
  51. {
  52. llerrs << "NULL block name" << llendl;
  53. return LLSD();
  54. }
  55. if(NULL == var)
  56. {
  57. llerrs << "NULL var name" << llendl;
  58. return LLSD();
  59. }
  60. if(! input[block].isArray())
  61. {
  62. // NOTE: babbage: need to return default for missing blocks to allow
  63. // backwards/forwards compatibility - handlers must cope with default
  64. // values.
  65. llwarns << "block " << block << " not found" << llendl;
  66. return LLSD();
  67. }
  68. LLSD result = input[block][blocknum][var];
  69. if(result.isUndefined())
  70. {
  71. // NOTE: babbage: need to return default for missing vars to allow
  72. // backwards/forwards compatibility - handlers must cope with default
  73. // values.
  74. llwarns << "var " << var << " not found" << llendl;
  75. }
  76. return result;
  77. }
  78. //virtual
  79. void LLSDMessageReader::getBinaryData(const char *block, const char *var,
  80. void *datap, S32 size, S32 blocknum,
  81. S32 max_size)
  82. {
  83. std::vector<U8> data = getLLSD(mMessage, block, var, blocknum);
  84. S32 data_size = (S32)data.size();
  85. if (size && data_size != size)
  86. {
  87. return;
  88. }
  89. if (max_size < data_size)
  90. {
  91. data_size = max_size;
  92. }
  93. // Calls to memcpy will fail if data_size is not positive.
  94. // Phoenix 2009-02-27
  95. if(data_size <= 0)
  96. {
  97. return;
  98. }
  99. memcpy(datap, &(data[0]), data_size);
  100. }
  101. //virtual
  102. void LLSDMessageReader::getBOOL(const char *block, const char *var,
  103. BOOL &data,
  104. S32 blocknum)
  105. {
  106. data = getLLSD(mMessage, block, var, blocknum);
  107. }
  108. //virtual
  109. void LLSDMessageReader::getS8(const char *block, const char *var, S8 &data,
  110. S32 blocknum)
  111. {
  112. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  113. }
  114. //virtual
  115. void LLSDMessageReader::getU8(const char *block, const char *var, U8 &data,
  116. S32 blocknum)
  117. {
  118. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  119. }
  120. //virtual
  121. void LLSDMessageReader::getS16(const char *block, const char *var, S16 &data,
  122. S32 blocknum)
  123. {
  124. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  125. }
  126. //virtual
  127. void LLSDMessageReader::getU16(const char *block, const char *var, U16 &data,
  128. S32 blocknum)
  129. {
  130. data = getLLSD(mMessage, block, var, blocknum).asInteger();
  131. }
  132. //virtual
  133. void LLSDMessageReader::getS32(const char *block, const char *var, S32 &data,
  134. S32 blocknum)
  135. {
  136. data = getLLSD(mMessage, block, var, blocknum);
  137. }
  138. //virtual
  139. void LLSDMessageReader::getF32(const char *block, const char *var, F32 &data,
  140. S32 blocknum)
  141. {
  142. data = (F32)getLLSD(mMessage, block, var, blocknum).asReal();
  143. }
  144. //virtual
  145. void LLSDMessageReader::getU32(const char *block, const char *var, U32 &data,
  146. S32 blocknum)
  147. {
  148. data = ll_U32_from_sd(getLLSD(mMessage, block, var, blocknum));
  149. }
  150. //virtual
  151. void LLSDMessageReader::getU64(const char *block, const char *var,
  152. U64 &data, S32 blocknum)
  153. {
  154. data = ll_U64_from_sd(getLLSD(mMessage, block, var, blocknum));
  155. }
  156. //virtual
  157. void LLSDMessageReader::getF64(const char *block, const char *var,
  158. F64 &data, S32 blocknum)
  159. {
  160. data = getLLSD(mMessage, block, var, blocknum);
  161. }
  162. //virtual
  163. void LLSDMessageReader::getVector3(const char *block, const char *var,
  164. LLVector3 &vec, S32 blocknum)
  165. {
  166. vec = ll_vector3_from_sd(getLLSD(mMessage, block, var, blocknum));
  167. }
  168. //virtual
  169. void LLSDMessageReader::getVector4(const char *block, const char *var,
  170. LLVector4 &vec, S32 blocknum)
  171. {
  172. vec = ll_vector4_from_sd(getLLSD(mMessage, block, var, blocknum));
  173. }
  174. //virtual
  175. void LLSDMessageReader::getVector3d(const char *block, const char *var,
  176. LLVector3d &vec, S32 blocknum)
  177. {
  178. vec = ll_vector3d_from_sd(getLLSD(mMessage, block, var, blocknum));
  179. }
  180. //virtual
  181. void LLSDMessageReader::getQuat(const char *block, const char *var,
  182. LLQuaternion &q, S32 blocknum)
  183. {
  184. q = ll_quaternion_from_sd(getLLSD(mMessage, block, var, blocknum));
  185. }
  186. //virtual
  187. void LLSDMessageReader::getUUID(const char *block, const char *var,
  188. LLUUID &uuid, S32 blocknum)
  189. {
  190. uuid = getLLSD(mMessage, block, var, blocknum);
  191. }
  192. //virtual
  193. void LLSDMessageReader::getIPAddr(const char *block, const char *var,
  194. U32 &ip, S32 blocknum)
  195. {
  196. ip = ll_ipaddr_from_sd(getLLSD(mMessage, block, var, blocknum));
  197. }
  198. //virtual
  199. void LLSDMessageReader::getIPPort(const char *block, const char *var,
  200. U16 &port, S32 blocknum)
  201. {
  202. port = getLLSD(mMessage, block, var, blocknum).asInteger();
  203. }
  204. //virtual
  205. void LLSDMessageReader::getString(const char *block, const char *var,
  206. S32 buffer_size, char *buffer, S32 blocknum)
  207. {
  208. if(buffer_size <= 0)
  209. {
  210. llwarns << "buffer_size <= 0" << llendl;
  211. return;
  212. }
  213. std::string data = getLLSD(mMessage, block, var, blocknum);
  214. S32 data_size = data.size();
  215. if (data_size >= buffer_size)
  216. {
  217. data_size = buffer_size - 1;
  218. }
  219. memcpy(buffer, data.data(), data_size);
  220. buffer[data_size] = '\0';
  221. }
  222. //virtual
  223. void LLSDMessageReader::getString(const char *block, const char *var,
  224. std::string& outstr, S32 blocknum)
  225. {
  226. outstr = getLLSD(mMessage, block, var, blocknum).asString();
  227. }
  228. //virtual
  229. S32 LLSDMessageReader::getNumberOfBlocks(const char *blockname)
  230. {
  231. return mMessage[blockname].size();
  232. }
  233. S32 getElementSize(const LLSD& llsd)
  234. {
  235. LLSD::Type type = llsd.type();
  236. switch(type)
  237. {
  238. case LLSD::TypeBoolean:
  239. return sizeof(bool);
  240. case LLSD::TypeInteger:
  241. return sizeof(S32);
  242. case LLSD::TypeReal:
  243. return sizeof(F64);
  244. case LLSD::TypeString:
  245. return llsd.asString().size();
  246. case LLSD::TypeUUID:
  247. return sizeof(LLUUID);
  248. case LLSD::TypeDate:
  249. return sizeof(LLDate);
  250. case LLSD::TypeURI:
  251. return sizeof(LLURI);
  252. case LLSD::TypeBinary:
  253. {
  254. std::vector<U8> data = llsd;
  255. return data.size() * sizeof(U8);
  256. }
  257. case LLSD::TypeMap:
  258. case LLSD::TypeArray:
  259. case LLSD::TypeUndefined:
  260. default: // TypeLLSDTypeEnd, TypeLLSDNumTypes, etc.
  261. return 0;
  262. }
  263. //return 0;
  264. }
  265. //virtual
  266. //Mainly used to find size of binary block of data
  267. S32 LLSDMessageReader::getSize(const char *blockname, const char *varname)
  268. {
  269. return getElementSize(mMessage[blockname][0][varname]);
  270. }
  271. //virtual
  272. S32 LLSDMessageReader::getSize(const char *blockname, S32 blocknum,
  273. const char *varname)
  274. {
  275. return getElementSize(mMessage[blockname][blocknum][varname]);
  276. }
  277. //virtual
  278. void LLSDMessageReader::clearMessage()
  279. {
  280. mMessage = LLSD();
  281. }
  282. //virtual
  283. const char* LLSDMessageReader::getMessageName() const
  284. {
  285. return mMessageName;
  286. }
  287. // virtual
  288. S32 LLSDMessageReader::getMessageSize() const
  289. {
  290. return 0;
  291. }
  292. //virtual
  293. void LLSDMessageReader::copyToBuilder(LLMessageBuilder& builder) const
  294. {
  295. builder.copyFromLLSD(mMessage);
  296. }
  297. void LLSDMessageReader::setMessage(const char* name, const LLSD& message)
  298. {
  299. mMessageName = name;
  300. // TODO: Validate
  301. mMessage = message;
  302. }