00001
00033 #include "llviewerprecompiledheaders.h"
00034
00035 #include "llurlsimstring.h"
00036
00037 #include "llpanellogin.h"
00038 #include "llviewercontrol.h"
00039
00040 #include "curl/curl.h"
00041
00042
00043 LLURLSimString LLURLSimString::sInstance;
00044 LLString LLURLSimString::sLocationStringHome("My Home");
00045 LLString LLURLSimString::sLocationStringLast("My Last Location");
00046
00047
00048
00049
00050 void LLURLSimString::setString(const LLString& sim_string)
00051 {
00052 sInstance.mSimString.clear();
00053 sInstance.mSimName.clear();
00054 sInstance.mParseState = NOT_PARSED;
00055 if (sim_string == sLocationStringHome)
00056 {
00057 gSavedSettings.setBOOL("LoginLastLocation", FALSE);
00058 }
00059 else if (sim_string == sLocationStringLast)
00060 {
00061 gSavedSettings.setBOOL("LoginLastLocation", TRUE);
00062 }
00063 else
00064 {
00065 char* curlstr = curl_unescape(sim_string.c_str(), sim_string.size());
00066 LLString tstring = LLString(curlstr);
00067 curl_free(curlstr);
00068 std::string::size_type idx = tstring.find("//");
00069 idx = (idx == LLString::npos) ? 0 : idx+2;
00070 sInstance.mSimString = tstring.substr(idx);
00071 }
00072 }
00073
00074
00075
00076 S32 LLURLSimString::parseGridIdx(const LLString& in_string, S32 idx0, S32* res)
00077 {
00078 if (idx0 == LLString::npos || in_string[idx0] != '/')
00079 {
00080 return (S32)LLString::npos;
00081 }
00082 idx0++;
00083 LLString::size_type idx1 = in_string.find_first_of('/', idx0);
00084 LLString::size_type len = (idx1 == LLString::npos) ? LLString::npos : idx1-idx0;
00085 LLString tstring = in_string.substr(idx0,len);
00086 if (!tstring.empty())
00087 {
00088 S32 val = atoi(tstring.c_str());
00089 *res = val;
00090 }
00091 return idx1;
00092 }
00093
00094
00095
00096 bool LLURLSimString::parse()
00097 {
00098 if (sInstance.mParseState == NOT_SET)
00099 {
00100 return false;
00101 }
00102 if (sInstance.mParseState == NOT_PARSED)
00103 {
00104 if (parse(sInstance.mSimString,
00105 &sInstance.mSimName,
00106 &sInstance.mX,
00107 &sInstance.mY,
00108 &sInstance.mZ))
00109 {
00110 sInstance.mParseState = PARSE_OK;
00111 }
00112 else
00113 {
00114 sInstance.mParseState = PARSE_FAIL;
00115 }
00116 }
00117 return (sInstance.mParseState == PARSE_OK);
00118 }
00119
00120
00121 bool LLURLSimString::parse(const LLString& sim_string, std::string *region_name, S32 *x, S32 *y, S32 *z)
00122 {
00123
00124 LLString::size_type idx0 = sim_string.find_first_not_of('/');
00125 if (idx0 == std::string::npos) idx0 = 0;
00126
00127 LLString::size_type idx1 = sim_string.find_first_of('/', idx0);
00128 LLString::size_type len = (idx1 == std::string::npos) ? std::string::npos : idx1-idx0;
00129 LLString tstring = sim_string.substr(idx0,len);
00130 *region_name = unescapeRegionName(tstring);
00131 if (!region_name->empty())
00132 {
00133 if (idx1 != std::string::npos)
00134 {
00135 idx1 = parseGridIdx(sim_string, idx1, x);
00136 idx1 = parseGridIdx(sim_string, idx1, y);
00137 idx1 = parseGridIdx(sim_string, idx1, z);
00138 }
00139 return true;
00140 }
00141 else
00142 {
00143 return false;
00144 }
00145 }
00146
00147
00148 std::string LLURLSimString::getURL()
00149 {
00150 std::string url;
00151 if (sInstance.mParseState == PARSE_OK)
00152 {
00153 url = llformat("secondlife://%s/%d/%d/%d/",
00154 sInstance.mSimName.c_str(),
00155 sInstance.mX,
00156 sInstance.mY,
00157 sInstance.mZ);
00158 }
00159 return url;
00160 }
00161
00162
00163 std::string LLURLSimString::unescapeRegionName(std::string region_name)
00164 {
00165 std::string result;
00166 char* curlstr = curl_unescape(region_name.c_str(), region_name.size());
00167 result = std::string(curlstr);
00168 curl_free(curlstr);
00169 return result;
00170 }