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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatersearch.cpp
  3.  * @author Martin Reddy
  4.  * @brief Search floater - uses an embedded web browser control
  5.  *
  6.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2009-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. #include "llviewerprecompiledheaders.h"
  34. #include "llcommandhandler.h"
  35. #include "llfloaterreg.h"
  36. #include "llfloatersearch.h"
  37. #include "llmediactrl.h"
  38. #include "lllogininstance.h"
  39. #include "lluri.h"
  40. #include "llagent.h"
  41. #include "llui.h"
  42. #include "llviewercontrol.h"
  43. #include "llweb.h"
  44. // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
  45. class LLSearchHandler : public LLCommandHandler
  46. {
  47. public:
  48. // requires trusted browser to trigger
  49. LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { }
  50. bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
  51. {
  52. const size_t parts = tokens.size();
  53. // get the (optional) category for the search
  54. std::string category;
  55. if (parts > 0)
  56. {
  57. category = tokens[0].asString();
  58. }
  59. // get the (optional) search string
  60. std::string search_text;
  61. if (parts > 1)
  62. {
  63. search_text = tokens[1].asString();
  64. }
  65. // create the LLSD arguments for the search floater
  66. LLSD args;
  67. args["category"] = category;
  68. args["id"] = LLURI::unescape(search_text);
  69. // open the search floater and perform the requested search
  70. LLFloaterReg::showInstance("search", args);
  71. return true;
  72. }
  73. };
  74. LLSearchHandler gSearchHandler;
  75. LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
  76. LLFloater(key),
  77. LLViewerMediaObserver(),
  78. mBrowser(NULL),
  79. mSearchGodLevel(0)
  80. {
  81. // declare a map that transforms a category name into
  82. // the URL suffix that is used to search that category
  83. mCategoryPaths = LLSD::emptyMap();
  84. mCategoryPaths["all"]          = "search";
  85. mCategoryPaths["people"]       = "search/people";
  86. mCategoryPaths["places"]       = "search/places";
  87. mCategoryPaths["events"]       = "search/events";
  88. mCategoryPaths["groups"]       = "search/groups";
  89. mCategoryPaths["wiki"]         = "search/wiki";
  90. mCategoryPaths["destinations"] = "destinations";
  91. mCategoryPaths["classifieds"]  = "classifieds";
  92. }
  93. BOOL LLFloaterSearch::postBuild()
  94. {
  95. mBrowser = getChild<LLMediaCtrl>("browser");
  96. if (mBrowser)
  97. {
  98. mBrowser->addObserver(this);
  99. mBrowser->setTrusted(true);
  100. }
  101. return TRUE;
  102. }
  103. void LLFloaterSearch::onOpen(const LLSD& key)
  104. {
  105. search(key);
  106. }
  107. void LLFloaterSearch::onClose(bool app_quitting)
  108. {
  109. // tear down the web view so we don't show the previous search
  110. // result when the floater is opened next time
  111. destroy();
  112. }
  113. void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event)
  114. {
  115. switch (event) 
  116. {
  117. case MEDIA_EVENT_NAVIGATE_BEGIN:
  118. childSetText("status_text", getString("loading_text"));
  119. break;
  120. case MEDIA_EVENT_NAVIGATE_COMPLETE:
  121. childSetText("status_text", getString("done_text"));
  122. break;
  123. default:
  124. break;
  125. }
  126. }
  127. void LLFloaterSearch::godLevelChanged(U8 godlevel)
  128. {
  129. // search results can change based upon god level - if the user
  130. // changes god level, then give them a warning (we don't refresh
  131. // the search as this might undo any page navigation or
  132. // AJAX-driven changes since the last search).
  133. childSetVisible("refresh_search", (godlevel != mSearchGodLevel));
  134. }
  135. void LLFloaterSearch::search(const LLSD &key)
  136. {
  137. if (! mBrowser)
  138. {
  139. return;
  140. }
  141. // reset the god level warning as we're sending the latest state
  142. childHide("refresh_search");
  143. mSearchGodLevel = gAgent.getGodLevel();
  144. // work out the subdir to use based on the requested category
  145. LLSD subs;
  146. std::string category = key.has("category") ? key["category"].asString() : "";
  147. if (mCategoryPaths.has(category))
  148. {
  149. subs["CATEGORY"] = mCategoryPaths[category].asString();
  150. }
  151. else
  152. {
  153. subs["CATEGORY"] = mCategoryPaths["all"].asString();
  154. }
  155. // add the search query string
  156. std::string search_text = key.has("id") ? key["id"].asString() : "";
  157. subs["QUERY"] = LLURI::escape(search_text);
  158. // add the permissions token that login.cgi gave us
  159. // We use "search_token", and fallback to "auth_token" if not present.
  160. LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
  161. if (search_token.asString().empty())
  162. {
  163. search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
  164. }
  165. subs["AUTH_TOKEN"] = search_token.asString();
  166. // add the user's preferred maturity (can be changed via prefs)
  167. std::string maturity;
  168. if (gAgent.prefersAdult())
  169. {
  170. maturity = "42";  // PG,Mature,Adult
  171. }
  172. else if (gAgent.prefersMature())
  173. {
  174. maturity = "21";  // PG,Mature
  175. }
  176. else
  177. {
  178. maturity = "13";  // PG
  179. }
  180. subs["MATURITY"] = maturity;
  181. // add the user's god status
  182. subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
  183. // get the search URL and expand all of the substitutions
  184. // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
  185. std::string url = gSavedSettings.getString("SearchURL");
  186. url = LLWeb::expandURLSubstitutions(url, subs);
  187. // and load the URL in the web view
  188. mBrowser->navigateTo(url);
  189. }