llurlsimstring.cpp

Go to the documentation of this file.
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 //static
00043 LLURLSimString LLURLSimString::sInstance;
00044 LLString LLURLSimString::sLocationStringHome("My Home");
00045 LLString LLURLSimString::sLocationStringLast("My Last Location");
00046 
00047 // "secondlife://simname/x/y/z" -> "simname/x/y/z"
00048 // (actually .*//foo -> foo)
00049 // static
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 // "/100" -> 100
00075 // static
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; // parse error
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 // "simname/x/y/z" -> mSimName = simname, mX = x, mY = y, mZ = z
00095 // static
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 // static
00121 bool LLURLSimString::parse(const LLString& sim_string, std::string *region_name, S32 *x, S32 *y, S32 *z)
00122 {
00123          // strip any bogus initial '/'
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 // static
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 // static
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 }

Generated on Fri May 16 08:34:08 2008 for SecondLife by  doxygen 1.5.5