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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmessageconfig.cpp
  3.  * @brief Live file handling for messaging
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-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 "llmessageconfig.h"
  34. #include "llfile.h"
  35. #include "lllivefile.h"
  36. #include "llsd.h"
  37. #include "llsdutil.h"
  38. #include "llsdserialize.h"
  39. #include "message.h"
  40. static const char messageConfigFileName[] = "message.xml";
  41. static const F32 messageConfigRefreshRate = 5.0; // seconds
  42. static std::string sServerName = "";
  43. static std::string sConfigDir = "";
  44. static std::string sServerDefault;
  45. static LLSD sMessages;
  46. class LLMessageConfigFile : public LLLiveFile
  47. {
  48. public:
  49. LLMessageConfigFile() :
  50. LLLiveFile(filename(), messageConfigRefreshRate),
  51. mMaxQueuedEvents(0)
  52.             { }
  53. static std::string filename();
  54. LLSD mMessages;
  55. std::string mServerDefault;
  56. static LLMessageConfigFile& instance();
  57. // return the singleton configuration file
  58. /* virtual */ bool loadFile();
  59. void loadServerDefaults(const LLSD& data);
  60. void loadMaxQueuedEvents(const LLSD& data);
  61. void loadMessages(const LLSD& data);
  62. void loadCapBans(const LLSD& blacklist);
  63. void loadMessageBans(const LLSD& blacklist);
  64. bool isCapBanned(const std::string& cap_name) const;
  65. public:
  66. LLSD mCapBans;
  67. S32 mMaxQueuedEvents;
  68. private:
  69. static const S32 DEFAULT_MAX_QUEUED_EVENTS = 100;
  70. };
  71. std::string LLMessageConfigFile::filename()
  72. {
  73.     std::ostringstream ostr;
  74. ostr << sConfigDir//gAppSimp->getOption("configdir").asString()
  75. << "/" << messageConfigFileName;
  76. return ostr.str();
  77. }
  78. LLMessageConfigFile& LLMessageConfigFile::instance()
  79. {
  80. static LLMessageConfigFile the_file;
  81. the_file.checkAndReload();
  82. return the_file;
  83. }
  84. // virtual
  85. bool LLMessageConfigFile::loadFile()
  86. {
  87. LLSD data;
  88.     {
  89.         llifstream file(filename());
  90.         
  91.         if (file.is_open())
  92.         {
  93. LL_DEBUGS("AppInit") << "Loading message.xml file at " << filename() << LL_ENDL;
  94.             LLSDSerialize::fromXML(data, file);
  95.         }
  96.         if (data.isUndefined())
  97.         {
  98.             LL_INFOS("AppInit") << "LLMessageConfigFile::loadFile: file missing,"
  99. " ill-formed, or simply undefined; not changing the"
  100. " file" << LL_ENDL;
  101.             return false;
  102.         }
  103.     }
  104. loadServerDefaults(data);
  105. loadMaxQueuedEvents(data);
  106. loadMessages(data);
  107. loadCapBans(data);
  108. loadMessageBans(data);
  109. return true;
  110. }
  111. void LLMessageConfigFile::loadServerDefaults(const LLSD& data)
  112. {
  113. mServerDefault = data["serverDefaults"][sServerName].asString();
  114. }
  115. void LLMessageConfigFile::loadMaxQueuedEvents(const LLSD& data)
  116. {
  117.  if (data.has("maxQueuedEvents"))
  118.  {
  119.   mMaxQueuedEvents = data["maxQueuedEvents"].asInteger();
  120.  }
  121.  else
  122.  {
  123.   mMaxQueuedEvents = DEFAULT_MAX_QUEUED_EVENTS;
  124.  }
  125. }
  126. void LLMessageConfigFile::loadMessages(const LLSD& data)
  127. {
  128. mMessages = data["messages"];
  129. #ifdef DEBUG
  130. std::ostringstream out;
  131. LLSDXMLFormatter *formatter = new LLSDXMLFormatter;
  132. formatter->format(mMessages, out);
  133. llinfos << "loading ... " << out.str()
  134. << " LLMessageConfigFile::loadMessages loaded "
  135. << mMessages.size() << " messages" << llendl;
  136. #endif
  137. }
  138. void LLMessageConfigFile::loadCapBans(const LLSD& data)
  139. {
  140.     LLSD bans = data["capBans"];
  141.     if (!bans.isMap())
  142.     {
  143.         LL_INFOS("AppInit") << "LLMessageConfigFile::loadCapBans: missing capBans section"
  144.             << LL_ENDL;
  145.         return;
  146.     }
  147.     
  148. mCapBans = bans;
  149.     
  150.     LL_DEBUGS("AppInit") << "LLMessageConfigFile::loadCapBans: "
  151.         << bans.size() << " ban tests" << LL_ENDL;
  152. }
  153. void LLMessageConfigFile::loadMessageBans(const LLSD& data)
  154. {
  155.     LLSD bans = data["messageBans"];
  156.     if (!bans.isMap())
  157.     {
  158.         LL_INFOS("AppInit") << "LLMessageConfigFile::loadMessageBans: missing messageBans section"
  159.             << LL_ENDL;
  160.         return;
  161.     }
  162.     
  163. gMessageSystem->setMessageBans(bans["trusted"], bans["untrusted"]);
  164. }
  165. bool LLMessageConfigFile::isCapBanned(const std::string& cap_name) const
  166. {
  167. lldebugs << "mCapBans is " << LLSDNotationStreamer(mCapBans) << llendl;
  168.     return mCapBans[cap_name];
  169. }
  170. //---------------------------------------------------------------
  171. // LLMessageConfig
  172. //---------------------------------------------------------------
  173. //static
  174. void LLMessageConfig::initClass(const std::string& server_name,
  175. const std::string& config_dir)
  176. {
  177. sServerName = server_name;
  178. sConfigDir = config_dir;
  179. (void) LLMessageConfigFile::instance();
  180. LL_DEBUGS("AppInit") << "LLMessageConfig::initClass config file "
  181. << config_dir << "/" << messageConfigFileName << LL_ENDL;
  182. }
  183. //static
  184. void LLMessageConfig::useConfig(const LLSD& config)
  185. {
  186. LLMessageConfigFile &the_file = LLMessageConfigFile::instance();
  187. the_file.loadServerDefaults(config);
  188. the_file.loadMaxQueuedEvents(config);
  189. the_file.loadMessages(config);
  190. the_file.loadCapBans(config);
  191. the_file.loadMessageBans(config);
  192. }
  193. //static
  194. LLMessageConfig::Flavor LLMessageConfig::getServerDefaultFlavor()
  195. {
  196. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  197. if (file.mServerDefault == "llsd")
  198. {
  199. return LLSD_FLAVOR;
  200. }
  201. if (file.mServerDefault == "template")
  202. {
  203. return TEMPLATE_FLAVOR;
  204. }
  205. return NO_FLAVOR;
  206. }
  207. //static
  208. S32 LLMessageConfig::getMaxQueuedEvents()
  209. {
  210. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  211. return file.mMaxQueuedEvents;
  212. }
  213. //static
  214. LLMessageConfig::Flavor LLMessageConfig::getMessageFlavor(const std::string& msg_name)
  215. {
  216. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  217. LLSD config = file.mMessages[msg_name];
  218. if (config["flavor"].asString() == "llsd")
  219. {
  220. return LLSD_FLAVOR;
  221. }
  222. if (config["flavor"].asString() == "template")
  223. {
  224. return TEMPLATE_FLAVOR;
  225. }
  226. return NO_FLAVOR;
  227. }
  228. //static
  229. LLMessageConfig::SenderTrust LLMessageConfig::getSenderTrustedness(
  230. const std::string& msg_name)
  231. {
  232. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  233. LLSD config = file.mMessages[msg_name];
  234. if (config.has("trusted-sender"))
  235. {
  236. return config["trusted-sender"].asBoolean() ? TRUSTED : UNTRUSTED;
  237. }
  238. return NOT_SET;
  239. }
  240. //static
  241. bool LLMessageConfig::isValidMessage(const std::string& msg_name)
  242. {
  243. if (sServerName.empty())
  244. {
  245. llerrs << "LLMessageConfig::initClass() not called" << llendl;
  246. }
  247. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  248. return file.mMessages.has(msg_name);
  249. }
  250. //static
  251. bool LLMessageConfig::onlySendLatest(const std::string& msg_name)
  252. {
  253. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  254. LLSD config = file.mMessages[msg_name];
  255. return config["only-send-latest"].asBoolean();
  256. }
  257. bool LLMessageConfig::isCapBanned(const std::string& cap_name)
  258. {
  259. return LLMessageConfigFile::instance().isCapBanned(cap_name);
  260. }
  261. // return the web-service path to use for a given
  262. // message. This entry *should* match the entry
  263. // in simulator.xml!
  264. LLSD LLMessageConfig::getConfigForMessage(const std::string& msg_name)
  265. {
  266. if (sServerName.empty())
  267. {
  268. llerrs << "LLMessageConfig::isMessageTrusted(name) before"
  269. << " LLMessageConfig::initClass()" << llendl;
  270. }
  271. LLMessageConfigFile& file = LLMessageConfigFile::instance();
  272. // LLSD for the CamelCase message name
  273. LLSD config = file.mMessages[msg_name];
  274. return config;
  275. }