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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpluginmessage.cpp
  3.  * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
  4.  *
  5.  * @cond
  6.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2008-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  * @endcond
  33.  */
  34. #include "linden_common.h"
  35. #include "llpluginmessage.h"
  36. #include "llsdserialize.h"
  37. #include "u64.h"
  38. /**
  39.  * Constructor.
  40.  */
  41. LLPluginMessage::LLPluginMessage()
  42. {
  43. }
  44. /**
  45.  * Constructor.
  46.  *
  47.  * @param[in] p Existing message
  48.  */
  49. LLPluginMessage::LLPluginMessage(const LLPluginMessage &p)
  50. {
  51. mMessage = p.mMessage;
  52. }
  53. /**
  54.  * Constructor.
  55.  *
  56.  * @param[in] message_class Message class
  57.  * @param[in] message_name Message name
  58.  */
  59. LLPluginMessage::LLPluginMessage(const std::string &message_class, const std::string &message_name)
  60. {
  61. setMessage(message_class, message_name);
  62. }
  63. /**
  64.  * Destructor.
  65.  */
  66. LLPluginMessage::~LLPluginMessage()
  67. {
  68. }
  69. /**
  70.  * Reset all internal state.
  71.  */
  72. void LLPluginMessage::clear()
  73. {
  74. mMessage = LLSD::emptyMap();
  75. mMessage["params"] = LLSD::emptyMap();
  76. }
  77. /**
  78.  * Sets the message class and name. Also has the side-effect of clearing any key-value pairs in the message.
  79.  *
  80.  * @param[in] message_class Message class
  81.  * @param[in] message_name Message name
  82.  */
  83. void LLPluginMessage::setMessage(const std::string &message_class, const std::string &message_name)
  84. {
  85. clear();
  86. mMessage["class"] = message_class;
  87. mMessage["name"] = message_name;
  88. }
  89. /**
  90.  * Sets a key/value pair in the message, where the value is a string.
  91.  *
  92.  * @param[in] key Key
  93.  * @param[in] value String value
  94.  */
  95. void LLPluginMessage::setValue(const std::string &key, const std::string &value)
  96. {
  97. mMessage["params"][key] = value;
  98. }
  99. /**
  100.  * Sets a key/value pair in the message, where the value is LLSD.
  101.  *
  102.  * @param[in] key Key
  103.  * @param[in] value LLSD value
  104.  */
  105. void LLPluginMessage::setValueLLSD(const std::string &key, const LLSD &value)
  106. {
  107. mMessage["params"][key] = value;
  108. }
  109. /**
  110.  * Sets a key/value pair in the message, where the value is signed 32-bit.
  111.  *
  112.  * @param[in] key Key
  113.  * @param[in] value 32-bit signed value
  114.  */
  115. void LLPluginMessage::setValueS32(const std::string &key, S32 value)
  116. {
  117. mMessage["params"][key] = value;
  118. }
  119. /**
  120.  * Sets a key/value pair in the message, where the value is unsigned 32-bit. The value is stored as a string beginning with "0x".
  121.  *
  122.  * @param[in] key Key
  123.  * @param[in] value 32-bit unsigned value
  124.  */
  125. void LLPluginMessage::setValueU32(const std::string &key, U32 value)
  126. {
  127. std::stringstream temp;
  128. temp << "0x" << std::hex << value;
  129. setValue(key, temp.str());
  130. }
  131. /**
  132.  * Sets a key/value pair in the message, where the value is a bool.
  133.  *
  134.  * @param[in] key Key
  135.  * @param[in] value Boolean value
  136.  */
  137. void LLPluginMessage::setValueBoolean(const std::string &key, bool value)
  138. {
  139. mMessage["params"][key] = value;
  140. }
  141. /**
  142.  * Sets a key/value pair in the message, where the value is a double.
  143.  *
  144.  * @param[in] key Key
  145.  * @param[in] value Boolean value
  146.  */
  147. void LLPluginMessage::setValueReal(const std::string &key, F64 value)
  148. {
  149. mMessage["params"][key] = value;
  150. }
  151. /**
  152.  * Sets a key/value pair in the message, where the value is a pointer. The pointer is stored as a string.
  153.  *
  154.  * @param[in] key Key
  155.  * @param[in] value Pointer value
  156.  */
  157. void LLPluginMessage::setValuePointer(const std::string &key, void* value)
  158. {
  159. std::stringstream temp;
  160. // iostreams should output pointer values in hex with an initial 0x by default.
  161. temp << value;
  162. setValue(key, temp.str());
  163. }
  164. /**
  165.  * Gets the message class.
  166.  *
  167.  * @return Message class
  168.  */
  169. std::string LLPluginMessage::getClass(void) const
  170. {
  171. return mMessage["class"];
  172. }
  173. /**
  174.  * Gets the message name.
  175.  *
  176.  * @return Message name
  177.  */
  178. std::string LLPluginMessage::getName(void) const
  179. {
  180. return mMessage["name"];
  181. }
  182. /**
  183.  * Returns true if the specified key exists in this message (useful for optional parameters).
  184.  *
  185.  * @param[in] key Key
  186.  *
  187.  * @return True if key exists, false otherwise.
  188.  */
  189. bool LLPluginMessage::hasValue(const std::string &key) const
  190. {
  191. bool result = false;
  192. if(mMessage["params"].has(key))
  193. {
  194. result = true;
  195. }
  196. return result;
  197. }
  198. /**
  199.  * Gets the value of a key as a string. If the key does not exist, an empty string will be returned.
  200.  *
  201.  * @param[in] key Key
  202.  *
  203.  * @return String value of key if key exists, empty string if key does not exist.
  204.  */
  205. std::string LLPluginMessage::getValue(const std::string &key) const
  206. {
  207. std::string result;
  208. if(mMessage["params"].has(key))
  209. {
  210. result = mMessage["params"][key].asString();
  211. }
  212. return result;
  213. }
  214. /**
  215.  * Gets the value of a key as LLSD. If the key does not exist, a null LLSD will be returned.
  216.  *
  217.  * @param[in] key Key
  218.  *
  219.  * @return LLSD value of key if key exists, null LLSD if key does not exist.
  220.  */
  221. LLSD LLPluginMessage::getValueLLSD(const std::string &key) const
  222. {
  223. LLSD result;
  224. if(mMessage["params"].has(key))
  225. {
  226. result = mMessage["params"][key];
  227. }
  228. return result;
  229. }
  230. /**
  231.  * Gets the value of a key as signed 32-bit int. If the key does not exist, 0 will be returned.
  232.  *
  233.  * @param[in] key Key
  234.  *
  235.  * @return Signed 32-bit int value of key if key exists, 0 if key does not exist.
  236.  */
  237. S32 LLPluginMessage::getValueS32(const std::string &key) const
  238. {
  239. S32 result = 0;
  240. if(mMessage["params"].has(key))
  241. {
  242. result = mMessage["params"][key].asInteger();
  243. }
  244. return result;
  245. }
  246. /**
  247.  * Gets the value of a key as unsigned 32-bit int. If the key does not exist, 0 will be returned.
  248.  *
  249.  * @param[in] key Key
  250.  *
  251.  * @return Unsigned 32-bit int value of key if key exists, 0 if key does not exist.
  252.  */
  253. U32 LLPluginMessage::getValueU32(const std::string &key) const
  254. {
  255. U32 result = 0;
  256. if(mMessage["params"].has(key))
  257. {
  258. std::string value = mMessage["params"][key].asString();
  259. result = (U32)strtoul(value.c_str(), NULL, 16);
  260. }
  261. return result;
  262. }
  263. /**
  264.  * Gets the value of a key as a bool. If the key does not exist, false will be returned.
  265.  *
  266.  * @param[in] key Key
  267.  *
  268.  * @return Boolean value of key if it exists, false otherwise.
  269.  */
  270. bool LLPluginMessage::getValueBoolean(const std::string &key) const
  271. {
  272. bool result = false;
  273. if(mMessage["params"].has(key))
  274. {
  275. result = mMessage["params"][key].asBoolean();
  276. }
  277. return result;
  278. }
  279. /**
  280.  * Gets the value of a key as a double. If the key does not exist, 0 will be returned.
  281.  *
  282.  * @param[in] key Key
  283.  *
  284.  * @return Value as a double if key exists, 0 otherwise.
  285.  */
  286. F64 LLPluginMessage::getValueReal(const std::string &key) const
  287. {
  288. F64 result = 0.0f;
  289. if(mMessage["params"].has(key))
  290. {
  291. result = mMessage["params"][key].asReal();
  292. }
  293. return result;
  294. }
  295. /**
  296.  * Gets the value of a key as a pointer. If the key does not exist, NULL will be returned.
  297.  *
  298.  * @param[in] key Key
  299.  *
  300.  * @return Pointer value if key exists, NULL otherwise.
  301.  */
  302. void* LLPluginMessage::getValuePointer(const std::string &key) const
  303. {
  304. void* result = NULL;
  305. if(mMessage["params"].has(key))
  306. {
  307. std::string value = mMessage["params"][key].asString();
  308. result = (void*)llstrtou64(value.c_str(), NULL, 16);
  309. }
  310. return result;
  311. }
  312. /**
  313.  * Flatten the message into a string.
  314.  *
  315.  * @return Message as a string.
  316.  */
  317. std::string LLPluginMessage::generate(void) const
  318. {
  319. std::ostringstream result;
  320. // Pretty XML may be slightly easier to deal with while debugging...
  321. // LLSDSerialize::toXML(mMessage, result);
  322. LLSDSerialize::toPrettyXML(mMessage, result);
  323. return result.str();
  324. }
  325. /**
  326.  * Parse an incoming message into component parts. Clears all existing state before starting the parse.
  327.  *
  328.  * @return Returns -1 on failure, otherwise returns the number of key/value pairs in the incoming message.
  329.  */
  330. int LLPluginMessage::parse(const std::string &message)
  331. {
  332. // clear any previous state
  333. clear();
  334. std::istringstream input(message);
  335. S32 parse_result = LLSDSerialize::fromXML(mMessage, input);
  336. return (int)parse_result;
  337. }
  338. /**
  339.  * Destructor
  340.  */
  341. LLPluginMessageListener::~LLPluginMessageListener()
  342. {
  343. // TODO: should listeners have a way to ensure they're removed from dispatcher lists when deleted?
  344. }
  345. /**
  346.  * Destructor
  347.  */
  348. LLPluginMessageDispatcher::~LLPluginMessageDispatcher()
  349. {
  350. }
  351. /**
  352.  * Add a message listener. TODO:DOC need more info on what uses this. when are multiple listeners needed?
  353.  *
  354.  * @param[in] listener Message listener
  355.  */
  356. void LLPluginMessageDispatcher::addPluginMessageListener(LLPluginMessageListener *listener)
  357. {
  358. mListeners.insert(listener);
  359. }
  360. /**
  361.  * Remove a message listener.
  362.  *
  363.  * @param[in] listener Message listener
  364.  */
  365. void LLPluginMessageDispatcher::removePluginMessageListener(LLPluginMessageListener *listener)
  366. {
  367. mListeners.erase(listener);
  368. }
  369. /**
  370.  * Distribute a message to all message listeners.
  371.  *
  372.  * @param[in] message Message
  373.  */
  374. void LLPluginMessageDispatcher::dispatchPluginMessage(const LLPluginMessage &message)
  375. {
  376. for (listener_set_t::iterator it = mListeners.begin();
  377. it != mListeners.end();
  378. )
  379. {
  380. LLPluginMessageListener* listener = *it;
  381. listener->receivePluginMessage(message);
  382. // In case something deleted an entry.
  383. it = mListeners.upper_bound(listener);
  384. }
  385. }