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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llnamevalue.cpp
  3.  * @brief class for defining name value pairs.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-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. // Examples:
  33. // AvatarCharacter STRING RW DSV male1
  34. #include "linden_common.h"
  35. #include "llnamevalue.h"
  36. #include "u64.h"
  37. #include "llstring.h"
  38. #include "string_table.h"
  39. // Anonymous enumeration to provide constants in this file.
  40. // *NOTE: These values may be used in sscanf statements below as their
  41. // value-1, so search for '2047' if you cange NV_BUFFER_LEN or '63' if
  42. // you change U64_BUFFER_LEN.
  43. enum
  44. {
  45. NV_BUFFER_LEN = 2048,
  46. U64_BUFFER_LEN = 64
  47. };
  48. LLStringTable gNVNameTable(256);
  49. char NameValueTypeStrings[NVT_EOF][NAME_VALUE_TYPE_STRING_LENGTH] = /*Flawfinder: Ignore*/
  50. {
  51. "NULL",
  52. "STRING",
  53. "F32",
  54. "S32",
  55. "VEC3",
  56. "U32",
  57. "CAMERA", // Deprecated, but leaving in case removing completely would cause problems
  58. "ASSET",
  59. "U64"
  60. };
  61. char NameValueClassStrings[NVC_EOF][NAME_VALUE_CLASS_STRING_LENGTH] = /*Flawfinder: Ignore*/
  62. {
  63. "NULL",
  64. "R", // read only
  65. "RW" // read write
  66. };
  67. char NameValueSendtoStrings[NVS_EOF][NAME_VALUE_SENDTO_STRING_LENGTH] = /*Flawfinder: Ignore*/
  68. {
  69. "NULL",
  70. "S", // "Sim", formerly SIM
  71. "DS", // "Data Sim" formerly SIM_SPACE
  72. "SV", // "Sim Viewer" formerly SIM_VIEWER
  73. "DSV" // "Data Sim Viewer", formerly SIM_SPACE_VIEWER
  74. }; /*Flawfinder: Ignore*/
  75. //
  76. // Class
  77. //
  78. LLNameValue::LLNameValue()
  79. {
  80. baseInit();
  81. }
  82. void LLNameValue::baseInit()
  83. {
  84. mNVNameTable = &gNVNameTable;
  85. mName = NULL;
  86. mNameValueReference.string = NULL;
  87. mType = NVT_NULL;
  88. mStringType = NameValueTypeStrings[NVT_NULL];
  89. mClass = NVC_NULL;
  90. mStringClass = NameValueClassStrings[NVC_NULL];
  91. mSendto = NVS_NULL;
  92. mStringSendto = NameValueSendtoStrings[NVS_NULL];
  93. }
  94. void LLNameValue::init(const char *name, const char *data, const char *type, const char *nvclass, const char *nvsendto)
  95. {
  96. mNVNameTable = &gNVNameTable;
  97. mName = mNVNameTable->addString(name);
  98. // Nota Bene: Whatever global structure manages this should have these in the name table already!
  99. mStringType = mNVNameTable->addString(type);
  100. if (!strcmp(mStringType, "STRING"))
  101. {
  102. S32 string_length = (S32)strlen(data); /*Flawfinder: Ignore*/
  103. mType = NVT_STRING;
  104. delete[] mNameValueReference.string;
  105. // two options here. . .  data can either look like foo or "foo"
  106. // WRONG! - this is a poorly implemented and incomplete escape
  107. // mechanism. For example, using this scheme, there is no way
  108. // to tell an intentional double quotes from a zero length
  109. // string. This needs to excised. Phoenix
  110. //if (strchr(data, '"'))
  111. //{
  112. // string_length -= 2;
  113. // mNameValueReference.string = new char[string_length + 1];;
  114. // strncpy(mNameValueReference.string, data + 1, string_length);
  115. //}
  116. //else
  117. //{
  118. mNameValueReference.string = new char[string_length + 1];;
  119. strncpy(mNameValueReference.string, data, string_length); /*Flawfinder: Ignore*/
  120. //}
  121. mNameValueReference.string[string_length] = 0;
  122. }
  123. else if (!strcmp(mStringType, "F32"))
  124. {
  125. mType = NVT_F32;
  126. mNameValueReference.f32 = new F32((F32)atof(data));
  127. }
  128. else if (!strcmp(mStringType, "S32"))
  129. {
  130. mType = NVT_S32;
  131. mNameValueReference.s32 = new S32(atoi(data));
  132. }
  133. else if (!strcmp(mStringType, "U64"))
  134. {
  135. mType = NVT_U64;
  136. mNameValueReference.u64 = new U64(str_to_U64(ll_safe_string(data)));
  137. }
  138. else if (!strcmp(mStringType, "VEC3"))
  139. {
  140. mType = NVT_VEC3;
  141. F32 t1, t2, t3;
  142. // two options here. . .  data can either look like 0, 1, 2 or <0, 1, 2>
  143. if (strchr(data, '<'))
  144. {
  145. sscanf(data, "<%f, %f, %f>", &t1, &t2, &t3);
  146. }
  147. else
  148. {
  149. sscanf(data, "%f, %f, %f", &t1, &t2, &t3);
  150. }
  151. // finite checks
  152. if (!llfinite(t1) || !llfinite(t2) || !llfinite(t3))
  153. {
  154. t1 = 0.f;
  155. t2 = 0.f;
  156. t3 = 0.f;
  157. }
  158. mNameValueReference.vec3 = new LLVector3(t1, t2, t3);
  159. }
  160. else if (!strcmp(mStringType, "U32"))
  161. {
  162. mType = NVT_U32;
  163. mNameValueReference.u32 = new U32(atoi(data));
  164. }
  165. else if(!strcmp(mStringType, (const char*)NameValueTypeStrings[NVT_ASSET]))
  166. {
  167. // assets are treated like strings, except that the name has
  168. // meaning to an LLAssetInfo object
  169. S32 string_length = (S32)strlen(data); /*Flawfinder: Ignore*/
  170. mType = NVT_ASSET;
  171. // two options here. . .  data can either look like foo or "foo"
  172. // WRONG! - this is a poorly implemented and incomplete escape
  173. // mechanism. For example, using this scheme, there is no way
  174. // to tell an intentional double quotes from a zero length
  175. // string. This needs to excised. Phoenix
  176. //if (strchr(data, '"'))
  177. //{
  178. // string_length -= 2;
  179. // mNameValueReference.string = new char[string_length + 1];;
  180. // strncpy(mNameValueReference.string, data + 1, string_length);
  181. //}
  182. //else
  183. //{
  184. mNameValueReference.string = new char[string_length + 1];;
  185. strncpy(mNameValueReference.string, data, string_length); /*Flawfinder: Ignore*/
  186. //}
  187. mNameValueReference.string[string_length] = 0;
  188. }
  189. else
  190. {
  191. llwarns << "Unknown name value type string " << mStringType << " for " << mName << llendl;
  192. mType = NVT_NULL;
  193. }
  194. // Nota Bene: Whatever global structure manages this should have these in the name table already!
  195. if (!strcmp(nvclass, "R") ||
  196. !strcmp(nvclass, "READ_ONLY")) // legacy
  197. {
  198. mClass = NVC_READ_ONLY;
  199. mStringClass = mNVNameTable->addString("R");
  200. }
  201. else if (!strcmp(nvclass, "RW") ||
  202. !strcmp(nvclass, "READ_WRITE")) // legacy
  203. {
  204. mClass = NVC_READ_WRITE;
  205. mStringClass = mNVNameTable->addString("RW");
  206. }
  207. else
  208. {
  209. // assume it's bad
  210. mClass = NVC_NULL;
  211. mStringClass = mNVNameTable->addString(nvclass);
  212. }
  213. // Initialize the sendto variable
  214. if (!strcmp(nvsendto, "S") ||
  215. !strcmp(nvsendto, "SIM")) // legacy
  216. {
  217. mSendto = NVS_SIM;
  218. mStringSendto = mNVNameTable->addString("S");
  219. }
  220. else if (!strcmp(nvsendto, "DS") ||
  221. !strcmp(nvsendto, "SIM_SPACE")) // legacy
  222. {
  223. mSendto = NVS_DATA_SIM;
  224. mStringSendto = mNVNameTable->addString("DS");
  225. }
  226. else if (!strcmp(nvsendto, "SV") ||
  227. !strcmp(nvsendto, "SIM_VIEWER")) // legacy
  228. {
  229. mSendto = NVS_SIM_VIEWER;
  230. mStringSendto = mNVNameTable->addString("SV");
  231. }
  232. else if (!strcmp(nvsendto, "DSV") ||
  233. !strcmp(nvsendto, "SIM_SPACE_VIEWER")) // legacy
  234. {
  235. mSendto = NVS_DATA_SIM_VIEWER;
  236. mStringSendto = mNVNameTable->addString("DSV");
  237. }
  238. else
  239. {
  240. llwarns << "LLNameValue::init() - unknown sendto field " 
  241. << nvsendto << " for NV " << mName << llendl;
  242. mSendto = NVS_NULL;
  243. mStringSendto = mNVNameTable->addString("S");
  244. }
  245. }
  246. LLNameValue::LLNameValue(const char *name, const char *data, const char *type, const char *nvclass)
  247. {
  248. baseInit();
  249. // if not specified, send to simulator only
  250. init(name, data, type, nvclass, "SIM");
  251. }
  252. LLNameValue::LLNameValue(const char *name, const char *data, const char *type, const char *nvclass, const char *nvsendto)
  253. {
  254. baseInit();
  255. init(name, data, type, nvclass, nvsendto);
  256. }
  257. // Initialize without any initial data.
  258. LLNameValue::LLNameValue(const char *name, const char *type, const char *nvclass)
  259. {
  260. baseInit();
  261. mName = mNVNameTable->addString(name);
  262. // Nota Bene: Whatever global structure manages this should have these in the name table already!
  263. mStringType = mNVNameTable->addString(type);
  264. if (!strcmp(mStringType, "STRING"))
  265. {
  266. mType = NVT_STRING;
  267. mNameValueReference.string = NULL;
  268. }
  269. else if (!strcmp(mStringType, "F32"))
  270. {
  271. mType = NVT_F32;
  272. mNameValueReference.f32 = NULL;
  273. }
  274. else if (!strcmp(mStringType, "S32"))
  275. {
  276. mType = NVT_S32;
  277. mNameValueReference.s32 = NULL;
  278. }
  279. else if (!strcmp(mStringType, "VEC3"))
  280. {
  281. mType = NVT_VEC3;
  282. mNameValueReference.vec3 = NULL;
  283. }
  284. else if (!strcmp(mStringType, "U32"))
  285. {
  286. mType = NVT_U32;
  287. mNameValueReference.u32 = NULL;
  288. }
  289. else if (!strcmp(mStringType, "U64"))
  290. {
  291. mType = NVT_U64;
  292. mNameValueReference.u64 = NULL;
  293. }
  294. else if(!strcmp(mStringType, (const char*)NameValueTypeStrings[NVT_ASSET]))
  295. {
  296. mType = NVT_ASSET;
  297. mNameValueReference.string = NULL;
  298. }
  299. else
  300. {
  301. mType = NVT_NULL;
  302. llinfos << "Unknown name-value type " << mStringType << llendl;
  303. }
  304. // Nota Bene: Whatever global structure manages this should have these in the name table already!
  305. mStringClass = mNVNameTable->addString(nvclass);
  306. if (!strcmp(mStringClass, "READ_ONLY"))
  307. {
  308. mClass = NVC_READ_ONLY;
  309. }
  310. else if (!strcmp(mStringClass, "READ_WRITE"))
  311. {
  312. mClass = NVC_READ_WRITE;
  313. }
  314. else
  315. {
  316. mClass = NVC_NULL;
  317. }
  318. // Initialize the sendto variable
  319. mStringSendto = mNVNameTable->addString("SIM");
  320. mSendto = NVS_SIM;
  321. }
  322. // data is in the format:
  323. // "NameValueName Type Class Data"
  324. LLNameValue::LLNameValue(const char *data)
  325. {
  326. baseInit();
  327. static char name[NV_BUFFER_LEN]; /*Flawfinder: ignore*/
  328. static char type[NV_BUFFER_LEN]; /*Flawfinder: ignore*/
  329. static char nvclass[NV_BUFFER_LEN]; /*Flawfinder: ignore*/
  330. static char nvsendto[NV_BUFFER_LEN]; /*Flawfinder: ignore*/
  331. static char nvdata[NV_BUFFER_LEN]; /*Flawfinder: ignore*/
  332. S32 i;
  333. S32 character_count = 0;
  334. S32 length = 0;
  335. // go to first non-whitespace character
  336. while (1)
  337. {
  338. if (  (*(data + character_count) == ' ')
  339. ||(*(data + character_count) == 'n')
  340. ||(*(data + character_count) == 't')
  341. ||(*(data + character_count) == 'r'))
  342. {
  343. character_count++;
  344. }
  345. else
  346. {
  347. break;
  348. }
  349. }
  350. // read in the name
  351. sscanf((data + character_count), "%2047s", name); /*Flawfinder: ignore*/
  352. // bump past it and add null terminator
  353. length = (S32)strlen(name); /* Flawfinder: ignore */
  354. name[length] = 0;
  355. character_count += length;
  356. // go to the next non-whitespace character
  357. while (1)
  358. {
  359. if (  (*(data + character_count) == ' ')
  360. ||(*(data + character_count) == 'n')
  361. ||(*(data + character_count) == 't')
  362. ||(*(data + character_count) == 'r'))
  363. {
  364. character_count++;
  365. }
  366. else
  367. {
  368. break;
  369. }
  370. }
  371. // read in the type
  372. sscanf((data + character_count), "%2047s", type); /*Flawfinder: ignore*/
  373. // bump past it and add null terminator
  374. length = (S32)strlen(type); /* Flawfinder: ignore */
  375. type[length] = 0;
  376. character_count += length;
  377. // go to the next non-whitespace character
  378. while (1)
  379. {
  380. if (  (*(data + character_count) == ' ')
  381. ||(*(data + character_count) == 'n')
  382. ||(*(data + character_count) == 't')
  383. ||(*(data + character_count) == 'r'))
  384. {
  385. character_count++;
  386. }
  387. else
  388. {
  389. break;
  390. }
  391. }
  392. // do we have a type argument?
  393. for (i = NVC_READ_ONLY; i < NVC_EOF; i++)
  394. {
  395. if (!strncmp(NameValueClassStrings[i], data + character_count, strlen(NameValueClassStrings[i]))) /* Flawfinder: ignore */
  396. {
  397. break;
  398. }
  399. }
  400. if (i != NVC_EOF)
  401. {
  402. // yes we do!
  403. // read in the class
  404. sscanf((data + character_count), "%2047s", nvclass); /*Flawfinder: ignore*/
  405. // bump past it and add null terminator
  406. length = (S32)strlen(nvclass); /* Flawfinder: ignore */
  407. nvclass[length] = 0;
  408. character_count += length;
  409. // go to the next non-whitespace character
  410. while (1)
  411. {
  412. if (  (*(data + character_count) == ' ')
  413. ||(*(data + character_count) == 'n')
  414. ||(*(data + character_count) == 't')
  415. ||(*(data + character_count) == 'r'))
  416. {
  417. character_count++;
  418. }
  419. else
  420. {
  421. break;
  422. }
  423. }
  424. }
  425. else
  426. {
  427. // no type argument given, default to read-write
  428. strncpy(nvclass, "READ_WRITE", sizeof(nvclass) -1); /* Flawfinder: ignore */
  429. nvclass[sizeof(nvclass) -1] = '';
  430. }
  431. // Do we have a sendto argument?
  432. for (i = NVS_SIM; i < NVS_EOF; i++)
  433. {
  434. if (!strncmp(NameValueSendtoStrings[i], data + character_count, strlen(NameValueSendtoStrings[i]))) /* Flawfinder: ignore */
  435. {
  436. break;
  437. }
  438. }
  439. if (i != NVS_EOF)
  440. {
  441. // found a sendto argument
  442. sscanf((data + character_count), "%2047s", nvsendto); /*Flawfinder: ignore*/
  443. // add null terminator
  444. length = (S32)strlen(nvsendto); /* Flawfinder: ignore */
  445. nvsendto[length] = 0;
  446. character_count += length;
  447. // seek to next non-whitespace characer
  448. while (1)
  449. {
  450. if (  (*(data + character_count) == ' ')
  451. ||(*(data + character_count) == 'n')
  452. ||(*(data + character_count) == 't')
  453. ||(*(data + character_count) == 'r'))
  454. {
  455. character_count++;
  456. }
  457. else
  458. {
  459. break;
  460. }
  461. }
  462. }
  463. else
  464. {
  465. // no sendto argument given, default to sim only
  466. strncpy(nvsendto, "SIM", sizeof(nvsendto) -1); /* Flawfinder: ignore */
  467. nvsendto[sizeof(nvsendto) -1] ='';
  468. }
  469. // copy the rest character by character into data
  470. length = 0;
  471. while ( (*(nvdata + length++) = *(data + character_count++)) )
  472. ;
  473. init(name, nvdata, type, nvclass, nvsendto);
  474. }
  475. LLNameValue::~LLNameValue()
  476. {
  477. mNVNameTable->removeString(mName);
  478. mName = NULL;
  479. switch(mType)
  480. {
  481. case NVT_STRING:
  482. case NVT_ASSET:
  483. delete [] mNameValueReference.string;
  484. mNameValueReference.string = NULL;
  485. break;
  486. case NVT_F32:
  487. delete mNameValueReference.f32;
  488. mNameValueReference.string = NULL;
  489. break;
  490. case NVT_S32:
  491. delete mNameValueReference.s32;
  492. mNameValueReference.string = NULL;
  493. break;
  494. case NVT_VEC3:
  495. delete mNameValueReference.vec3;
  496. mNameValueReference.string = NULL;
  497. break;
  498. case NVT_U32:
  499. delete mNameValueReference.u32;
  500. mNameValueReference.u32 = NULL;
  501. break;
  502. case NVT_U64:
  503. delete mNameValueReference.u64;
  504. mNameValueReference.u64 = NULL;
  505. break;
  506. default:
  507. break;
  508. }
  509. delete[] mNameValueReference.string;
  510. mNameValueReference.string = NULL;
  511. }
  512. char *LLNameValue::getString()
  513. {
  514. if (mType == NVT_STRING)
  515. {
  516. return mNameValueReference.string;
  517. }
  518. else
  519. {
  520. llerrs << mName << " not a string!" << llendl;
  521. return NULL;
  522. }
  523. }
  524. const char *LLNameValue::getAsset() const
  525. {
  526. if (mType == NVT_ASSET)
  527. {
  528. return mNameValueReference.string;
  529. }
  530. else
  531. {
  532. llerrs << mName << " not an asset!" << llendl;
  533. return NULL;
  534. }
  535. }
  536. F32 *LLNameValue::getF32()
  537. {
  538. if (mType == NVT_F32)
  539. {
  540. return mNameValueReference.f32;
  541. }
  542. else
  543. {
  544. llerrs << mName << " not a F32!" << llendl;
  545. return NULL;
  546. }
  547. }
  548. S32 *LLNameValue::getS32()
  549. {
  550. if (mType == NVT_S32)
  551. {
  552. return mNameValueReference.s32;
  553. }
  554. else
  555. {
  556. llerrs << mName << " not a S32!" << llendl;
  557. return NULL;
  558. }
  559. }
  560. U32 *LLNameValue::getU32()
  561. {
  562. if (mType == NVT_U32)
  563. {
  564. return mNameValueReference.u32;
  565. }
  566. else
  567. {
  568. llerrs << mName << " not a U32!" << llendl;
  569. return NULL;
  570. }
  571. }
  572. U64 *LLNameValue::getU64()
  573. {
  574. if (mType == NVT_U64)
  575. {
  576. return mNameValueReference.u64;
  577. }
  578. else
  579. {
  580. llerrs << mName << " not a U64!" << llendl;
  581. return NULL;
  582. }
  583. }
  584. void LLNameValue::getVec3(LLVector3 &vec)
  585. {
  586. if (mType == NVT_VEC3)
  587. {
  588. vec = *mNameValueReference.vec3;
  589. }
  590. else
  591. {
  592. llerrs << mName << " not a Vec3!" << llendl;
  593. }
  594. }
  595. LLVector3 *LLNameValue::getVec3()
  596. {
  597. if (mType == NVT_VEC3)
  598. {
  599.  return (mNameValueReference.vec3);
  600. }
  601. else
  602. {
  603. llerrs << mName << " not a Vec3!" << llendl;
  604. return NULL;
  605. }
  606. }
  607. BOOL LLNameValue::sendToData() const
  608. {
  609. return (mSendto == NVS_DATA_SIM || mSendto == NVS_DATA_SIM_VIEWER);
  610. }
  611. BOOL LLNameValue::sendToViewer() const
  612. {
  613. return (mSendto == NVS_SIM_VIEWER || mSendto == NVS_DATA_SIM_VIEWER);
  614. }
  615. LLNameValue &LLNameValue::operator=(const LLNameValue &a)
  616. {
  617. if (mType != a.mType)
  618. {
  619. return *this;
  620. }
  621. if (mClass == NVC_READ_ONLY)
  622. return *this;
  623. switch(a.mType)
  624. {
  625. case NVT_STRING:
  626. case NVT_ASSET:
  627. if (mNameValueReference.string)
  628. delete [] mNameValueReference.string;
  629. mNameValueReference.string = new char [strlen(a.mNameValueReference.string) + 1]; /* Flawfinder: ignore */
  630. if(mNameValueReference.string != NULL)
  631. {
  632. strcpy(mNameValueReference.string, a.mNameValueReference.string); /* Flawfinder: ignore */
  633. }
  634. break;
  635. case NVT_F32:
  636. *mNameValueReference.f32 = *a.mNameValueReference.f32;
  637. break;
  638. case NVT_S32:
  639. *mNameValueReference.s32 = *a.mNameValueReference.s32;
  640. break;
  641. case NVT_VEC3:
  642. *mNameValueReference.vec3 = *a.mNameValueReference.vec3;
  643. break;
  644. case NVT_U32:
  645. *mNameValueReference.u32 = *a.mNameValueReference.u32;
  646. break;
  647. case NVT_U64:
  648. *mNameValueReference.u64 = *a.mNameValueReference.u64;
  649. break;
  650. default:
  651. llerrs << "Unknown Name value type " << (U32)a.mType << llendl;
  652. break;
  653. }
  654. return *this;
  655. }
  656. void LLNameValue::setString(const char *a)
  657. {
  658. if (mClass == NVC_READ_ONLY)
  659. return;
  660. switch(mType)
  661. {
  662. case NVT_STRING:
  663. if (a)
  664. {
  665. if (mNameValueReference.string)
  666. {
  667. delete [] mNameValueReference.string;
  668. }
  669. mNameValueReference.string = new char [strlen(a) + 1]; /* Flawfinder: ignore */
  670. if(mNameValueReference.string != NULL)
  671. {
  672. strcpy(mNameValueReference.string,  a); /* Flawfinder: ignore */
  673. }
  674. }
  675. else
  676. {
  677. if (mNameValueReference.string)
  678. delete [] mNameValueReference.string;
  679. mNameValueReference.string = new char [1];
  680. mNameValueReference.string[0] = 0;
  681. }
  682. break;
  683. default:
  684. break;
  685. }
  686. return;
  687. }
  688. void LLNameValue::setAsset(const char *a)
  689. {
  690. if (mClass == NVC_READ_ONLY)
  691. return;
  692. switch(mType)
  693. {
  694. case NVT_ASSET:
  695. if (a)
  696. {
  697. if (mNameValueReference.string)
  698. {
  699. delete [] mNameValueReference.string;
  700. }
  701. mNameValueReference.string = new char [strlen(a) + 1]; /* Flawfinder: ignore */
  702. if(mNameValueReference.string != NULL)
  703. {
  704. strcpy(mNameValueReference.string,  a); /* Flawfinder: ignore */
  705. }
  706. }
  707. else
  708. {
  709. if (mNameValueReference.string)
  710. delete [] mNameValueReference.string;
  711. mNameValueReference.string = new char [1];
  712. mNameValueReference.string[0] = 0;
  713. }
  714. break;
  715. default:
  716. break;
  717. }
  718. }
  719. void LLNameValue::setF32(const F32 a)
  720. {
  721. if (mClass == NVC_READ_ONLY)
  722. return;
  723. switch(mType)
  724. {
  725. case NVT_F32:
  726. *mNameValueReference.f32 = a;
  727. break;
  728. default:
  729. break;
  730. }
  731. return;
  732. }
  733. void LLNameValue::setS32(const S32 a)
  734. {
  735. if (mClass == NVC_READ_ONLY)
  736. return;
  737. switch(mType)
  738. {
  739. case NVT_S32:
  740. *mNameValueReference.s32 = a;
  741. break;
  742. case NVT_U32:
  743. *mNameValueReference.u32 = a;
  744. break;
  745. case NVT_F32:
  746. *mNameValueReference.f32 = (F32)a;
  747. break;
  748. default:
  749. break;
  750. }
  751. return;
  752. }
  753. void LLNameValue::setU32(const U32 a)
  754. {
  755. if (mClass == NVC_READ_ONLY)
  756. return;
  757. switch(mType)
  758. {
  759. case NVT_S32:
  760. *mNameValueReference.s32 = a;
  761. break;
  762. case NVT_U32:
  763. *mNameValueReference.u32 = a;
  764. break;
  765. case NVT_F32:
  766. *mNameValueReference.f32 = (F32)a;
  767. break;
  768. default:
  769. llerrs << "NameValue: Trying to set U32 into a " << mStringType << ", unknown conversion" << llendl;
  770. break;
  771. }
  772. return;
  773. }
  774. void LLNameValue::setVec3(const LLVector3 &a)
  775. {
  776. if (mClass == NVC_READ_ONLY)
  777. return;
  778. switch(mType)
  779. {
  780. case NVT_VEC3:
  781. *mNameValueReference.vec3 = a;
  782. break;
  783. default:
  784. llerrs << "NameValue: Trying to set LLVector3 into a " << mStringType << ", unknown conversion" << llendl;
  785. break;
  786. }
  787. return;
  788. }
  789. std::string LLNameValue::printNameValue() const
  790. {
  791. std::string buffer;
  792. buffer = llformat("%s %s %s %s ", mName, mStringType, mStringClass, mStringSendto);
  793. buffer += printData();
  794. // llinfos << "Name Value Length: " << buffer.size() + 1 << llendl;
  795. return buffer;
  796. }
  797. std::string LLNameValue::printData() const
  798. {
  799. std::string buffer;
  800. switch(mType)
  801. {
  802. case NVT_STRING:
  803. case NVT_ASSET:
  804. buffer = mNameValueReference.string;
  805. break;
  806. case NVT_F32:
  807. buffer = llformat("%f", *mNameValueReference.f32);
  808. break;
  809. case NVT_S32:
  810. buffer = llformat("%d", *mNameValueReference.s32);
  811. break;
  812. case NVT_U32:
  813.    buffer = llformat("%u", *mNameValueReference.u32);
  814. break;
  815. case NVT_U64:
  816. {
  817. char u64_string[U64_BUFFER_LEN]; /* Flawfinder: ignore */
  818. U64_to_str(*mNameValueReference.u64, u64_string, sizeof(u64_string));
  819. buffer = u64_string;
  820. }
  821. break;
  822. case NVT_VEC3:
  823.    buffer = llformat( "%f, %f, %f", mNameValueReference.vec3->mV[VX], mNameValueReference.vec3->mV[VY], mNameValueReference.vec3->mV[VZ]);
  824. break;
  825. default:
  826. llerrs << "Trying to print unknown NameValue type " << mStringType << llendl;
  827. break;
  828. }
  829. return buffer;
  830. }
  831. std::ostream& operator<<(std::ostream& s, const LLNameValue &a)
  832. {
  833. switch(a.mType)
  834. {
  835. case NVT_STRING:
  836. case NVT_ASSET:
  837. s << a.mNameValueReference.string;
  838. break;
  839. case NVT_F32:
  840. s << (*a.mNameValueReference.f32);
  841. break;
  842. case NVT_S32:
  843. s << *(a.mNameValueReference.s32);
  844. break;
  845. case NVT_U32:
  846. s << *(a.mNameValueReference.u32);
  847. break;
  848. case NVT_U64:
  849. {
  850. char u64_string[U64_BUFFER_LEN]; /* Flawfinder: ignore */
  851. U64_to_str(*a.mNameValueReference.u64, u64_string, sizeof(u64_string));
  852. s << u64_string;
  853. }
  854. break;
  855. case NVT_VEC3:
  856. s << *(a.mNameValueReference.vec3);
  857. break;
  858. default:
  859. llerrs << "Trying to print unknown NameValue type " << a.mStringType << llendl;
  860. break;
  861. }
  862. return s;
  863. }