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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llurlsimstring.cpp (was llsimurlstring.cpp)
  3.  * @brief Handles "SLURL fragments" like Ahern/123/45 for
  4.  * startup processing, login screen, prefs, etc.
  5.  *
  6.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2006-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 "llurlsimstring.h"
  35. #include "llpanellogin.h"
  36. #include "llviewercontrol.h"
  37. #include "curl/curl.h"
  38. #include <sstream>
  39. //static
  40. LLURLSimString LLURLSimString::sInstance;
  41. // "secondlife://simname/x/y/z" -> "simname/x/y/z"
  42. // (actually .*//foo -> foo)
  43. // static
  44. void LLURLSimString::setString(const std::string& sim_string)
  45. {
  46. sInstance.mSimString.clear();
  47. sInstance.mSimName.clear();
  48. sInstance.mParseState = NOT_PARSED;
  49. if (sim_string == "home" || sim_string == "last")
  50. {
  51. gSavedSettings.setString("LoginLocation", sim_string);
  52. }
  53. else if (sim_string == "")
  54. {
  55. sInstance.mSimString = "";
  56. }
  57. else
  58. {
  59. char* curlstr = curl_unescape(sim_string.c_str(), sim_string.size());
  60. std::string tstring = std::string(curlstr);
  61. curl_free(curlstr);
  62. std::string::size_type idx = tstring.find("//");
  63. idx = (idx == std::string::npos) ? 0 : idx+2;
  64. sInstance.mSimString = tstring.substr(idx);
  65. }
  66. }
  67. void LLURLSimString::setStringRaw(const std::string& raw_url_path)
  68. {
  69. std::string region("");
  70. int x = 128;
  71. int y = 128;
  72. int z = 0;
  73. LLURLSimString::parse(raw_url_path, &region, &x, &y, &z);
  74. std::ostringstream codec;
  75. codec << region;
  76. codec << "/";
  77. codec << x;
  78. codec << "/";
  79. codec << y;
  80. codec << "/";
  81. codec << z;
  82. LLURLSimString::setString( codec.str() );
  83. }
  84. // "/100" -> 100
  85. // static
  86. std::string::size_type LLURLSimString::parseGridIdx(const std::string& in_string,
  87.  std::string::size_type idx0,
  88.  std::string::size_type* res)
  89. {
  90. if (idx0 == std::string::npos || in_string[idx0] != '/')
  91. {
  92. return std::string::npos; // parse error
  93. }
  94. idx0++;
  95. std::string::size_type idx1 = in_string.find_first_of('/', idx0);
  96. std::string::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
  97. std::string tstring = in_string.substr(idx0,len);
  98. if (!tstring.empty())
  99. {
  100. std::string::size_type val = atoi(tstring.c_str());
  101. *res = val;
  102. }
  103. return idx1;
  104. }
  105. // "simname/x/y/z" -> mSimName = simname, mX = x, mY = y, mZ = z
  106. // static
  107. bool LLURLSimString::parse()
  108. {
  109. if (sInstance.mParseState == NOT_SET)
  110. {
  111. return false;
  112. }
  113. if (sInstance.mParseState == NOT_PARSED)
  114. {
  115. if (parse(sInstance.mSimString,
  116.   &sInstance.mSimName,
  117.   &sInstance.mX, 
  118.   &sInstance.mY, 
  119.   &sInstance.mZ))
  120. {
  121. sInstance.mParseState = PARSE_OK;
  122. }
  123. else
  124. {
  125. sInstance.mParseState = PARSE_FAIL;
  126. }
  127. }
  128. return (sInstance.mParseState == PARSE_OK);
  129. }
  130. // static
  131. bool LLURLSimString::parse(const std::string& sim_string,
  132.    std::string *region_name,
  133.    S32 *x, S32 *y, S32 *z)
  134. {
  135. // strip any bogus initial '/'
  136. std::string::size_type idx0 = sim_string.find_first_not_of('/');
  137. if (idx0 == std::string::npos) idx0 = 0;
  138. std::string::size_type idx1 = sim_string.find_first_of('/', idx0);
  139. std::string::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
  140. std::string tstring = sim_string.substr(idx0,len);
  141. *region_name = unescapeRegionName(tstring);
  142. if (!region_name->empty())
  143. {
  144. // return position data if found. otherwise leave passed-in values alone. (DEV-18380) -MG
  145. if (idx1 != std::string::npos)
  146. {
  147. std::string::size_type xs = *x, ys = *y, zs = *z;
  148. idx1 = parseGridIdx(sim_string, idx1, &xs);
  149. idx1 = parseGridIdx(sim_string, idx1, &ys);
  150. idx1 = parseGridIdx(sim_string, idx1, &zs);
  151. *x = xs;
  152. *y = ys;
  153. *z = zs;
  154. }
  155. return true;
  156. }
  157. else
  158. {
  159. return false;
  160. }
  161. }
  162. // static
  163. std::string LLURLSimString::getURL()
  164. {
  165. std::string url;
  166. if (sInstance.mParseState == PARSE_OK)
  167. {
  168. url = llformat("secondlife://%s/%d/%d/%d/",
  169. sInstance.mSimName.c_str(),
  170. sInstance.mX,
  171. sInstance.mY,
  172. sInstance.mZ);
  173. }
  174. return url;
  175. }
  176. // static
  177. std::string LLURLSimString::unescapeRegionName(std::string region_name)
  178. {
  179. std::string result;
  180. char* curlstr = curl_unescape(region_name.c_str(), region_name.size());
  181. result = std::string(curlstr);
  182. curl_free(curlstr);
  183. return result;
  184. }