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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloaterabout.cpp
  3.  * @author James Cook
  4.  * @brief The about box from Help->About
  5.  *
  6.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2001-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.  */
  33.  
  34. #include "llviewerprecompiledheaders.h"
  35. #include "llfloaterabout.h"
  36. // Viewer includes
  37. #include "llagent.h"
  38. #include "llappviewer.h" 
  39. #include "llsecondlifeurls.h"
  40. #include "llvoiceclient.h"
  41. #include "lluictrlfactory.h"
  42. #include "llviewertexteditor.h"
  43. #include "llviewercontrol.h"
  44. #include "llviewerstats.h"
  45. #include "llviewerregion.h"
  46. #include "llversioninfo.h"
  47. #include "llweb.h"
  48. // Linden library includes
  49. #include "llaudioengine.h"
  50. #include "llbutton.h"
  51. #include "llcurl.h"
  52. #include "llglheaders.h"
  53. #include "llfloater.h"
  54. #include "llfloaterreg.h"
  55. #include "llimagej2c.h"
  56. #include "llsys.h"
  57. #include "lltrans.h"
  58. #include "lluri.h"
  59. #include "v3dmath.h"
  60. #include "llwindow.h"
  61. #include "stringize.h"
  62. #include "llsdutil_math.h"
  63. #include "lleventapi.h"
  64. #if LL_WINDOWS
  65. #include "lldxhardware.h"
  66. #endif
  67. extern LLMemoryInfo gSysMemory;
  68. extern U32 gPacketsIn;
  69. static std::string get_viewer_release_notes_url();
  70. ///----------------------------------------------------------------------------
  71. /// Class LLFloaterAbout
  72. ///----------------------------------------------------------------------------
  73. class LLFloaterAbout 
  74. : public LLFloater
  75. {
  76. friend class LLFloaterReg;
  77. private:
  78. LLFloaterAbout(const LLSD& key);
  79. virtual ~LLFloaterAbout();
  80. public:
  81. /*virtual*/ BOOL postBuild();
  82. /// Obtain the data used to fill out the contents string. This is
  83. /// separated so that we can programmatically access the same info.
  84. static LLSD getInfo();
  85. void onClickCopyToClipboard();
  86. };
  87. // Default constructor
  88. LLFloaterAbout::LLFloaterAbout(const LLSD& key) 
  89. : LLFloater(key)
  90. {
  91. //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about.xml");
  92. }
  93. // Destroys the object
  94. LLFloaterAbout::~LLFloaterAbout()
  95. {
  96. }
  97. BOOL LLFloaterAbout::postBuild()
  98. {
  99. center();
  100. LLViewerTextEditor *support_widget = 
  101. getChild<LLViewerTextEditor>("support_editor", true);
  102. LLViewerTextEditor *credits_widget = 
  103. getChild<LLViewerTextEditor>("credits_editor", true);
  104. getChild<LLUICtrl>("copy_btn")->setCommitCallback(
  105. boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
  106. #if LL_WINDOWS
  107. getWindow()->incBusyCount();
  108. getWindow()->setCursor(UI_CURSOR_ARROW);
  109. #endif
  110. LLSD info(getInfo());
  111. #if LL_WINDOWS
  112. getWindow()->decBusyCount();
  113. getWindow()->setCursor(UI_CURSOR_ARROW);
  114. #endif
  115. std::ostringstream support;
  116. // Render the LLSD from getInfo() as a format_map_t
  117. LLStringUtil::format_map_t args;
  118. // For reasons I don't yet understand, [ReleaseNotes] is not part of the
  119. // default substitution strings whereas [APP_NAME] is. But it works to
  120. // simply copy it into these specific args.
  121. args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
  122. for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
  123.  ii != iend; ++ii)
  124. {
  125. if (! ii->second.isArray())
  126. {
  127. // Scalar value
  128. if (ii->second.isUndefined())
  129. {
  130. args[ii->first] = getString("none");
  131. }
  132. else
  133. {
  134. // don't forget to render value asString()
  135. args[ii->first] = ii->second.asString();
  136. }
  137. }
  138. else
  139. {
  140. // array value: build KEY_0, KEY_1 etc. entries
  141. for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
  142. {
  143. args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
  144. }
  145. }
  146. }
  147. // Now build the various pieces
  148. support << getString("AboutHeader", args);
  149. if (info.has("REGION"))
  150. {
  151. support << "nn" << getString("AboutPosition", args);
  152. }
  153. support << "nn" << getString("AboutSystem", args);
  154. support << "n";
  155. if (info.has("GRAPHICS_DRIVER_VERSION"))
  156. {
  157. support << "n" << getString("AboutDriver", args);
  158. }
  159. support << "n" << getString("AboutLibs", args);
  160. if (info.has("COMPILER"))
  161. {
  162. support << "n" << getString("AboutCompiler", args);
  163. }
  164. if (info.has("PACKETS_IN"))
  165. {
  166. support << 'n' << getString("AboutTraffic", args);
  167. }
  168. support_widget->appendText(support.str(), 
  169. FALSE, 
  170. LLStyle::Params()
  171. .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
  172. support_widget->blockUndo();
  173. // Fix views
  174. support_widget->setEnabled(FALSE);
  175. support_widget->startOfDoc();
  176. credits_widget->setEnabled(FALSE);
  177. credits_widget->startOfDoc();
  178. return TRUE;
  179. }
  180. // static
  181. LLSD LLFloaterAbout::getInfo()
  182. {
  183. // The point of having one method build an LLSD info block and the other
  184. // construct the user-visible About string is to ensure that the same info
  185. // is available to a getInfo() caller as to the user opening
  186. // LLFloaterAbout.
  187. LLSD info;
  188. LLSD version;
  189. version.append(LLVersionInfo::getMajor());
  190. version.append(LLVersionInfo::getMinor());
  191. version.append(LLVersionInfo::getPatch());
  192. version.append(LLVersionInfo::getBuild());
  193. info["VIEWER_VERSION"] = version;
  194. info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion();
  195. info["BUILD_DATE"] = __DATE__;
  196. info["BUILD_TIME"] = __TIME__;
  197. info["CHANNEL"] = gSavedSettings.getString("VersionChannelName");
  198. info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url();
  199. #if LL_MSVC
  200. info["COMPILER"] = "MSVC";
  201. info["COMPILER_VERSION"] = _MSC_VER;
  202. #elif LL_GNUC
  203. info["COMPILER"] = "GCC";
  204. info["COMPILER_VERSION"] = GCC_VERSION;
  205. #endif
  206. // Position
  207. LLViewerRegion* region = gAgent.getRegion();
  208. if (region)
  209. {
  210. const LLVector3d &pos = gAgent.getPositionGlobal();
  211. info["POSITION"] = ll_sd_from_vector3d(pos);
  212. info["REGION"] = gAgent.getRegion()->getName();
  213. info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
  214. info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
  215. info["SERVER_VERSION"] = gLastVersionChannel;
  216. info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
  217. }
  218. // CPU
  219. info["CPU"] = gSysCPU.getCPUString();
  220. info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024);
  221. // Moved hack adjustment to Windows memory size into llsys.cpp
  222. info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
  223. info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
  224. info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
  225. #if LL_WINDOWS
  226.     LLSD driver_info = gDXHardware.getDisplayInfo();
  227.     if (driver_info.has("DriverVersion"))
  228.     {
  229.         info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
  230.     }
  231. #endif
  232. info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
  233. info["LIBCURL_VERSION"] = LLCurl::getVersionString();
  234. info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
  235. bool want_fullname = true;
  236. info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
  237. info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
  238. // TODO: Implement media plugin version query
  239. info["QT_WEBKIT_VERSION"] = "4.6 (version number hard-coded)";
  240. if (gPacketsIn > 0)
  241. {
  242. info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent();
  243. info["PACKETS_IN"] = F32(gPacketsIn);
  244. info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
  245. }
  246.     return info;
  247. }
  248. static std::string get_viewer_release_notes_url()
  249. {
  250. LLSD query;
  251. query["channel"] = gSavedSettings.getString("VersionChannelName");
  252. query["version"] = LLVersionInfo::getVersion();
  253. std::ostringstream url;
  254. url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query);
  255. return LLWeb::escapeURL(url.str());
  256. }
  257. class LLFloaterAboutListener: public LLEventAPI
  258. {
  259. public:
  260. LLFloaterAboutListener():
  261. LLEventAPI("LLFloaterAbout",
  262.                    "LLFloaterAbout listener to retrieve About box info")
  263. {
  264. add("getInfo",
  265.             "Request an LLSD::Map containing information used to populate About box",
  266.             &LLFloaterAboutListener::getInfo,
  267.             LLSD().with("reply", LLSD()));
  268. }
  269. private:
  270. void getInfo(const LLSD& request) const
  271. {
  272. LLReqID reqid(request);
  273. LLSD reply(LLFloaterAbout::getInfo());
  274. reqid.stamp(reply);
  275. LLEventPumps::instance().obtain(request["reply"]).post(reply);
  276. }
  277. };
  278. static LLFloaterAboutListener floaterAboutListener;
  279. void LLFloaterAbout::onClickCopyToClipboard()
  280. {
  281. LLViewerTextEditor *support_widget = 
  282. getChild<LLViewerTextEditor>("support_editor", true);
  283. support_widget->selectAll();
  284. support_widget->copy();
  285. support_widget->deselect();
  286. }
  287. ///----------------------------------------------------------------------------
  288. /// LLFloaterAboutUtil
  289. ///----------------------------------------------------------------------------
  290. void LLFloaterAboutUtil::registerFloater()
  291. {
  292. LLFloaterReg::add("sl_about", "floater_about.xml",
  293. &LLFloaterReg::build<LLFloaterAbout>);
  294. }