llurlsimstring.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
- /**
- * @file llurlsimstring.cpp (was llsimurlstring.cpp)
- * @brief Handles "SLURL fragments" like Ahern/123/45 for
- * startup processing, login screen, prefs, etc.
- *
- * $LicenseInfo:firstyear=2006&license=viewergpl$
- *
- * Copyright (c) 2006-2010, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
- #include "llviewerprecompiledheaders.h"
- #include "llurlsimstring.h"
- #include "llpanellogin.h"
- #include "llviewercontrol.h"
- #include "curl/curl.h"
- #include <sstream>
- //static
- LLURLSimString LLURLSimString::sInstance;
- // "secondlife://simname/x/y/z" -> "simname/x/y/z"
- // (actually .*//foo -> foo)
- // static
- void LLURLSimString::setString(const std::string& sim_string)
- {
- sInstance.mSimString.clear();
- sInstance.mSimName.clear();
- sInstance.mParseState = NOT_PARSED;
- if (sim_string == "home" || sim_string == "last")
- {
- gSavedSettings.setString("LoginLocation", sim_string);
- }
- else if (sim_string == "")
- {
- sInstance.mSimString = "";
- }
- else
- {
- char* curlstr = curl_unescape(sim_string.c_str(), sim_string.size());
- std::string tstring = std::string(curlstr);
- curl_free(curlstr);
- std::string::size_type idx = tstring.find("//");
- idx = (idx == std::string::npos) ? 0 : idx+2;
- sInstance.mSimString = tstring.substr(idx);
- }
- }
- void LLURLSimString::setStringRaw(const std::string& raw_url_path)
- {
- std::string region("");
- int x = 128;
- int y = 128;
- int z = 0;
- LLURLSimString::parse(raw_url_path, ®ion, &x, &y, &z);
- std::ostringstream codec;
- codec << region;
- codec << "/";
- codec << x;
- codec << "/";
- codec << y;
- codec << "/";
- codec << z;
- LLURLSimString::setString( codec.str() );
- }
- // "/100" -> 100
- // static
- std::string::size_type LLURLSimString::parseGridIdx(const std::string& in_string,
- std::string::size_type idx0,
- std::string::size_type* res)
- {
- if (idx0 == std::string::npos || in_string[idx0] != '/')
- {
- return std::string::npos; // parse error
- }
- idx0++;
- std::string::size_type idx1 = in_string.find_first_of('/', idx0);
- std::string::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
- std::string tstring = in_string.substr(idx0,len);
- if (!tstring.empty())
- {
- std::string::size_type val = atoi(tstring.c_str());
- *res = val;
- }
- return idx1;
- }
- // "simname/x/y/z" -> mSimName = simname, mX = x, mY = y, mZ = z
- // static
- bool LLURLSimString::parse()
- {
- if (sInstance.mParseState == NOT_SET)
- {
- return false;
- }
- if (sInstance.mParseState == NOT_PARSED)
- {
- if (parse(sInstance.mSimString,
- &sInstance.mSimName,
- &sInstance.mX,
- &sInstance.mY,
- &sInstance.mZ))
- {
- sInstance.mParseState = PARSE_OK;
- }
- else
- {
- sInstance.mParseState = PARSE_FAIL;
- }
- }
- return (sInstance.mParseState == PARSE_OK);
- }
- // static
- bool LLURLSimString::parse(const std::string& sim_string,
- std::string *region_name,
- S32 *x, S32 *y, S32 *z)
- {
- // strip any bogus initial '/'
- std::string::size_type idx0 = sim_string.find_first_not_of('/');
- if (idx0 == std::string::npos) idx0 = 0;
- std::string::size_type idx1 = sim_string.find_first_of('/', idx0);
- std::string::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
- std::string tstring = sim_string.substr(idx0,len);
- *region_name = unescapeRegionName(tstring);
- if (!region_name->empty())
- {
- // return position data if found. otherwise leave passed-in values alone. (DEV-18380) -MG
- if (idx1 != std::string::npos)
- {
- std::string::size_type xs = *x, ys = *y, zs = *z;
- idx1 = parseGridIdx(sim_string, idx1, &xs);
- idx1 = parseGridIdx(sim_string, idx1, &ys);
- idx1 = parseGridIdx(sim_string, idx1, &zs);
- *x = xs;
- *y = ys;
- *z = zs;
- }
-
- return true;
- }
- else
- {
- return false;
- }
- }
- // static
- std::string LLURLSimString::getURL()
- {
- std::string url;
- if (sInstance.mParseState == PARSE_OK)
- {
- url = llformat("secondlife://%s/%d/%d/%d/",
- sInstance.mSimName.c_str(),
- sInstance.mX,
- sInstance.mY,
- sInstance.mZ);
- }
- return url;
- }
- // static
- std::string LLURLSimString::unescapeRegionName(std::string region_name)
- {
- std::string result;
- char* curlstr = curl_unescape(region_name.c_str(), region_name.size());
- result = std::string(curlstr);
- curl_free(curlstr);
- return result;
- }