Files
SingularityViewer/indra/newview/llurlsimstring.cpp
Aleric Inglewood 5caeccc007 Final compile/link bug fixes for debug_libcurl code.
renamed cwdebug/debug_libcurl.cc -> llmessage/debug_libcurl.cpp
    and cwdebug/debug_libcurl.h  -> llmessage/debug_libcurl.h,
because debug_libcurl.cpp does curl calls that do ares and
openssl calls, so we need to link with those libraries.
llmessage is already linking with those libraries, and contains
the main entry point aicurl.h, so it's a suitable place to put
this.

Bug fix: must always include llpreprocessor.h before including
curl/curl.h.

Bug fix: Added #include "debug_libcurl.h" to hipporestrequest.cpp
and llurlsimstring.cpp which I missed before because they
included "curl/curl.h" instead of <curl/curl.h>. Same in
llwaterparammanager.cpp, but removed include there because it
isn't needed.

Now test DEBUG_CURLIO before including debug_curlio, that
seems better, because otherwise it would make more sense to
replace all #include <curl/curl.h> with #include "mycurl.h"
and then do it there-- but I didn't want to do that.

Bug fix: we undef-ed CURLOPT_DNS_USE_GLOBAL_CACHE, while really
that is an enum, not a macro.

Fixed DEBUG_WINDOWS_CODE_ON_LINUX again by adding a hack for
ioctlsocket(), not instantiating dumb_socketpair unless
DEBUG_WINDOWS_CODE_ON_LINUX is defined and removing again ^M's
introduced with the new windows non-blocking code.
Also changed the type of flags passed to fcntl to int (was long).
2012-08-07 20:57:39 +02:00

185 lines
5.1 KiB
C++

/**
* @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-2009, 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> // curl_unescape, curl_free
#ifdef DEBUG_CURLIO
#include "debug_libcurl.h"
#endif
//static
LLURLSimString LLURLSimString::sInstance;
std::string LLURLSimString::sLocationStringHome("My Home");
std::string LLURLSimString::sLocationStringLast("My Last Location");
// "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 == sLocationStringHome)
{
gSavedSettings.setBOOL("LoginLastLocation", FALSE);
}
else if (sim_string == sLocationStringLast)
{
gSavedSettings.setBOOL("LoginLastLocation", TRUE);
}
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);
}
}
// "/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;
}